Skip to content

Commit e0058ca

Browse files
committed
Fix fakeip unsaved state
1 parent 8140af0 commit e0058ca

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed

experimental/clashapi/cachefile/cache.go

+14-7
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ var bucketSelected = []byte("selected")
1717
var _ adapter.ClashCacheFile = (*CacheFile)(nil)
1818

1919
type CacheFile struct {
20-
DB *bbolt.DB
21-
cacheID []byte
22-
saveAccess sync.RWMutex
23-
saveCache map[netip.Addr]string
20+
DB *bbolt.DB
21+
cacheID []byte
22+
saveAccess sync.RWMutex
23+
saveDomain map[netip.Addr]string
24+
saveAddress4 map[string]netip.Addr
25+
saveAddress6 map[string]netip.Addr
2426
}
2527

2628
func Open(path string, cacheID string) (*CacheFile, error) {
@@ -53,10 +55,15 @@ func Open(path string, cacheID string) (*CacheFile, error) {
5355
return nil
5456
})
5557
})
58+
if err != nil {
59+
return nil, err
60+
}
5661
return &CacheFile{
57-
DB: db,
58-
cacheID: cacheIDBytes,
59-
saveCache: make(map[netip.Addr]string),
62+
DB: db,
63+
cacheID: cacheIDBytes,
64+
saveDomain: make(map[netip.Addr]string),
65+
saveAddress4: make(map[string]netip.Addr),
66+
saveAddress6: make(map[string]netip.Addr),
6067
}, nil
6168
}
6269

experimental/clashapi/cachefile/fakeip.go

+32-4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ var (
2222

2323
func (c *CacheFile) FakeIPMetadata() *adapter.FakeIPMetadata {
2424
var metadata adapter.FakeIPMetadata
25-
err := c.DB.View(func(tx *bbolt.Tx) error {
25+
err := c.DB.Batch(func(tx *bbolt.Tx) error {
2626
bucket := tx.Bucket(bucketFakeIP)
2727
if bucket == nil {
2828
return nil
@@ -31,6 +31,10 @@ func (c *CacheFile) FakeIPMetadata() *adapter.FakeIPMetadata {
3131
if len(metadataBinary) == 0 {
3232
return os.ErrInvalid
3333
}
34+
err := bucket.Delete(keyMetadata)
35+
if err != nil {
36+
return err
37+
}
3438
return metadata.UnmarshalBinary(metadataBinary)
3539
})
3640
if err != nil {
@@ -77,22 +81,32 @@ func (c *CacheFile) FakeIPStore(address netip.Addr, domain string) error {
7781

7882
func (c *CacheFile) FakeIPStoreAsync(address netip.Addr, domain string, logger logger.Logger) {
7983
c.saveAccess.Lock()
80-
c.saveCache[address] = domain
84+
c.saveDomain[address] = domain
85+
if address.Is4() {
86+
c.saveAddress4[domain] = address
87+
} else {
88+
c.saveAddress6[domain] = address
89+
}
8190
c.saveAccess.Unlock()
8291
go func() {
8392
err := c.FakeIPStore(address, domain)
8493
if err != nil {
8594
logger.Warn("save FakeIP address pair: ", err)
8695
}
8796
c.saveAccess.Lock()
88-
delete(c.saveCache, address)
97+
delete(c.saveDomain, address)
98+
if address.Is4() {
99+
delete(c.saveAddress4, domain)
100+
} else {
101+
delete(c.saveAddress6, domain)
102+
}
89103
c.saveAccess.Unlock()
90104
}()
91105
}
92106

93107
func (c *CacheFile) FakeIPLoad(address netip.Addr) (string, bool) {
94108
c.saveAccess.RLock()
95-
cachedDomain, cached := c.saveCache[address]
109+
cachedDomain, cached := c.saveDomain[address]
96110
c.saveAccess.RUnlock()
97111
if cached {
98112
return cachedDomain, true
@@ -110,6 +124,20 @@ func (c *CacheFile) FakeIPLoad(address netip.Addr) (string, bool) {
110124
}
111125

112126
func (c *CacheFile) FakeIPLoadDomain(domain string, isIPv6 bool) (netip.Addr, bool) {
127+
var (
128+
cachedAddress netip.Addr
129+
cached bool
130+
)
131+
c.saveAccess.RLock()
132+
if !isIPv6 {
133+
cachedAddress, cached = c.saveAddress4[domain]
134+
} else {
135+
cachedAddress, cached = c.saveAddress6[domain]
136+
}
137+
c.saveAccess.RUnlock()
138+
if cached {
139+
return cachedAddress, true
140+
}
113141
var address netip.Addr
114142
_ = c.DB.View(func(tx *bbolt.Tx) error {
115143
var bucket *bbolt.Bucket

0 commit comments

Comments
 (0)