Setup periodic scan background runner
This commit is contained in:
parent
167ff4b8c4
commit
05380354e3
|
@ -2,6 +2,7 @@ package resolvers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/viktorstrate/photoview/api/graphql/models"
|
"github.com/viktorstrate/photoview/api/graphql/models"
|
||||||
|
@ -57,5 +58,7 @@ func (r *mutationResolver) SetPeriodicScanInterval(ctx context.Context, interval
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scanner.ChangePeriodicScanInterval(time.Duration(dbInterval) * time.Second)
|
||||||
|
|
||||||
return dbInterval, nil
|
return dbInterval, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
package scanner
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"log"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type periodicScanner struct {
|
||||||
|
ticker *time.Ticker
|
||||||
|
ticker_changed chan bool
|
||||||
|
mutex *sync.Mutex
|
||||||
|
db *sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
var mainPeriodicScanner *periodicScanner = nil
|
||||||
|
|
||||||
|
func getPeriodicScanInterval(db *sql.DB) (time.Duration, error) {
|
||||||
|
row := db.QueryRow("SELECT periodic_scan_interval FROM site_info")
|
||||||
|
var intervalSeconds int
|
||||||
|
|
||||||
|
if err := row.Scan(&intervalSeconds); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return time.Duration(intervalSeconds) * time.Second, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitializePeriodicScanner(db *sql.DB) error {
|
||||||
|
if mainPeriodicScanner != nil {
|
||||||
|
panic("periodic scanner has already been initialized")
|
||||||
|
}
|
||||||
|
|
||||||
|
scanInterval, err := getPeriodicScanInterval(db)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mainPeriodicScanner = &periodicScanner{
|
||||||
|
db: db,
|
||||||
|
ticker_changed: make(chan bool),
|
||||||
|
mutex: &sync.Mutex{},
|
||||||
|
}
|
||||||
|
|
||||||
|
go scanIntervalRunner()
|
||||||
|
|
||||||
|
ChangePeriodicScanInterval(scanInterval)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ChangePeriodicScanInterval(duration time.Duration) {
|
||||||
|
var new_ticker *time.Ticker = nil
|
||||||
|
if duration > 0 {
|
||||||
|
new_ticker = time.NewTicker(duration)
|
||||||
|
log.Printf("Periodic scan interval changed: %s", duration.String())
|
||||||
|
} else {
|
||||||
|
log.Print("Periodic scan interval changed: disabled")
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
mainPeriodicScanner.mutex.Lock()
|
||||||
|
defer mainPeriodicScanner.mutex.Unlock()
|
||||||
|
|
||||||
|
if mainPeriodicScanner.ticker != nil {
|
||||||
|
mainPeriodicScanner.ticker.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
mainPeriodicScanner.ticker = new_ticker
|
||||||
|
mainPeriodicScanner.ticker_changed <- true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func scanIntervalRunner() {
|
||||||
|
for {
|
||||||
|
log.Print("Scan interval runner: Waiting for signal")
|
||||||
|
if mainPeriodicScanner.ticker != nil {
|
||||||
|
select {
|
||||||
|
case <-mainPeriodicScanner.ticker_changed:
|
||||||
|
log.Print("Scan interval runner: New ticker detected")
|
||||||
|
case <-mainPeriodicScanner.ticker.C:
|
||||||
|
log.Print("Scan interval runner: Starting periodic scan")
|
||||||
|
AddAllToQueue()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
<-mainPeriodicScanner.ticker_changed
|
||||||
|
log.Print("Scan interval runner: New ticker detected")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,6 +42,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
scanner.InitializeScannerQueue(db)
|
scanner.InitializeScannerQueue(db)
|
||||||
|
scanner.InitializePeriodicScanner(db)
|
||||||
|
|
||||||
rootRouter := mux.NewRouter()
|
rootRouter := mux.NewRouter()
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,10 @@ const convertToAppropriateUnit = ({ value, unit }) => {
|
||||||
|
|
||||||
let resultingUnit = timeUnits.first
|
let resultingUnit = timeUnits.first
|
||||||
for (const unit of timeUnits) {
|
for (const unit of timeUnits) {
|
||||||
if (seconds / unit.multiplier >= 1) {
|
if (
|
||||||
|
seconds / unit.multiplier >= 1 &&
|
||||||
|
(seconds / unit.multiplier) % 1 == 0
|
||||||
|
) {
|
||||||
resultingUnit = unit
|
resultingUnit = unit
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
|
|
Loading…
Reference in New Issue