diff --git a/service/intel/filterlists/database.go b/service/intel/filterlists/database.go index 296ac347..f3dc6c95 100644 --- a/service/intel/filterlists/database.go +++ b/service/intel/filterlists/database.go @@ -118,14 +118,6 @@ func processListFile(ctx context.Context, filter *scopedBloom, file *updates.Art return }) - // Wait for the module initialization to complete to ensure the filter is fully loaded. - // This avoids prolonged locks during filter updates caused by concurrent database loading. - select { - case <-moduleInitDone: - case <-time.After(time.Second * 20): - log.Warning("intel/filterlists: timeout waiting for module initialization") - } - // Process each entry and send records to records channel. startSafe(func() error { defer close(records) diff --git a/service/intel/filterlists/module.go b/service/intel/filterlists/module.go index f2780e5f..7cc337c5 100644 --- a/service/intel/filterlists/module.go +++ b/service/intel/filterlists/module.go @@ -35,9 +35,6 @@ func (fl *FilterLists) States() *mgr.StateMgr { } func (fl *FilterLists) Start() error { - if err := prep(); err != nil { - return err - } return start() } @@ -46,26 +43,21 @@ func (fl *FilterLists) Stop() error { } var ( - moduleInitDone chan struct{} - // booleans mainly used to decouple the module during testing. ignoreUpdateEvents = abool.New() ignoreNetEnvEvents = abool.New() ) func init() { - moduleInitDone = make(chan struct{}) - ignoreNetEnvEvents.Set() } -func prep() error { +func registerEventCallbacks() { module.instance.IntelUpdates().EventResourcesUpdated.AddCallback("Check for blocklist updates", func(wc *mgr.WorkerCtx, s struct{}) (bool, error) { if ignoreUpdateEvents.IsSet() { return false, nil } - log.Debugf("performing filter list update") return false, tryListUpdate(wc.Ctx()) }) @@ -82,17 +74,26 @@ func prep() error { return false, tryListUpdate(wc.Ctx()) }) - - return nil } func start() error { filterListLock.Lock() defer filterListLock.Unlock() - // Signal that the module has been initialized. - // This indicates that the module is ready for use, with the default filter - defer close(moduleInitDone) + // Any call of tryListUpdate() must be only after module fully initialized + defer func() { + // Register event callbacks + registerEventCallbacks() + + // Initial check filterlists updates + module.Manager().Go("intel/filterlists initial check for update", func(ctx *mgr.WorkerCtx) error { + if err := tryListUpdate(ctx.Ctx()); err != nil { + log.Errorf("intel/filterlists: tryListUpdate() failed: %q", err.Error()) + return err + } + return nil + }) + }() ver, err := getCacheDatabaseVersion() if err == nil { @@ -115,7 +116,6 @@ func start() error { } func stop() error { - moduleInitDone = make(chan struct{}) filterListsLoaded = make(chan struct{}) return nil }