Index: impl/memory/datastore_data.go |
diff --git a/impl/memory/datastore_data.go b/impl/memory/datastore_data.go |
index dff438b30b33a9d6415fa218e698f26b1fdd3f55..1afc1f30581cf86c99ac287f5a65b3e864823aa6 100644 |
--- a/impl/memory/datastore_data.go |
+++ b/impl/memory/datastore_data.go |
@@ -45,6 +45,36 @@ func (d *dataStoreData) Unlock() { |
d.rwlock.Unlock() |
} |
+func (d *dataStoreData) getQuerySnaps(consistent bool) (idx, head *memStore) { |
+ d.rwlock.RLock() |
+ defer d.rwlock.RUnlock() |
+ head = d.store.Snapshot() |
+ if consistent { |
+ idx = head |
+ } else { |
+ idx = d.snap |
+ } |
+ return |
+} |
+ |
+func (d *dataStoreData) takeSnapshot() *memStore { |
+ d.rwlock.RLock() |
+ defer d.rwlock.RUnlock() |
+ return d.store.Snapshot() |
+} |
+ |
+func (d *dataStoreData) setSnapshot(snap *memStore) { |
+ d.rwlock.Lock() |
+ defer d.rwlock.Unlock() |
+ d.snap = snap |
+} |
+ |
+func (d *dataStoreData) catchupIndexes() { |
+ d.rwlock.Lock() |
+ defer d.rwlock.Unlock() |
+ d.snap = d.store.Snapshot() |
+} |
+ |
/////////////////////////// indicies(dataStoreData) //////////////////////////// |
func groupMetaKey(key ds.Key) []byte { |
@@ -165,9 +195,7 @@ func getMultiInner(keys []ds.Key, cb ds.GetMultiCB, getColl func() (*memCollecti |
func (d *dataStoreData) getMulti(keys []ds.Key, cb ds.GetMultiCB) error { |
getMultiInner(keys, cb, func() (*memCollection, error) { |
- d.rwlock.RLock() |
- s := d.store.Snapshot() |
- d.rwlock.RUnlock() |
+ s := d.takeSnapshot() |
return s.GetCollection("ents:" + keys[0].Namespace()), nil |
}) |