Merge pull request #1990 from safing/fix/1988-redundant-filterlists-update

fix: Unnecessary filterlists database update on service start
This commit is contained in:
Alexandr Stelnykovych
2025-09-03 13:46:43 +03:00
committed by GitHub
2 changed files with 15 additions and 23 deletions

View File

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

View File

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