From 93732df3ef3f202412018e00d2b4d0aa5780372c Mon Sep 17 00:00:00 2001 From: Jingyi Hu Date: Wed, 6 Mar 2019 14:14:20 -0800 Subject: [PATCH] mvcc: release lock early when traversing index Make a copy-on-write clone of index tree when traversing. So that lock can be released right after the clone to improve backend concurrency. --- mvcc/index.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mvcc/index.go b/mvcc/index.go index f8cc6df88..858897789 100644 --- a/mvcc/index.go +++ b/mvcc/index.go @@ -92,9 +92,10 @@ func (ti *treeIndex) visit(key, end []byte, f func(ki *keyIndex)) { keyi, endi := &keyIndex{key: key}, &keyIndex{key: end} ti.RLock() - defer ti.RUnlock() + clone := ti.tree.Clone() + ti.RUnlock() - ti.tree.AscendGreaterOrEqual(keyi, func(item btree.Item) bool { + clone.AscendGreaterOrEqual(keyi, func(item btree.Item) bool { if len(endi.key) > 0 && !item.Less(endi) { return false }