diff options
Diffstat (limited to 'weed/storage')
| -rw-r--r-- | weed/storage/volume_backup.go | 61 | ||||
| -rw-r--r-- | weed/storage/volume_write_test.go | 23 |
2 files changed, 68 insertions, 16 deletions
diff --git a/weed/storage/volume_backup.go b/weed/storage/volume_backup.go index 500f48b23..a8ec50cad 100644 --- a/weed/storage/volume_backup.go +++ b/weed/storage/volume_backup.go @@ -194,6 +194,35 @@ func (v *Volume) BinarySearchByAppendAtNs(sinceNs uint64) (offset Offset, isLast err = fmt.Errorf("read entry %d: %v", m, err) return } + if offset.IsZero() { + leftIndex, _, leftNs, leftErr := v.readLeftNs(m) + if leftErr != nil { + err = leftErr + return + } + rightIndex, rightOffset, rightNs, rightErr := v.readRightNs(m) + if rightErr != nil { + err = rightErr + return + } + if rightNs <= sinceNs { + l = rightIndex + if l == entryCount { + return Offset{}, true, nil + } else { + continue + } + } + if sinceNs < leftNs { + h = leftIndex + 1 + continue + } + return rightOffset, false, nil + + } + if offset.IsZero() { + return Offset{}, true, nil + } mNs, nsReadErr := v.readAppendAtNs(offset) if nsReadErr != nil { @@ -220,6 +249,38 @@ func (v *Volume) BinarySearchByAppendAtNs(sinceNs uint64) (offset Offset, isLast } +func (v *Volume) readRightNs(m int64) (index int64, offset Offset, ts uint64, err error) { + index = m + for offset.IsZero() { + index++ + offset, err = v.readOffsetFromIndex(index) + if err != nil { + err = fmt.Errorf("read entry %d: %v", index, err) + return + } + } + if !offset.IsZero() { + ts, err = v.readAppendAtNs(offset) + } + return +} + +func (v *Volume) readLeftNs(m int64) (index int64, offset Offset, ts uint64, err error) { + index = m + for offset.IsZero() { + index-- + offset, err = v.readOffsetFromIndex(index) + if err != nil { + err = fmt.Errorf("read entry %d: %v", index, err) + return + } + } + if !offset.IsZero() { + ts, err = v.readAppendAtNs(offset) + } + return +} + // bytes is of size NeedleMapEntrySize func (v *Volume) readOffsetFromIndex(m int64) (Offset, error) { v.dataFileAccessLock.RLock() diff --git a/weed/storage/volume_write_test.go b/weed/storage/volume_write_test.go index e0ee3dac7..309f29657 100644 --- a/weed/storage/volume_write_test.go +++ b/weed/storage/volume_write_test.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/storage/needle" "github.com/chrislusf/seaweedfs/weed/storage/super_block" + "github.com/chrislusf/seaweedfs/weed/storage/types" "io/ioutil" "os" "testing" @@ -22,9 +23,9 @@ func TestSearchVolumesWithDeletedNeedles(t *testing.T) { t.Fatalf("volume creation: %v", err) } - count := 10 + count := 20 - for i:=1;i<count;i++{ + for i := 1; i < count; i++ { n := newRandomNeedle(uint64(i)) _, _, _, err := v.writeNeedle2(n, true, false) if err != nil { @@ -32,9 +33,9 @@ func TestSearchVolumesWithDeletedNeedles(t *testing.T) { } } - for i:=1;i<5;i++{ + for i := 1; i < 15; i++ { n := newEmptyNeedle(uint64(i)) - _, err := v.doDeleteRequest(n) + err := v.nm.Put(n.Id, types.Offset{}, types.TombstoneFileSize) if err != nil { t.Fatalf("delete needle %d: %v", i, err) } @@ -42,15 +43,12 @@ func TestSearchVolumesWithDeletedNeedles(t *testing.T) { ts1 := time.Now().UnixNano() - var ts2 uint64 - - for i:=5;i<count;i++{ + for i := 15; i < count; i++ { n := newEmptyNeedle(uint64(i)) _, err := v.doDeleteRequest(n) if err != nil { t.Fatalf("delete needle %d: %v", i, err) } - ts2 = n.AppendAtNs } offset, isLast, err := v.BinarySearchByAppendAtNs(uint64(ts1)) @@ -59,11 +57,4 @@ func TestSearchVolumesWithDeletedNeedles(t *testing.T) { } fmt.Printf("offset: %v, isLast: %v\n", offset.ToActualOffset(), isLast) - offset, isLast, err = v.BinarySearchByAppendAtNs(uint64(ts2)) - if err != nil { - t.Fatalf("lookup by ts: %v", err) - } - fmt.Printf("offset: %v, isLast: %v\n", offset.ToActualOffset(), isLast) - - -}
\ No newline at end of file +} |
