vendor: update leveldb (#18205)

This commit is contained in:
Péter Szilágyi 2018-11-29 12:07:10 +02:00 committed by GitHub
commit 01371469e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 76 additions and 68 deletions

View File

@ -331,7 +331,6 @@ func (r *Cache) delete(n *Node) bool {
return deleted return deleted
} }
} }
return false
} }
// Nodes returns number of 'cache node' in the map. // Nodes returns number of 'cache node' in the map.

View File

@ -29,7 +29,7 @@ func (bytesComparer) Separator(dst, a, b []byte) []byte {
// Do not shorten if one string is a prefix of the other // Do not shorten if one string is a prefix of the other
} else if c := a[i]; c < 0xff && c+1 < b[i] { } else if c := a[i]; c < 0xff && c+1 < b[i] {
dst = append(dst, a[:i+1]...) dst = append(dst, a[:i+1]...)
dst[i]++ dst[len(dst)-1]++
return dst return dst
} }
return nil return nil
@ -39,7 +39,7 @@ func (bytesComparer) Successor(dst, b []byte) []byte {
for i, c := range b { for i, c := range b {
if c != 0xff { if c != 0xff {
dst = append(dst, b[:i+1]...) dst = append(dst, b[:i+1]...)
dst[i]++ dst[len(dst)-1]++
return dst return dst
} }
} }

View File

@ -36,7 +36,7 @@ type Comparer interface {
// by any users of this package. // by any users of this package.
Name() string Name() string
// Bellow are advanced functions used used to reduce the space requirements // Bellow are advanced functions used to reduce the space requirements
// for internal data structures such as index blocks. // for internal data structures such as index blocks.
// Separator appends a sequence of bytes x to dst such that a <= x && x < b, // Separator appends a sequence of bytes x to dst such that a <= x && x < b,

View File

@ -182,7 +182,7 @@ func Open(stor storage.Storage, o *opt.Options) (db *DB, err error) {
err = s.recover() err = s.recover()
if err != nil { if err != nil {
if !os.IsNotExist(err) || s.o.GetErrorIfMissing() { if !os.IsNotExist(err) || s.o.GetErrorIfMissing() || s.o.GetReadOnly() {
return return
} }
err = s.create() err = s.create()

View File

@ -663,7 +663,7 @@ type cCmd interface {
} }
type cAuto struct { type cAuto struct {
// Note for table compaction, an empty ackC represents it's a compaction waiting command. // Note for table compaction, an non-empty ackC represents it's a compaction waiting command.
ackC chan<- error ackC chan<- error
} }
@ -777,8 +777,8 @@ func (db *DB) mCompaction() {
func (db *DB) tCompaction() { func (db *DB) tCompaction() {
var ( var (
x cCmd x cCmd
ackQ, waitQ []cCmd waitQ []cCmd
) )
defer func() { defer func() {
@ -787,10 +787,6 @@ func (db *DB) tCompaction() {
panic(x) panic(x)
} }
} }
for i := range ackQ {
ackQ[i].ack(ErrClosed)
ackQ[i] = nil
}
for i := range waitQ { for i := range waitQ {
waitQ[i].ack(ErrClosed) waitQ[i].ack(ErrClosed)
waitQ[i] = nil waitQ[i] = nil
@ -821,11 +817,6 @@ func (db *DB) tCompaction() {
waitQ = waitQ[:0] waitQ = waitQ[:0]
} }
} else { } else {
for i := range ackQ {
ackQ[i].ack(nil)
ackQ[i] = nil
}
ackQ = ackQ[:0]
for i := range waitQ { for i := range waitQ {
waitQ[i].ack(nil) waitQ[i].ack(nil)
waitQ[i] = nil waitQ[i] = nil
@ -844,9 +835,12 @@ func (db *DB) tCompaction() {
switch cmd := x.(type) { switch cmd := x.(type) {
case cAuto: case cAuto:
if cmd.ackC != nil { if cmd.ackC != nil {
waitQ = append(waitQ, x) // Check the write pause state before caching it.
} else { if db.resumeWrite() {
ackQ = append(ackQ, x) x.ack(nil)
} else {
waitQ = append(waitQ, x)
}
} }
case cRange: case cRange:
x.ack(db.tableRangeCompaction(cmd.level, cmd.min, cmd.max)) x.ack(db.tableRangeCompaction(cmd.level, cmd.min, cmd.max))

View File

@ -84,7 +84,7 @@ func (db *DB) checkAndCleanFiles() error {
var mfds []storage.FileDesc var mfds []storage.FileDesc
for num, present := range tmap { for num, present := range tmap {
if !present { if !present {
mfds = append(mfds, storage.FileDesc{storage.TypeTable, num}) mfds = append(mfds, storage.FileDesc{Type: storage.TypeTable, Num: num})
db.logf("db@janitor table missing @%d", num) db.logf("db@janitor table missing @%d", num)
} }
} }

View File

@ -40,11 +40,11 @@ type IteratorSeeker interface {
Seek(key []byte) bool Seek(key []byte) bool
// Next moves the iterator to the next key/value pair. // Next moves the iterator to the next key/value pair.
// It returns whether the iterator is exhausted. // It returns false if the iterator is exhausted.
Next() bool Next() bool
// Prev moves the iterator to the previous key/value pair. // Prev moves the iterator to the previous key/value pair.
// It returns whether the iterator is exhausted. // It returns false if the iterator is exhausted.
Prev() bool Prev() bool
} }

View File

@ -158,6 +158,12 @@ type Options struct {
// The default value is 8MiB. // The default value is 8MiB.
BlockCacheCapacity int BlockCacheCapacity int
// BlockCacheEvictRemoved allows enable forced-eviction on cached block belonging
// to removed 'sorted table'.
//
// The default if false.
BlockCacheEvictRemoved bool
// BlockRestartInterval is the number of keys between restart points for // BlockRestartInterval is the number of keys between restart points for
// delta encoding of keys. // delta encoding of keys.
// //
@ -384,6 +390,13 @@ func (o *Options) GetBlockCacheCapacity() int {
return o.BlockCacheCapacity return o.BlockCacheCapacity
} }
func (o *Options) GetBlockCacheEvictRemoved() bool {
if o == nil {
return false
}
return o.BlockCacheEvictRemoved
}
func (o *Options) GetBlockRestartInterval() int { func (o *Options) GetBlockRestartInterval() int {
if o == nil || o.BlockRestartInterval <= 0 { if o == nil || o.BlockRestartInterval <= 0 {
return DefaultBlockRestartInterval return DefaultBlockRestartInterval

View File

@ -36,7 +36,7 @@ func (s *session) logf(format string, v ...interface{}) { s.stor.Log(fmt.Sprintf
func (s *session) newTemp() storage.FileDesc { func (s *session) newTemp() storage.FileDesc {
num := atomic.AddInt64(&s.stTempFileNum, 1) - 1 num := atomic.AddInt64(&s.stTempFileNum, 1) - 1
return storage.FileDesc{storage.TypeTemp, num} return storage.FileDesc{Type: storage.TypeTemp, Num: num}
} }
func (s *session) addFileRef(fd storage.FileDesc, ref int) int { func (s *session) addFileRef(fd storage.FileDesc, ref int) int {
@ -190,7 +190,7 @@ func (s *session) recordCommited(rec *sessionRecord) {
// Create a new manifest file; need external synchronization. // Create a new manifest file; need external synchronization.
func (s *session) newManifest(rec *sessionRecord, v *version) (err error) { func (s *session) newManifest(rec *sessionRecord, v *version) (err error) {
fd := storage.FileDesc{storage.TypeManifest, s.allocFileNum()} fd := storage.FileDesc{Type: storage.TypeManifest, Num: s.allocFileNum()}
writer, err := s.stor.Create(fd) writer, err := s.stor.Create(fd)
if err != nil { if err != nil {
return return

View File

@ -78,7 +78,7 @@ func newTableFile(fd storage.FileDesc, size int64, imin, imax internalKey) *tFil
} }
func tableFileFromRecord(r atRecord) *tFile { func tableFileFromRecord(r atRecord) *tFile {
return newTableFile(storage.FileDesc{storage.TypeTable, r.num}, r.size, r.imin, r.imax) return newTableFile(storage.FileDesc{Type: storage.TypeTable, Num: r.num}, r.size, r.imin, r.imax)
} }
// tFiles hold multiple tFile. // tFiles hold multiple tFile.
@ -290,16 +290,17 @@ func (x *tFilesSortByNum) Less(i, j int) bool {
// Table operations. // Table operations.
type tOps struct { type tOps struct {
s *session s *session
noSync bool noSync bool
cache *cache.Cache evictRemoved bool
bcache *cache.Cache cache *cache.Cache
bpool *util.BufferPool bcache *cache.Cache
bpool *util.BufferPool
} }
// Creates an empty table and returns table writer. // Creates an empty table and returns table writer.
func (t *tOps) create() (*tWriter, error) { func (t *tOps) create() (*tWriter, error) {
fd := storage.FileDesc{storage.TypeTable, t.s.allocFileNum()} fd := storage.FileDesc{Type: storage.TypeTable, Num: t.s.allocFileNum()}
fw, err := t.s.stor.Create(fd) fw, err := t.s.stor.Create(fd)
if err != nil { if err != nil {
return nil, err return nil, err
@ -422,7 +423,7 @@ func (t *tOps) remove(f *tFile) {
} else { } else {
t.s.logf("table@remove removed @%d", f.fd.Num) t.s.logf("table@remove removed @%d", f.fd.Num)
} }
if t.bcache != nil { if t.evictRemoved && t.bcache != nil {
t.bcache.EvictNS(uint64(f.fd.Num)) t.bcache.EvictNS(uint64(f.fd.Num))
} }
}) })
@ -451,7 +452,7 @@ func newTableOps(s *session) *tOps {
if !s.o.GetDisableBlockCache() { if !s.o.GetDisableBlockCache() {
var bcacher cache.Cacher var bcacher cache.Cacher
if s.o.GetBlockCacheCapacity() > 0 { if s.o.GetBlockCacheCapacity() > 0 {
bcacher = cache.NewLRU(s.o.GetBlockCacheCapacity()) bcacher = s.o.GetBlockCacher().New(s.o.GetBlockCacheCapacity())
} }
bcache = cache.NewCache(bcacher) bcache = cache.NewCache(bcacher)
} }
@ -459,11 +460,12 @@ func newTableOps(s *session) *tOps {
bpool = util.NewBufferPool(s.o.GetBlockSize() + 5) bpool = util.NewBufferPool(s.o.GetBlockSize() + 5)
} }
return &tOps{ return &tOps{
s: s, s: s,
noSync: s.o.GetNoSync(), noSync: s.o.GetNoSync(),
cache: cache.NewCache(cacher), evictRemoved: s.o.GetBlockCacheEvictRemoved(),
bcache: bcache, cache: cache.NewCache(cacher),
bpool: bpool, bcache: bcache,
bpool: bpool,
} }
} }

58
vendor/vendor.json vendored
View File

@ -455,76 +455,76 @@
"revisionTime": "2017-07-05T02:17:15Z" "revisionTime": "2017-07-05T02:17:15Z"
}, },
{ {
"checksumSHA1": "k6zbR5hiI10hkWtiK91rIY5s5/E=", "checksumSHA1": "LV0VMVON7xY1ttV+s2ph83ntmDQ=",
"path": "github.com/syndtr/goleveldb/leveldb", "path": "github.com/syndtr/goleveldb/leveldb",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "EKIow7XkgNdWvR/982ffIZxKG8Y=", "checksumSHA1": "mPNraL2edpk/2FYq26rSXfMHbJg=",
"path": "github.com/syndtr/goleveldb/leveldb/cache", "path": "github.com/syndtr/goleveldb/leveldb/cache",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "5KPgnvCPlR0ysDAqo6jApzRQ3tw=", "checksumSHA1": "UA+PKDKWlDnE2OZblh23W6wZwbY=",
"path": "github.com/syndtr/goleveldb/leveldb/comparer", "path": "github.com/syndtr/goleveldb/leveldb/comparer",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "1DRAxdlWzS4U0xKN/yQ/fdNN7f0=", "checksumSHA1": "1DRAxdlWzS4U0xKN/yQ/fdNN7f0=",
"path": "github.com/syndtr/goleveldb/leveldb/errors", "path": "github.com/syndtr/goleveldb/leveldb/errors",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "eqKeD6DS7eNCtxVYZEHHRKkyZrw=", "checksumSHA1": "eqKeD6DS7eNCtxVYZEHHRKkyZrw=",
"path": "github.com/syndtr/goleveldb/leveldb/filter", "path": "github.com/syndtr/goleveldb/leveldb/filter",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "weSsccMav4BCerDpSLzh3mMxAYo=", "checksumSHA1": "hPyFsMiqZ1OB7MX+6wIAA6nsdtc=",
"path": "github.com/syndtr/goleveldb/leveldb/iterator", "path": "github.com/syndtr/goleveldb/leveldb/iterator",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "gJY7bRpELtO0PJpZXgPQ2BYFJ88=", "checksumSHA1": "gJY7bRpELtO0PJpZXgPQ2BYFJ88=",
"path": "github.com/syndtr/goleveldb/leveldb/journal", "path": "github.com/syndtr/goleveldb/leveldb/journal",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "MtYY1b2234y/MlS+djL8tXVAcQs=", "checksumSHA1": "MtYY1b2234y/MlS+djL8tXVAcQs=",
"path": "github.com/syndtr/goleveldb/leveldb/memdb", "path": "github.com/syndtr/goleveldb/leveldb/memdb",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "UmQeotV+m8/FduKEfLOhjdp18rs=", "checksumSHA1": "o2TorI3z+vc+EBMJ8XeFoUmXBtU=",
"path": "github.com/syndtr/goleveldb/leveldb/opt", "path": "github.com/syndtr/goleveldb/leveldb/opt",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "ZnyuciM+R19NG8L5YS3TIJdo1e8=", "checksumSHA1": "ZnyuciM+R19NG8L5YS3TIJdo1e8=",
"path": "github.com/syndtr/goleveldb/leveldb/storage", "path": "github.com/syndtr/goleveldb/leveldb/storage",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "gWFPMz8OQeul0t54RM66yMTX49g=", "checksumSHA1": "gWFPMz8OQeul0t54RM66yMTX49g=",
"path": "github.com/syndtr/goleveldb/leveldb/table", "path": "github.com/syndtr/goleveldb/leveldb/table",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "V/Dh7NV0/fy/5jX1KaAjmGcNbzI=", "checksumSHA1": "V/Dh7NV0/fy/5jX1KaAjmGcNbzI=",
"path": "github.com/syndtr/goleveldb/leveldb/util", "path": "github.com/syndtr/goleveldb/leveldb/util",
"revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revision": "b001fa50d6b27f3f0bb175a87d0cb55426d0a0ae",
"revisionTime": "2018-07-08T03:05:51Z" "revisionTime": "2018-11-28T10:09:59Z"
}, },
{ {
"checksumSHA1": "nD6S4KB0S+YHxVMDDE+w3PyXaMk=", "checksumSHA1": "nD6S4KB0S+YHxVMDDE+w3PyXaMk=",