@@ -350,24 +350,28 @@ func (b *bucket) Del(h uint64) {
350350
351351func (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