1
Fork 0

Setup periodic scan background runner

This commit is contained in:
viktorstrate 2020-09-21 12:34:56 +02:00
parent 167ff4b8c4
commit 05380354e3
4 changed files with 98 additions and 1 deletions

View File

@ -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
}

View File

@ -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")
}
}
}

View File

@ -42,6 +42,7 @@ func main() {
}
scanner.InitializeScannerQueue(db)
scanner.InitializePeriodicScanner(db)
rootRouter := mux.NewRouter()

View File

@ -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