From efbd84276cf0f210743ee63d11127d98f559482e Mon Sep 17 00:00:00 2001 From: Sway Chan Date: Mon, 10 Aug 2026 18:42:27 +0800 Subject: [PATCH] Fix FakeIP metadata async save Co-authored-by: Sway-Chan --- experimental/cachefile/cache.go | 32 +++++++++++++++++--------------- experimental/cachefile/fakeip.go | 10 +++++++++- 2 files changed, 26 insertions(+), 16 deletions(-) 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)