Merge pull request #807 from nspcc-dev/optimize-memcached-persist

storage: optimize (*MemCachedStore).Persist for memory-backed ps
This commit is contained in:
Roman Khimov 2020-03-29 13:41:21 +03:00 committed by GitHub
commit 237de73dec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 13 deletions

View file

@ -93,20 +93,42 @@ func (s *MemCachedStore) Seek(key []byte, f func(k, v []byte)) {
// Persist flushes all the MemoryStore contents into the (supposedly) persistent // Persist flushes all the MemoryStore contents into the (supposedly) persistent
// store ps. // store ps.
func (s *MemCachedStore) Persist() (int, error) { func (s *MemCachedStore) Persist() (int, error) {
var err error
var keys, dkeys int
s.mut.Lock() s.mut.Lock()
defer s.mut.Unlock() defer s.mut.Unlock()
batch := s.ps.Batch()
keys, dkeys := 0, 0 keys = len(s.mem)
for k, v := range s.mem { dkeys = len(s.del)
batch.Put([]byte(k), v) if keys == 0 && dkeys == 0 {
keys++ return 0, nil
} }
for k := range s.del {
batch.Delete([]byte(k)) memStore, ok := s.ps.(*MemoryStore)
dkeys++ if !ok {
memCachedStore, ok := s.ps.(*MemCachedStore)
if ok {
memStore = &memCachedStore.MemoryStore
}
} }
var err error if memStore != nil {
if keys != 0 || dkeys != 0 { memStore.mut.Lock()
for k := range s.mem {
memStore.put(k, s.mem[k])
}
for k := range s.del {
memStore.drop(k)
}
memStore.mut.Unlock()
} else {
batch := s.ps.Batch()
for k := range s.mem {
batch.Put([]byte(k), s.mem[k])
}
for k := range s.del {
batch.Delete([]byte(k))
}
err = s.ps.PutBatch(batch) err = s.ps.PutBatch(batch)
} }
if err == nil { if err == nil {

View file

@ -7,9 +7,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestMemCachedStorePersist(t *testing.T) { func testMemCachedStorePersist(t *testing.T, ps Store) {
// persistent Store
ps := NewMemoryStore()
// cached Store // cached Store
ts := NewMemCachedStore(ps) ts := NewMemCachedStore(ps)
// persisting nothing should do nothing // persisting nothing should do nothing
@ -94,6 +92,22 @@ func checkBatch(t *testing.T, ts *MemCachedStore, put []KeyValue, del []KeyValue
} }
} }
func TestMemCachedPersist(t *testing.T) {
t.Run("MemoryStore", func(t *testing.T) {
ps := NewMemoryStore()
testMemCachedStorePersist(t, ps)
})
t.Run("MemoryCachedStore", func(t *testing.T) {
ps1 := NewMemoryStore()
ps2 := NewMemCachedStore(ps1)
testMemCachedStorePersist(t, ps2)
})
t.Run("BoltDBStore", func(t *testing.T) {
ps := newBoltStoreForTesting(t)
testMemCachedStorePersist(t, ps)
})
}
func TestCachedGetFromPersistent(t *testing.T) { func TestCachedGetFromPersistent(t *testing.T) {
key := []byte("key") key := []byte("key")
value := []byte("value") value := []byte("value")