diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go index ff9a7518e5..21d1e512f3 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go @@ -69,6 +69,9 @@ func (tr *Transaction) Has(key []byte, ro *opt.ReadOptions) (bool, error) { // DB. And a nil Range.Limit is treated as a key after all keys in // the DB. // +// The returned iterator has locks on its own resources, so it can live beyond +// the lifetime of the transaction who creates them. +// // WARNING: Any slice returned by interator (e.g. slice returned by calling // Iterator.Key() or Iterator.Key() methods), its content should not be modified // unless noted otherwise. @@ -252,13 +255,14 @@ func (tr *Transaction) discard() { // Discard transaction. for _, t := range tr.tables { tr.db.logf("transaction@discard @%d", t.fd.Num) - if err1 := tr.db.s.stor.Remove(t.fd); err1 == nil { - tr.db.s.reuseFileNum(t.fd.Num) - } + // Iterator may still use the table, so we use tOps.remove here. + tr.db.s.tops.remove(t.fd) } } // Discard discards the transaction. +// This method is noop if transaction is already closed (either committed or +// discarded) // // Other methods should not be called after transaction has been discarded. func (tr *Transaction) Discard() { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go index 67a6df9790..fc56b631f0 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go @@ -308,7 +308,7 @@ func (s *session) setNextFileNum(num int64) { func (s *session) markFileNum(num int64) { nextFileNum := num + 1 for { - old, x := s.stNextFileNum, nextFileNum + old, x := atomic.LoadInt64(&s.stNextFileNum), nextFileNum if old > x { x = old } @@ -326,7 +326,7 @@ func (s *session) allocFileNum() int64 { // Reuse given file number. func (s *session) reuseFileNum(num int64) { for { - old, x := s.stNextFileNum, num + old, x := atomic.LoadInt64(&s.stNextFileNum), num if old != x+1 { x = old } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table.go index 5ad1f80543..b7759b2f5c 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/table.go @@ -493,6 +493,8 @@ func (t *tOps) remove(fd storage.FileDesc) { if t.evictRemoved && t.bcache != nil { t.bcache.EvictNS(uint64(fd.Num)) } + // Try to reuse file num, useful for discarded transaction. + t.s.reuseFileNum(fd.Num) }) } diff --git a/vendor/vendor.json b/vendor/vendor.json index 7178864713..b852f822d2 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -449,76 +449,76 @@ "revisionTime": "2017-07-05T02:17:15Z" }, { - "checksumSHA1": "bva7K+I3qF8NE32iIfBoXONPnL8=", + "checksumSHA1": "Bl4KYAyUkgJSjcdEyv3VhHQ8PVs=", "path": "github.com/syndtr/goleveldb/leveldb", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "mPNraL2edpk/2FYq26rSXfMHbJg=", "path": "github.com/syndtr/goleveldb/leveldb/cache", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "UA+PKDKWlDnE2OZblh23W6wZwbY=", "path": "github.com/syndtr/goleveldb/leveldb/comparer", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "1DRAxdlWzS4U0xKN/yQ/fdNN7f0=", "path": "github.com/syndtr/goleveldb/leveldb/errors", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "iBorxU3FBbau81WSyVa8KwcutzA=", "path": "github.com/syndtr/goleveldb/leveldb/filter", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "hPyFsMiqZ1OB7MX+6wIAA6nsdtc=", "path": "github.com/syndtr/goleveldb/leveldb/iterator", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "gJY7bRpELtO0PJpZXgPQ2BYFJ88=", "path": "github.com/syndtr/goleveldb/leveldb/journal", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "2ncG38FDk2thSlrHd7JFmiuvnxA=", "path": "github.com/syndtr/goleveldb/leveldb/memdb", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "LC+WnyNq4O2J9SHuVfWL19wZH48=", "path": "github.com/syndtr/goleveldb/leveldb/opt", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "ZnyuciM+R19NG8L5YS3TIJdo1e8=", "path": "github.com/syndtr/goleveldb/leveldb/storage", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "DS0i9KReIeZn3T1Bpu31xPMtzio=", "path": "github.com/syndtr/goleveldb/leveldb/table", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "V/Dh7NV0/fy/5jX1KaAjmGcNbzI=", "path": "github.com/syndtr/goleveldb/leveldb/util", - "revision": "81b91e5521e1d9f5d09677b8a940a5903385b2fa", - "revisionTime": "2019-09-19T06:41:59Z" + "revision": "758128399b1df3a87e92df6c26c1d2063da8fabe", + "revisionTime": "2019-09-23T12:57:48Z" }, { "checksumSHA1": "SsMMqb3xn7hg1ZX5ugwZz5rzpx0=",