Browse Source

fix: compact_map get error mismatching cokie (#3748)

* fix: compact_map get error

* fix: CompactSection delete lock and move test to compact_map

Co-authored-by: shibinbin <shibinbin@megvii.com>
pull/3813/head
binbinshi 2 years ago
committed by GitHub
parent
commit
b7de4a967e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      weed/storage/needle_map/compact_map.go
  2. 39
      weed/storage/needle_map/compact_map_test.go

14
weed/storage/needle_map/compact_map.go

@ -144,9 +144,13 @@ func (cs *CompactSection) deleteOverflowEntry(key SectionalNeedleId) {
// return old entry size // return old entry size
func (cs *CompactSection) Delete(key NeedleId) Size { func (cs *CompactSection) Delete(key NeedleId) Size {
skey := SectionalNeedleId(key - cs.start)
cs.Lock() cs.Lock()
defer cs.Unlock()
ret := Size(0) ret := Size(0)
if key > cs.end {
return ret
}
skey := SectionalNeedleId(key - cs.start)
if i := cs.binarySearchValues(skey); i >= 0 { if i := cs.binarySearchValues(skey); i >= 0 {
if cs.values[i].Size > 0 && cs.values[i].Size.IsValid() { if cs.values[i].Size > 0 && cs.values[i].Size.IsValid() {
ret = cs.values[i].Size ret = cs.values[i].Size
@ -157,23 +161,23 @@ func (cs *CompactSection) Delete(key NeedleId) Size {
cs.deleteOverflowEntry(skey) cs.deleteOverflowEntry(skey)
ret = v.Size ret = v.Size
} }
cs.Unlock()
return ret return ret
} }
func (cs *CompactSection) Get(key NeedleId) (*NeedleValue, bool) { func (cs *CompactSection) Get(key NeedleId) (*NeedleValue, bool) {
cs.RLock() cs.RLock()
defer cs.RUnlock()
if key > cs.end {
return nil, false
}
skey := SectionalNeedleId(key - cs.start) skey := SectionalNeedleId(key - cs.start)
if ve, v, ok := cs.findOverflowEntry(skey); ok { if ve, v, ok := cs.findOverflowEntry(skey); ok {
cs.RUnlock()
nv := toNeedleValue(ve, v, cs) nv := toNeedleValue(ve, v, cs)
return &nv, true return &nv, true
} }
if i := cs.binarySearchValues(skey); i >= 0 { if i := cs.binarySearchValues(skey); i >= 0 {
cs.RUnlock()
nv := toNeedleValue(cs.valuesExtra[i], cs.values[i], cs) nv := toNeedleValue(cs.valuesExtra[i], cs.values[i], cs)
return &nv, true return &nv, true
} }
cs.RUnlock()
return nil, false return nil, false
} }
func (cs *CompactSection) binarySearchValues(key SectionalNeedleId) int { func (cs *CompactSection) binarySearchValues(key SectionalNeedleId) int {

39
weed/storage/needle_map/compact_map_test.go

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"github.com/seaweedfs/seaweedfs/weed/sequence" "github.com/seaweedfs/seaweedfs/weed/sequence"
. "github.com/seaweedfs/seaweedfs/weed/storage/types" . "github.com/seaweedfs/seaweedfs/weed/storage/types"
"log"
"os"
"testing" "testing"
) )
@ -179,3 +181,40 @@ func TestOverflow(t *testing.T) {
println() println()
} }
func TestCompactSection_Get(t *testing.T) {
var maps []*CompactMap
totalRowCount := uint64(0)
indexFile, ie := os.OpenFile("../../../test/data/sample.idx",
os.O_RDWR|os.O_RDONLY, 0644)
defer indexFile.Close()
if ie != nil {
log.Fatalln(ie)
}
m, rowCount := loadNewNeedleMap(indexFile)
maps = append(maps, m)
totalRowCount += rowCount
m.Set(1574318345753513987, ToOffset(10002), 10002)
nv,ok := m.Get(1574318345753513987)
if ok {
t.Log(uint64(nv.Key))
}
nv1, ok := m.Get(1574318350048481283)
if ok {
t.Error(uint64(nv1.Key))
}
m.Set(1574318350048481283, ToOffset(10002), 10002)
nv2,ok1 := m.Get(1574318350048481283)
if ok1 {
t.Log(uint64(nv2.Key))
}
m.Delete(nv2.Key)
nv3,has := m.Get(nv2.Key)
if has && nv3.Size > 0 {
t.Error(uint64(nv3.Size))
}
}
Loading…
Cancel
Save