Skip to content

Commit 180872a

Browse files
committed
refactor
Signed-off-by: Rueian <[email protected]>
1 parent d9d2fb0 commit 180872a

File tree

1 file changed

+32
-25
lines changed

1 file changed

+32
-25
lines changed

cache.go

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func (a *adapter) Update(key, cmd string, val RedisMessage) (sxat int64) {
101101
val.setExpireAt(sxat)
102102
}
103103
a.store.Set(key+cmd, val)
104-
flight.set(val, nil)
104+
flight.setVal(val)
105105
entries[cmd] = nil
106106
}
107107
a.mu.Unlock()
@@ -112,7 +112,7 @@ func (a *adapter) Cancel(key, cmd string, err error) {
112112
a.mu.Lock()
113113
entries := a.flights[key]
114114
if flight, ok := entries[cmd].(*adapterEntry); ok {
115-
flight.set(RedisMessage{}, err)
115+
flight.setErr(err)
116116
entries[cmd] = nil
117117
}
118118
a.mu.Unlock()
@@ -154,7 +154,7 @@ func (a *adapter) Close(err error) {
154154
for _, entries := range flights {
155155
for _, e := range entries {
156156
if e != nil {
157-
e.(*adapterEntry).set(RedisMessage{}, err)
157+
e.(*adapterEntry).setErr(err)
158158
}
159159
}
160160
}
@@ -167,8 +167,13 @@ type adapterEntry struct {
167167
xat int64
168168
}
169169

170-
func (a *adapterEntry) set(val RedisMessage, err error) {
171-
a.err, a.val = err, val
170+
func (a *adapterEntry) setVal(val RedisMessage) {
171+
a.val = val
172+
close(a.ch)
173+
}
174+
175+
func (a *adapterEntry) setErr(err error) {
176+
a.err = err
172177
close(a.ch)
173178
}
174179

@@ -202,27 +207,27 @@ type flatentry struct {
202207
func (f *flatentry) insert(e *flatentry) {
203208
f.size += e.size
204209
f.mu.Lock()
205-
defer f.mu.Unlock()
206210
e.ovfl = f.ovfl
207211
f.ovfl = e
212+
f.mu.Unlock()
208213
}
209214

210215
func (f *flatentry) find(cmd string, ts int64) (ret RedisMessage, expired bool) {
211-
if f == nil {
212-
return
213-
}
214-
if ts >= f.ttl {
215-
expired = true
216-
return
217-
}
218-
if cmd == f.cmd {
219-
_ = ret.CacheUnmarshalView(f.val)
220-
return
216+
for next := f; next != nil; {
217+
if ts >= next.ttl {
218+
expired = true
219+
return
220+
}
221+
if cmd == next.cmd {
222+
_ = ret.CacheUnmarshalView(next.val)
223+
return
224+
}
225+
next.mu.RLock()
226+
ovfl := next.ovfl
227+
next.mu.RUnlock()
228+
next = ovfl
221229
}
222-
f.mu.RLock()
223-
ovfl := f.ovfl
224-
f.mu.RUnlock()
225-
return ovfl.find(cmd, ts)
230+
return
226231
}
227232

228233
const lrBatchSize = 64
@@ -246,7 +251,9 @@ func NewFlattenCache(limit int) CacheStore {
246251
f.lrup = sync.Pool{New: func() any {
247252
b := &lrBatch{m: make(map[*flatentry]struct{}, lrBatchSize)}
248253
runtime.SetFinalizer(b, func(b *lrBatch) {
254+
f.mu.Lock()
249255
f.llTailBatch(b)
256+
f.mu.Unlock()
250257
})
251258
return b
252259
}}
@@ -287,11 +294,9 @@ func (f *flatten) llTail(e *flatentry) {
287294
}
288295

289296
func (f *flatten) llTailBatch(b *lrBatch) {
290-
f.mu.Lock()
291297
for e := range b.m {
292298
f.llTail(e)
293299
}
294-
f.mu.Unlock()
295300
clear(b.m)
296301
}
297302

@@ -310,7 +315,9 @@ func (f *flatten) Flight(key, cmd string, ttl time.Duration, now time.Time) (Red
310315
batch := f.lrup.Get().(*lrBatch)
311316
batch.m[e] = struct{}{}
312317
if len(batch.m) == lrBatchSize {
318+
f.mu.Lock()
313319
f.llTailBatch(batch)
320+
f.mu.Unlock()
314321
}
315322
f.lrup.Put(batch)
316323
return v, nil
@@ -373,7 +380,7 @@ func (f *flatten) Update(key, cmd string, val RedisMessage) (sxat int64) {
373380
}
374381
}
375382
f.mu.Unlock()
376-
af.set(val, nil)
383+
af.setVal(val)
377384
}
378385
return sxat
379386
}
@@ -384,7 +391,7 @@ func (f *flatten) Cancel(key, cmd string, err error) {
384391
defer f.mu.Unlock()
385392
if af := f.flights[fk]; af != nil {
386393
delete(f.flights, fk)
387-
af.set(RedisMessage{}, err)
394+
af.setErr(err)
388395
}
389396
}
390397

@@ -416,6 +423,6 @@ func (f *flatten) Close(err error) {
416423
f.mark++
417424
f.mu.Unlock()
418425
for _, entry := range flights {
419-
entry.set(RedisMessage{}, err)
426+
entry.setErr(err)
420427
}
421428
}

0 commit comments

Comments
 (0)