diff --git a/experimental/cachefile/cache.go b/experimental/cachefile/cache.go index e52dd3ed..2a312fb7 100644 --- a/experimental/cachefile/cache.go +++ b/experimental/cachefile/cache.go @@ -38,21 +38,23 @@ var ( var _ adapter.CacheFile = (*CacheFile)(nil) type CacheFile struct { - ctx context.Context - path string - cacheID []byte - storeFakeIP bool - storeRDRC bool - rdrcTimeout time.Duration - DB *bbolt.DB - resetAccess sync.Mutex - saveMetadataTimer *time.Timer - saveFakeIPAccess sync.RWMutex - saveDomain map[netip.Addr]string - saveAddress4 map[string]netip.Addr - saveAddress6 map[string]netip.Addr - saveRDRCAccess sync.RWMutex - saveRDRC map[saveRDRCCacheKey]bool + ctx context.Context + path string + cacheID []byte + storeFakeIP bool + storeRDRC bool + rdrcTimeout time.Duration + DB *bbolt.DB + resetAccess sync.Mutex + saveMetadataAccess sync.Mutex + saveMetadata *adapter.FakeIPMetadata + saveMetadataTimer *time.Timer + saveFakeIPAccess sync.RWMutex + saveDomain map[netip.Addr]string + saveAddress4 map[string]netip.Addr + saveAddress6 map[string]netip.Addr + saveRDRCAccess sync.RWMutex + saveRDRC map[saveRDRCCacheKey]bool } type saveRDRCCacheKey struct { diff --git a/experimental/cachefile/fakeip.go b/experimental/cachefile/fakeip.go index 7a4bd384..0eff2ebe 100644 --- a/experimental/cachefile/fakeip.go +++ b/experimental/cachefile/fakeip.go @@ -59,9 +59,17 @@ func (c *CacheFile) FakeIPSaveMetadata(metadata *adapter.FakeIPMetadata) error { } func (c *CacheFile) FakeIPSaveMetadataAsync(metadata *adapter.FakeIPMetadata) { + c.saveMetadataAccess.Lock() + defer c.saveMetadataAccess.Unlock() + c.saveMetadata = metadata if c.saveMetadataTimer == nil { c.saveMetadataTimer = time.AfterFunc(C.FakeIPMetadataSaveInterval, func() { - _ = c.FakeIPSaveMetadata(metadata) + c.saveMetadataAccess.Lock() + savedMetadata := c.saveMetadata + c.saveMetadataAccess.Unlock() + if savedMetadata != nil { + _ = c.FakeIPSaveMetadata(savedMetadata) + } }) } else { c.saveMetadataTimer.Reset(C.FakeIPMetadataSaveInterval)