Add new scanner algorithm, can be enabled with DevNewScanner config option
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package scanner
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/deluan/navidrome/log"
|
||||
)
|
||||
|
||||
const (
|
||||
// batchSize used for albums/artists updates
|
||||
batchSize = 5
|
||||
)
|
||||
|
||||
type refreshCallbackFunc = func(ids ...string) error
|
||||
|
||||
type flushableMap struct {
|
||||
ctx context.Context
|
||||
flushFunc refreshCallbackFunc
|
||||
entity string
|
||||
m map[string]struct{}
|
||||
}
|
||||
|
||||
func newFlushableMap(ctx context.Context, entity string, flushFunc refreshCallbackFunc) *flushableMap {
|
||||
return &flushableMap{
|
||||
ctx: ctx,
|
||||
flushFunc: flushFunc,
|
||||
entity: entity,
|
||||
m: map[string]struct{}{},
|
||||
}
|
||||
}
|
||||
|
||||
func (f *flushableMap) update(id string) error {
|
||||
f.m[id] = struct{}{}
|
||||
if len(f.m) >= batchSize {
|
||||
err := f.flush()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *flushableMap) flush() error {
|
||||
if len(f.m) == 0 {
|
||||
return nil
|
||||
}
|
||||
var ids []string
|
||||
for id := range f.m {
|
||||
ids = append(ids, id)
|
||||
delete(f.m, id)
|
||||
}
|
||||
if err := f.flushFunc(ids...); err != nil {
|
||||
log.Error(f.ctx, fmt.Sprintf("Error writing %ss to the DB", f.entity), err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user