From 785deebd623b7a4983bbb4a8618723c0bd35f50b Mon Sep 17 00:00:00 2001 From: fanmin shi Date: Thu, 27 Jul 2017 17:42:19 -0700 Subject: [PATCH] mvcc/backend: enforce ordering for UnsafeForEach in read_tx.go This pr changes UnsafeForEach to traverse on boltdb before on the buffer. This ordering guarantees that UnsafeForEach traverses in the same order before or after the commit of buffer. --- mvcc/backend/read_tx.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mvcc/backend/read_tx.go b/mvcc/backend/read_tx.go index a5ceeaeb7..9101cfd2a 100644 --- a/mvcc/backend/read_tx.go +++ b/mvcc/backend/read_tx.go @@ -70,21 +70,24 @@ func (rt *readTx) UnsafeRange(bucketName, key, endKey []byte, limit int64) ([][] func (rt *readTx) UnsafeForEach(bucketName []byte, visitor func(k, v []byte) error) error { dups := make(map[string]struct{}) - f1 := func(k, v []byte) error { + getDups := func(k, v []byte) error { dups[string(k)] = struct{}{} - return visitor(k, v) + return nil } - f2 := func(k, v []byte) error { + visitNoDup := func(k, v []byte) error { if _, ok := dups[string(k)]; ok { return nil } return visitor(k, v) } - if err := rt.buf.ForEach(bucketName, f1); err != nil { + if err := rt.buf.ForEach(bucketName, getDups); err != nil { return err } rt.txmu.Lock() - err := unsafeForEach(rt.tx, bucketName, f2) + err := unsafeForEach(rt.tx, bucketName, visitNoDup) rt.txmu.Unlock() - return err + if err != nil { + return err + } + return rt.buf.ForEach(bucketName, visitor) }