From 08d44661e19363c25f25a2da73d1e6f7f87ba016 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 21 Mar 2022 20:25:55 -0700 Subject: [PATCH 1/2] fix data race related to VersionExists --- mutable_tree.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mutable_tree.go b/mutable_tree.go index 54dcfd54a..0257e6f89 100644 --- a/mutable_tree.go +++ b/mutable_tree.go @@ -68,8 +68,8 @@ func (tree *MutableTree) IsEmpty() bool { // VersionExists returns whether or not a version exists. func (tree *MutableTree) VersionExists(version int64) bool { - tree.mtx.RLock() - defer tree.mtx.RUnlock() + tree.mtx.Lock() + defer tree.mtx.Unlock() if tree.allRootLoaded { return tree.versions[version] From e82a74ad9cbe224c3259652dae279596da51c47d Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 21 Mar 2022 20:51:36 -0700 Subject: [PATCH 2/2] use regular lock instead of RW in mutable_tree.go --- mutable_tree.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mutable_tree.go b/mutable_tree.go index 0257e6f89..e45482dbc 100644 --- a/mutable_tree.go +++ b/mutable_tree.go @@ -35,7 +35,7 @@ type MutableTree struct { unsavedFastNodeRemovals map[string]interface{} // FastNodes that have not yet been removed from disk ndb *nodeDB - mtx sync.RWMutex // versions Read/write lock. + mtx sync.Mutex } // NewMutableTree returns a new tree with the specified cache size and datastore. @@ -86,8 +86,8 @@ func (tree *MutableTree) VersionExists(version int64) bool { // AvailableVersions returns all available versions in ascending order func (tree *MutableTree) AvailableVersions() []int { - tree.mtx.RLock() - defer tree.mtx.RUnlock() + tree.mtx.Lock() + defer tree.mtx.Unlock() res := make([]int, 0, len(tree.versions)) for i, v := range tree.versions {