vendor: Update github.com/syndtr/goleveldb
This commit is contained in:
77
vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go
generated
vendored
77
vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go
generated
vendored
@@ -26,12 +26,15 @@ import (
|
||||
"github.com/syndtr/goleveldb/leveldb/util"
|
||||
)
|
||||
|
||||
// Reader errors.
|
||||
var (
|
||||
ErrNotFound = errors.ErrNotFound
|
||||
ErrReaderReleased = errors.New("leveldb/table: reader released")
|
||||
ErrIterReleased = errors.New("leveldb/table: iterator released")
|
||||
)
|
||||
|
||||
// ErrCorrupted describes error due to corruption. This error will be wrapped
|
||||
// with errors.ErrCorrupted.
|
||||
type ErrCorrupted struct {
|
||||
Pos int64
|
||||
Size int64
|
||||
@@ -61,7 +64,7 @@ type block struct {
|
||||
func (b *block) seek(cmp comparer.Comparer, rstart, rlimit int, key []byte) (index, offset int, err error) {
|
||||
index = sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool {
|
||||
offset := int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):]))
|
||||
offset += 1 // shared always zero, since this is a restart point
|
||||
offset++ // shared always zero, since this is a restart point
|
||||
v1, n1 := binary.Uvarint(b.data[offset:]) // key length
|
||||
_, n2 := binary.Uvarint(b.data[offset+n1:]) // value length
|
||||
m := offset + n1 + n2
|
||||
@@ -356,7 +359,7 @@ func (i *blockIter) Prev() bool {
|
||||
i.value = nil
|
||||
offset := i.block.restartOffset(ri)
|
||||
if offset == i.offset {
|
||||
ri -= 1
|
||||
ri--
|
||||
if ri < 0 {
|
||||
i.dir = dirSOI
|
||||
return false
|
||||
@@ -783,8 +786,8 @@ func (r *Reader) getDataIterErr(dataBH blockHandle, slice *util.Range, verifyChe
|
||||
// table. And a nil Range.Limit is treated as a key after all keys in
|
||||
// the table.
|
||||
//
|
||||
// The returned iterator is not goroutine-safe and should be released
|
||||
// when not used.
|
||||
// The returned iterator is not safe for concurrent use and should be released
|
||||
// after use.
|
||||
//
|
||||
// Also read Iterator documentation of the leveldb/iterator package.
|
||||
func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
|
||||
@@ -826,18 +829,21 @@ func (r *Reader) find(key []byte, filtered bool, ro *opt.ReadOptions, noValue bo
|
||||
|
||||
index := r.newBlockIter(indexBlock, nil, nil, true)
|
||||
defer index.Release()
|
||||
|
||||
if !index.Seek(key) {
|
||||
err = index.Error()
|
||||
if err == nil {
|
||||
if err = index.Error(); err == nil {
|
||||
err = ErrNotFound
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
dataBH, n := decodeBlockHandle(index.Value())
|
||||
if n == 0 {
|
||||
r.err = r.newErrCorruptedBH(r.indexBH, "bad data block handle")
|
||||
return
|
||||
return nil, nil, r.err
|
||||
}
|
||||
|
||||
// The filter should only used for exact match.
|
||||
if filtered && r.filter != nil {
|
||||
filterBlock, frel, ferr := r.getFilterBlock(true)
|
||||
if ferr == nil {
|
||||
@@ -847,30 +853,53 @@ func (r *Reader) find(key []byte, filtered bool, ro *opt.ReadOptions, noValue bo
|
||||
}
|
||||
frel.Release()
|
||||
} else if !errors.IsCorrupted(ferr) {
|
||||
err = ferr
|
||||
return nil, nil, ferr
|
||||
}
|
||||
}
|
||||
|
||||
data := r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache())
|
||||
if !data.Seek(key) {
|
||||
data.Release()
|
||||
if err = data.Error(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// The nearest greater-than key is the first key of the next block.
|
||||
if !index.Next() {
|
||||
if err = index.Error(); err == nil {
|
||||
err = ErrNotFound
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
dataBH, n = decodeBlockHandle(index.Value())
|
||||
if n == 0 {
|
||||
r.err = r.newErrCorruptedBH(r.indexBH, "bad data block handle")
|
||||
return nil, nil, r.err
|
||||
}
|
||||
|
||||
data = r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache())
|
||||
if !data.Next() {
|
||||
data.Release()
|
||||
if err = data.Error(); err == nil {
|
||||
err = ErrNotFound
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
data := r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache())
|
||||
defer data.Release()
|
||||
if !data.Seek(key) {
|
||||
err = data.Error()
|
||||
if err == nil {
|
||||
err = ErrNotFound
|
||||
}
|
||||
return
|
||||
}
|
||||
// Don't use block buffer, no need to copy the buffer.
|
||||
|
||||
// Key doesn't use block buffer, no need to copy the buffer.
|
||||
rkey = data.Key()
|
||||
if !noValue {
|
||||
if r.bpool == nil {
|
||||
value = data.Value()
|
||||
} else {
|
||||
// Use block buffer, and since the buffer will be recycled, the buffer
|
||||
// need to be copied.
|
||||
// Value does use block buffer, and since the buffer will be
|
||||
// recycled, it need to be copied.
|
||||
value = append([]byte{}, data.Value()...)
|
||||
}
|
||||
}
|
||||
data.Release()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -987,7 +1016,7 @@ func (r *Reader) Release() {
|
||||
// NewReader creates a new initialized table reader for the file.
|
||||
// The fi, cache and bpool is optional and can be nil.
|
||||
//
|
||||
// The returned table reader instance is goroutine-safe.
|
||||
// The returned table reader instance is safe for concurrent use.
|
||||
func NewReader(f io.ReaderAt, size int64, fd storage.FileDesc, cache *cache.NamespaceGetter, bpool *util.BufferPool, o *opt.Options) (*Reader, error) {
|
||||
if f == nil {
|
||||
return nil, errors.New("leveldb/table: nil file")
|
||||
@@ -1039,9 +1068,8 @@ func NewReader(f io.ReaderAt, size int64, fd storage.FileDesc, cache *cache.Name
|
||||
if errors.IsCorrupted(err) {
|
||||
r.err = err
|
||||
return r, nil
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Set data end.
|
||||
@@ -1086,9 +1114,8 @@ func NewReader(f io.ReaderAt, size int64, fd storage.FileDesc, cache *cache.Name
|
||||
if errors.IsCorrupted(err) {
|
||||
r.err = err
|
||||
return r, nil
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
if r.filter != nil {
|
||||
r.filterBlock, err = r.readFilterBlock(r.filterBH)
|
||||
|
||||
2
vendor/github.com/syndtr/goleveldb/leveldb/table/table_test.go
generated
vendored
2
vendor/github.com/syndtr/goleveldb/leveldb/table/table_test.go
generated
vendored
@@ -111,7 +111,7 @@ var _ = testutil.Defer(func() {
|
||||
}
|
||||
|
||||
testutil.AllKeyValueTesting(nil, Build, nil, nil)
|
||||
Describe("with one key per block", Test(testutil.KeyValue_Generate(nil, 9, 1, 10, 512, 512), func(r *Reader) {
|
||||
Describe("with one key per block", Test(testutil.KeyValue_Generate(nil, 9, 1, 1, 10, 512, 512), func(r *Reader) {
|
||||
It("should have correct blocks number", func() {
|
||||
indexBlock, err := r.readBlock(r.indexBH, true)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
2
vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go
generated
vendored
2
vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go
generated
vendored
@@ -349,7 +349,7 @@ func (w *Writer) Close() error {
|
||||
|
||||
// NewWriter creates a new initialized table writer for the file.
|
||||
//
|
||||
// Table writer is not goroutine-safe.
|
||||
// Table writer is not safe for concurrent use.
|
||||
func NewWriter(f io.Writer, o *opt.Options) *Writer {
|
||||
w := &Writer{
|
||||
writer: f,
|
||||
|
||||
Reference in New Issue
Block a user