diff options
author | Felix Lange <fjl@users.noreply.github.com> | 2018-01-23 18:05:30 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2018-01-23 18:05:30 +0800 |
commit | 924065e19d08cc7e6af0b3a5b5b1ef3785b79bd4 (patch) | |
tree | 9aefabb6b4c375971570555486ce5b172660661d /consensus/ethash/ethash_test.go | |
parent | 5d4267911a7791bfa60f275a97347372fbf0ce99 (diff) | |
download | go-tangerine-924065e19d08cc7e6af0b3a5b5b1ef3785b79bd4.tar.gz go-tangerine-924065e19d08cc7e6af0b3a5b5b1ef3785b79bd4.tar.zst go-tangerine-924065e19d08cc7e6af0b3a5b5b1ef3785b79bd4.zip |
consensus/ethash: improve cache/dataset handling (#15864)
* consensus/ethash: add maxEpoch constant
* consensus/ethash: improve cache/dataset handling
There are two fixes in this commit:
Unmap the memory through a finalizer like the libethash wrapper did. The
release logic was incorrect and freed the memory while it was being
used, leading to crashes like in #14495 or #14943.
Track caches and datasets using simplelru instead of reinventing LRU
logic. This should make it easier to see whether it's correct.
* consensus/ethash: restore 'future item' logic in lru
* consensus/ethash: use mmap even in test mode
This makes it possible to shorten the time taken for TestCacheFileEvict.
* consensus/ethash: shuffle func calc*Size comments around
* consensus/ethash: ensure future cache/dataset is in the lru cache
* consensus/ethash: add issue link to the new test
* consensus/ethash: fix vet
* consensus/ethash: fix test
* consensus: tiny issue + nitpick fixes
Diffstat (limited to 'consensus/ethash/ethash_test.go')
-rw-r--r-- | consensus/ethash/ethash_test.go | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/consensus/ethash/ethash_test.go b/consensus/ethash/ethash_test.go index b3a2f32f7..31116da43 100644 --- a/consensus/ethash/ethash_test.go +++ b/consensus/ethash/ethash_test.go @@ -17,7 +17,11 @@ package ethash import ( + "io/ioutil" "math/big" + "math/rand" + "os" + "sync" "testing" "github.com/ethereum/go-ethereum/core/types" @@ -38,3 +42,38 @@ func TestTestMode(t *testing.T) { t.Fatalf("unexpected verification error: %v", err) } } + +// This test checks that cache lru logic doesn't crash under load. +// It reproduces https://github.com/ethereum/go-ethereum/issues/14943 +func TestCacheFileEvict(t *testing.T) { + tmpdir, err := ioutil.TempDir("", "ethash-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpdir) + e := New(Config{CachesInMem: 3, CachesOnDisk: 10, CacheDir: tmpdir, PowMode: ModeTest}) + + workers := 8 + epochs := 100 + var wg sync.WaitGroup + wg.Add(workers) + for i := 0; i < workers; i++ { + go verifyTest(&wg, e, i, epochs) + } + wg.Wait() +} + +func verifyTest(wg *sync.WaitGroup, e *Ethash, workerIndex, epochs int) { + defer wg.Done() + + const wiggle = 4 * epochLength + r := rand.New(rand.NewSource(int64(workerIndex))) + for epoch := 0; epoch < epochs; epoch++ { + block := int64(epoch)*epochLength - wiggle/2 + r.Int63n(wiggle) + if block < 0 { + block = 0 + } + head := &types.Header{Number: big.NewInt(block), Difficulty: big.NewInt(100)} + e.VerifySeal(nil, head) + } +} |