From 54dc7328df27d70947400b05809fc444a1da8dcf Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 17 Aug 2018 15:25:00 +0200 Subject: [PATCH] swarm/storage: wait for garbage collection --- swarm/storage/ldbstore.go | 4 ++++ swarm/storage/ldbstore_test.go | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/swarm/storage/ldbstore.go b/swarm/storage/ldbstore.go index dd9e6414e6..a84abc75bf 100644 --- a/swarm/storage/ldbstore.go +++ b/swarm/storage/ldbstore.go @@ -243,6 +243,8 @@ func decodeOldData(data []byte, chunk *Chunk) { } func (s *LDBStore) collectGarbage(ratio float32) { + log.Trace("collectGarbage", "ratio", ratio) + metrics.GetOrRegisterCounter("ldbstore.collectgarbage", nil).Inc(1) it := s.db.NewIterator() @@ -582,11 +584,13 @@ mainLoop: } close(c) for e > s.capacity { + log.Trace("for >", "e", e, "s.capacity", s.capacity) // Collect garbage in a separate goroutine // to be able to interrupt this loop by s.quit. done := make(chan struct{}) go func() { s.collectGarbage(gcArrayFreeRatio) + log.Trace("collectGarbage closing done") close(done) }() diff --git a/swarm/storage/ldbstore_test.go b/swarm/storage/ldbstore_test.go index 51a5c5586f..9694a724e4 100644 --- a/swarm/storage/ldbstore_test.go +++ b/swarm/storage/ldbstore_test.go @@ -27,8 +27,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/log" "github.com/ethereum/go-ethereum/swarm/storage/mock/mem" ldberrors "github.com/syndtr/goleveldb/leveldb/errors" @@ -362,7 +362,7 @@ func TestLDBStoreCollectGarbage(t *testing.T) { log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) // wait for garbage collection to kick in on the responsible actor - time.Sleep(5 * time.Second) + time.Sleep(1 * time.Second) var missing int for i := 0; i < n; i++ { @@ -492,6 +492,9 @@ func TestLDBStoreRemoveThenCollectGarbage(t *testing.T) { <-chunks[i].dbStoredC } + // wait for garbage collection + time.Sleep(1 * time.Second) + // expect for first chunk to be missing, because it has the smallest access value idx := 0 ret, err := ldb.Get(context.TODO(), chunks[idx].Addr)