diff --git a/vendor/github.com/dgraph-io/badger/levels.go b/vendor/github.com/dgraph-io/badger/levels.go index e7f01d2dc30dedcc2b30e50e76e6aa361e7e7d66..d666c563542498f87519afc3a06be24951400edf 100644 --- a/vendor/github.com/dgraph-io/badger/levels.go +++ b/vendor/github.com/dgraph-io/badger/levels.go @@ -308,10 +308,10 @@ func (s *levelsController) compactBuildTables( it.Rewind() - // Pick up the currently pending transactions' min readTs, so we can discard versions below this - // readTs. We should never discard any versions starting from above this timestamp, because that - // would affect the snapshot view guarantee provided by transactions. - minReadTs := s.kv.orc.readMark.MinReadTs() + // Pick a discard ts, so we can discard versions below this ts. We should + // never discard any versions starting from above this timestamp, because + // that would affect the snapshot view guarantee provided by transactions. + discardTs := s.kv.orc.discardAtOrBelow() // Start generating new tables. type newTableResult struct { @@ -350,7 +350,7 @@ func (s *levelsController) compactBuildTables( vs := it.Value() version := y.ParseTs(it.Key()) - if version <= minReadTs { + if version <= discardTs { // Keep track of the number of versions encountered for this key. Only consider the // versions which are below the minReadTs, otherwise, we might end up discarding the // only valid version for a running transaction. diff --git a/vendor/github.com/dgraph-io/badger/managed_db.go b/vendor/github.com/dgraph-io/badger/managed_db.go index adbec802b7e5c100f6d6f7b3e85b5ea415eca57b..c33cb3434896223195f299ca612934d08cb5e2a2 100644 --- a/vendor/github.com/dgraph-io/badger/managed_db.go +++ b/vendor/github.com/dgraph-io/badger/managed_db.go @@ -77,3 +77,10 @@ func (txn *Txn) CommitAt(commitTs uint64, callback func(error)) error { func (db *ManagedDB) GetSequence(_ []byte, _ uint64) (*Sequence, error) { panic("Cannot use GetSequence for ManagedDB.") } + +// SetDiscardTs sets a timestamp at or below which, any invalid or deleted +// versions can be discarded from the LSM tree, and thence from the value log to +// reclaim disk space. +func (db *ManagedDB) SetDiscardTs(ts uint64) { + db.orc.setDiscardTs(ts) +} diff --git a/vendor/github.com/dgraph-io/badger/transaction.go b/vendor/github.com/dgraph-io/badger/transaction.go index 6ce38605254e2a2b88c59b6e4f0ee5ae9610668e..32a6a96aece35587f49f5e04de478a43c2fd12f9 100644 --- a/vendor/github.com/dgraph-io/badger/transaction.go +++ b/vendor/github.com/dgraph-io/badger/transaction.go @@ -40,7 +40,10 @@ type oracle struct { writeLock sync.Mutex nextCommit uint64 - readMark y.WaterMark + // Either of these is used to determine which versions can be permanently + // discarded during compaction. + discardTs uint64 // Used by ManagedDB. + readMark y.WaterMark // Used by DB. // commits stores a key fingerprint and latest commit counter for it. // refCount is used to clear out commits map to avoid a memory blowup. @@ -81,6 +84,23 @@ func (o *oracle) commitTs() uint64 { return o.nextCommit } +// Any deleted or invalid versions at or below ts would be discarded during +// compaction to reclaim disk space in LSM tree and thence value log. +func (o *oracle) setDiscardTs(ts uint64) { + o.Lock() + defer o.Unlock() + o.discardTs = ts +} + +func (o *oracle) discardAtOrBelow() uint64 { + if o.isManaged { + o.Lock() + defer o.Unlock() + return o.discardTs + } + return o.readMark.MinReadTs() +} + // hasConflict must be called while having a lock. func (o *oracle) hasConflict(txn *Txn) bool { if len(txn.reads) == 0 { diff --git a/vendor/vendor.json b/vendor/vendor.json index 3b5169a0dc93ff03ccad6e2421f599e2e442df72..c5037e14f125fa6b2f2fb33358fda57f30dc0141 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -163,52 +163,52 @@ "revisionTime": "2016-09-07T16:21:46Z" }, { - "checksumSHA1": "2H+tsKY88Anb6Ys9Ls8X9NVmSEc=", + "checksumSHA1": "1qvmTlilsJCsxarfPoawlGF7jQw=", "path": "github.com/dgraph-io/badger", - "revision": "391b6d3b93e6014fe8c2971fcc0c1266e47dbbd9", - "revisionTime": "2018-07-11T21:59:47Z", - "version": "v1.5.3", - "versionExact": "v1.5.3" + "revision": "937af5f844102c2849b070cdb0ec33d82aa97cc3", + "revisionTime": "2018-07-11T22:35:56Z", + "version": "HEAD", + "versionExact": "HEAD" }, { "checksumSHA1": "oOuT7ebEiZ1ViHLKdFxKFOvobAQ=", "path": "github.com/dgraph-io/badger/options", - "revision": "391b6d3b93e6014fe8c2971fcc0c1266e47dbbd9", - "revisionTime": "2018-07-11T21:59:47Z", - "version": "v1.5.3", - "versionExact": "v1.5.3" + "revision": "937af5f844102c2849b070cdb0ec33d82aa97cc3", + "revisionTime": "2018-07-11T22:35:56Z", + "version": "HEAD", + "versionExact": "HEAD" }, { "checksumSHA1": "gGTDnTVVw5kcT2P5NXZV1YSckOU=", "path": "github.com/dgraph-io/badger/protos", - "revision": "391b6d3b93e6014fe8c2971fcc0c1266e47dbbd9", - "revisionTime": "2018-07-11T21:59:47Z", - "version": "v1.5.3", - "versionExact": "v1.5.3" + "revision": "937af5f844102c2849b070cdb0ec33d82aa97cc3", + "revisionTime": "2018-07-11T22:35:56Z", + "version": "HEAD", + "versionExact": "HEAD" }, { "checksumSHA1": "00T6XbLV4d95J7hm6kTXDReaQHM=", "path": "github.com/dgraph-io/badger/skl", - "revision": "391b6d3b93e6014fe8c2971fcc0c1266e47dbbd9", - "revisionTime": "2018-07-11T21:59:47Z", - "version": "v1.5.3", - "versionExact": "v1.5.3" + "revision": "937af5f844102c2849b070cdb0ec33d82aa97cc3", + "revisionTime": "2018-07-11T22:35:56Z", + "version": "HEAD", + "versionExact": "HEAD" }, { "checksumSHA1": "I33KkP2lnYqJDasvvsAlebzkeko=", "path": "github.com/dgraph-io/badger/table", - "revision": "391b6d3b93e6014fe8c2971fcc0c1266e47dbbd9", - "revisionTime": "2018-07-11T21:59:47Z", - "version": "v1.5.3", - "versionExact": "v1.5.3" + "revision": "937af5f844102c2849b070cdb0ec33d82aa97cc3", + "revisionTime": "2018-07-11T22:35:56Z", + "version": "HEAD", + "versionExact": "HEAD" }, { "checksumSHA1": "v2pJQ5NbS034cLP+GM1WLlGnByY=", "path": "github.com/dgraph-io/badger/y", - "revision": "391b6d3b93e6014fe8c2971fcc0c1266e47dbbd9", - "revisionTime": "2018-07-11T21:59:47Z", - "version": "v1.5.3", - "versionExact": "v1.5.3" + "revision": "937af5f844102c2849b070cdb0ec33d82aa97cc3", + "revisionTime": "2018-07-11T22:35:56Z", + "version": "HEAD", + "versionExact": "HEAD" }, { "checksumSHA1": "a29TtOU87eZA0S6wL+rAkpqUEzc=", diff --git a/worker/draft.go b/worker/draft.go index 2c8fa9bb2cc356551678d9878c6a655fe220cad7..bd9589362b52be99e764db5670c22fde64abaf8d 100644 --- a/worker/draft.go +++ b/worker/draft.go @@ -389,6 +389,8 @@ func (n *node) applyCommitted(proposal *intern.Proposal, index uint64) error { snap.Index, snap.MinPendingStartTs) data, err := snap.Marshal() x.Check(err) + // We can now discard all invalid versions of keys below this ts. + pstore.SetDiscardTs(snap.MinPendingStartTs - 1) return n.Store.CreateSnapshot(snap.Index, n.ConfState(), data) } else {