22
22
23
23
func (c * CacheFile ) FakeIPMetadata () * adapter.FakeIPMetadata {
24
24
var metadata adapter.FakeIPMetadata
25
- err := c .DB .View (func (tx * bbolt.Tx ) error {
25
+ err := c .DB .Batch (func (tx * bbolt.Tx ) error {
26
26
bucket := tx .Bucket (bucketFakeIP )
27
27
if bucket == nil {
28
28
return nil
@@ -31,6 +31,10 @@ func (c *CacheFile) FakeIPMetadata() *adapter.FakeIPMetadata {
31
31
if len (metadataBinary ) == 0 {
32
32
return os .ErrInvalid
33
33
}
34
+ err := bucket .Delete (keyMetadata )
35
+ if err != nil {
36
+ return err
37
+ }
34
38
return metadata .UnmarshalBinary (metadataBinary )
35
39
})
36
40
if err != nil {
@@ -77,22 +81,32 @@ func (c *CacheFile) FakeIPStore(address netip.Addr, domain string) error {
77
81
78
82
func (c * CacheFile ) FakeIPStoreAsync (address netip.Addr , domain string , logger logger.Logger ) {
79
83
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
+ }
81
90
c .saveAccess .Unlock ()
82
91
go func () {
83
92
err := c .FakeIPStore (address , domain )
84
93
if err != nil {
85
94
logger .Warn ("save FakeIP address pair: " , err )
86
95
}
87
96
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
+ }
89
103
c .saveAccess .Unlock ()
90
104
}()
91
105
}
92
106
93
107
func (c * CacheFile ) FakeIPLoad (address netip.Addr ) (string , bool ) {
94
108
c .saveAccess .RLock ()
95
- cachedDomain , cached := c .saveCache [address ]
109
+ cachedDomain , cached := c .saveDomain [address ]
96
110
c .saveAccess .RUnlock ()
97
111
if cached {
98
112
return cachedDomain , true
@@ -110,6 +124,20 @@ func (c *CacheFile) FakeIPLoad(address netip.Addr) (string, bool) {
110
124
}
111
125
112
126
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
+ }
113
141
var address netip.Addr
114
142
_ = c .DB .View (func (tx * bbolt.Tx ) error {
115
143
var bucket * bbolt.Bucket
0 commit comments