Skip to content

Commit d3feedc

Browse files
Skip overwritten entries.
1 parent 7dde60b commit d3feedc

1 file changed

Lines changed: 18 additions & 14 deletions

File tree

fastcache.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -350,24 +350,28 @@ func (b *bucket) Del(h uint64) {
350350

351351
func (b *bucket) VisitAllEntries(f func(k, v []byte) error) error {
352352
b.mu.RLock()
353-
for _, idx := range b.m {
354-
idx &= (1 << bucketSizeBits) - 1
355-
chunkIdx := idx / chunkSize
356-
chunk := b.chunks[chunkIdx]
353+
for _, v := range b.m {
354+
idx := v & ((1 << bucketSizeBits) - 1)
355+
gen := v >> bucketSizeBits
356+
357+
if gen == b.gen && idx < b.idx || gen+1 == b.gen && idx >= b.idx {
358+
chunkIdx := idx / chunkSize
359+
chunk := b.chunks[chunkIdx]
357360

358-
kvLenBuf := chunk[idx : idx+4]
359-
keyLen := (uint64(kvLenBuf[0]) << 8) | uint64(kvLenBuf[1])
360-
valLen := (uint64(kvLenBuf[2]) << 8) | uint64(kvLenBuf[3])
361+
kvLenBuf := chunk[idx : idx+4]
362+
keyLen := (uint64(kvLenBuf[0]) << 8) | uint64(kvLenBuf[1])
363+
valLen := (uint64(kvLenBuf[2]) << 8) | uint64(kvLenBuf[3])
361364

362-
idx += 4
363-
key := chunk[idx : idx+keyLen : idx+keyLen]
365+
idx += 4
366+
key := chunk[idx : idx+keyLen : idx+keyLen]
364367

365-
idx += keyLen
366-
value := chunk[idx : idx+valLen : idx+valLen]
368+
idx += keyLen
369+
value := chunk[idx : idx+valLen : idx+valLen]
367370

368-
if err := f(key, value); err != nil {
369-
b.mu.RUnlock()
370-
return err
371+
if err := f(key, value); err != nil {
372+
b.mu.RUnlock()
373+
return err
374+
}
371375
}
372376
}
373377
b.mu.RUnlock()

0 commit comments

Comments
 (0)