aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/storage/localstore_test.go
diff options
context:
space:
mode:
authorFerenc Szabo <frncmx@gmail.com>2018-11-13 14:41:01 +0800
committerViktor TrĂ³n <viktor.tron@gmail.com>2018-11-13 14:41:01 +0800
commit8080265f3f591d33e127a924724a8bfe5ced6475 (patch)
treef5556b59dee64d399d61b6f7cb4e97bde69f29d0 /swarm/storage/localstore_test.go
parent1212c7b844e3ef13cbb5476b088eae27782535b4 (diff)
downloadgo-tangerine-8080265f3f591d33e127a924724a8bfe5ced6475.tar
go-tangerine-8080265f3f591d33e127a924724a8bfe5ced6475.tar.gz
go-tangerine-8080265f3f591d33e127a924724a8bfe5ced6475.tar.bz2
go-tangerine-8080265f3f591d33e127a924724a8bfe5ced6475.tar.lz
go-tangerine-8080265f3f591d33e127a924724a8bfe5ced6475.tar.xz
go-tangerine-8080265f3f591d33e127a924724a8bfe5ced6475.tar.zst
go-tangerine-8080265f3f591d33e127a924724a8bfe5ced6475.zip
swarm/storage: fix access count on dbstore after cache hit (#17978)
Access count was not incremented when chunk was retrieved from cache. So the garbage collector might have deleted the most frequently accessed chunk from disk. Co-authored-by: Ferenc Szabo <ferenc.szabo@ethereum.org>
Diffstat (limited to 'swarm/storage/localstore_test.go')
-rw-r--r--swarm/storage/localstore_test.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/swarm/storage/localstore_test.go b/swarm/storage/localstore_test.go
index 10f43f30f..7a07726d1 100644
--- a/swarm/storage/localstore_test.go
+++ b/swarm/storage/localstore_test.go
@@ -21,6 +21,7 @@ import (
"io/ioutil"
"os"
"testing"
+ "time"
ch "github.com/ethereum/go-ethereum/swarm/chunk"
)
@@ -144,3 +145,67 @@ func put(store *LocalStore, n int, f func(i int64) Chunk) (hs []Address, errs []
}
return hs, errs
}
+
+// TestGetFrequentlyAccessedChunkWontGetGarbageCollected tests that the most
+// frequently accessed chunk is not garbage collected from LDBStore, i.e.,
+// from disk when we are at the capacity and garbage collector runs. For that
+// we start putting random chunks into the DB while continuously accessing the
+// chunk we care about then check if we can still retrieve it from disk.
+func TestGetFrequentlyAccessedChunkWontGetGarbageCollected(t *testing.T) {
+ ldbCap := defaultGCRatio
+ store, cleanup := setupLocalStore(t, ldbCap)
+ defer cleanup()
+
+ var chunks []Chunk
+ for i := 0; i < ldbCap; i++ {
+ chunks = append(chunks, GenerateRandomChunk(ch.DefaultSize))
+ }
+
+ mostAccessed := chunks[0].Address()
+ for _, chunk := range chunks {
+ if err := store.Put(context.Background(), chunk); err != nil {
+ t.Fatal(err)
+ }
+
+ if _, err := store.Get(context.Background(), mostAccessed); err != nil {
+ t.Fatal(err)
+ }
+ // Add time for MarkAccessed() to be able to finish in a separate Goroutine
+ time.Sleep(1 * time.Millisecond)
+ }
+
+ store.DbStore.collectGarbage()
+ if _, err := store.DbStore.Get(context.Background(), mostAccessed); err != nil {
+ t.Logf("most frequntly accessed chunk not found on disk (key: %v)", mostAccessed)
+ t.Fatal(err)
+ }
+
+}
+
+func setupLocalStore(t *testing.T, ldbCap int) (ls *LocalStore, cleanup func()) {
+ t.Helper()
+
+ var err error
+ datadir, err := ioutil.TempDir("", "storage")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ params := &LocalStoreParams{
+ StoreParams: NewStoreParams(uint64(ldbCap), uint(ldbCap), nil, nil),
+ }
+ params.Init(datadir)
+
+ store, err := NewLocalStore(params, nil)
+ if err != nil {
+ _ = os.RemoveAll(datadir)
+ t.Fatal(err)
+ }
+
+ cleanup = func() {
+ store.Close()
+ _ = os.RemoveAll(datadir)
+ }
+
+ return store, cleanup
+}