Setup periodic scan background runner
This commit is contained in:
parent
167ff4b8c4
commit
05380354e3
|
@ -2,6 +2,7 @@ package resolvers
|
|||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/viktorstrate/photoview/api/graphql/models"
|
||||
|
@ -57,5 +58,7 @@ func (r *mutationResolver) SetPeriodicScanInterval(ctx context.Context, interval
|
|||
return 0, err
|
||||
}
|
||||
|
||||
scanner.ChangePeriodicScanInterval(time.Duration(dbInterval) * time.Second)
|
||||
|
||||
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.InitializePeriodicScanner(db)
|
||||
|
||||
rootRouter := mux.NewRouter()
|
||||
|
||||
|
|
|
@ -75,7 +75,10 @@ const convertToAppropriateUnit = ({ value, unit }) => {
|
|||
|
||||
let resultingUnit = timeUnits.first
|
||||
for (const unit of timeUnits) {
|
||||
if (seconds / unit.multiplier >= 1) {
|
||||
if (
|
||||
seconds / unit.multiplier >= 1 &&
|
||||
(seconds / unit.multiplier) % 1 == 0
|
||||
) {
|
||||
resultingUnit = unit
|
||||
} else {
|
||||
break
|
||||
|
|
Loading…
Reference in New Issue