This commit is contained in:
22
lsm/sst.go
22
lsm/sst.go
@@ -316,15 +316,24 @@ func (l *logFile) LoadSegment(pos int64) (*segmentBytes, error) {
|
||||
return &segmentBytes{b, -1}, nil
|
||||
}
|
||||
func (l *logFile) Find(needle []byte, first bool) (*entryBytes, bool, error) {
|
||||
var last segmentReader
|
||||
var cur, last segmentReader
|
||||
|
||||
for _, s := range l.segments {
|
||||
e, err := s.FirstEntry()
|
||||
cur = s
|
||||
e, err := cur.FirstEntry()
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
k, _ := e.KeyValue()
|
||||
if first && bytes.Compare(k, needle) >= 0 {
|
||||
|
||||
if first && bytes.Equal(k, needle) {
|
||||
break
|
||||
}
|
||||
if first && bytes.Compare(k, needle) > 0 {
|
||||
e, ok, err := cur.Find(needle, first)
|
||||
if ok || err != nil{
|
||||
return e, ok, err
|
||||
}
|
||||
break
|
||||
}
|
||||
if !first && bytes.Compare(k, needle) > 0 {
|
||||
@@ -333,7 +342,12 @@ func (l *logFile) Find(needle []byte, first bool) (*entryBytes, bool, error) {
|
||||
last = s
|
||||
}
|
||||
|
||||
return last.Find(needle, first)
|
||||
e, ok, err := last.Find(needle, first)
|
||||
if ok || err != nil{
|
||||
return e, ok, err
|
||||
}
|
||||
// if by mistake it was not found in the last.. check the next segment.
|
||||
return cur.Find(needle, first)
|
||||
}
|
||||
func (l *logFile) WriteTo(w io.Writer) (int64, error) {
|
||||
return l.rd.WriteTo(w)
|
||||
|
||||
@@ -40,7 +40,7 @@ func TestLargeFile(t *testing.T) {
|
||||
}
|
||||
t.Log(f.Stat())
|
||||
|
||||
tt, ok, err := sf.Find(needle, false)
|
||||
tt, ok, err := sf.Find(needle, true)
|
||||
is.NoErr(err)
|
||||
is.True(ok)
|
||||
key, val := tt.KeyValue()
|
||||
@@ -183,6 +183,17 @@ func TestFindRange(t *testing.T) {
|
||||
is.Equal(key, []byte("AB"))
|
||||
is.Equal(val, uint64(2))
|
||||
|
||||
last, ok, err = sf.Find([]byte("AB"), false)
|
||||
is.NoErr(err)
|
||||
|
||||
key, val = last.KeyValue()
|
||||
t.Log(string(key), val)
|
||||
|
||||
is.True(ok)
|
||||
is.Equal(key, []byte("AB"))
|
||||
is.Equal(val, uint64(4))
|
||||
|
||||
|
||||
last, ok, err = sf.Find([]byte("AC"), false)
|
||||
is.NoErr(err)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user