aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2016-03-08 22:55:22 +0800
committerPéter Szilágyi <peterke@gmail.com>2016-03-08 22:55:22 +0800
commit31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1 (patch)
tree8b20e1e0c872aad9af99f5ad74d645ae7a6f2102
parent848e50d6fb94435891cf6e19f29e30d622ddfe9b (diff)
parent119b7243627c1370588f8057217f25a56aa00584 (diff)
downloadgo-tangerine-31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1.tar
go-tangerine-31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1.tar.gz
go-tangerine-31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1.tar.bz2
go-tangerine-31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1.tar.lz
go-tangerine-31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1.tar.xz
go-tangerine-31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1.tar.zst
go-tangerine-31b4ff8cc12cce8fb94538c2f6d5f6da883b10d1.zip
Merge pull request #2310 from karalabe/ethash-future-cache
Godeps: pull in ethash future cache generator
-rw-r--r--Godeps/Godeps.json4
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go30
2 files changed, 25 insertions, 9 deletions
diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
index 6010309a2..7b6ba5c3c 100644
--- a/Godeps/Godeps.json
+++ b/Godeps/Godeps.json
@@ -20,8 +20,8 @@
},
{
"ImportPath": "github.com/ethereum/ethash",
- "Comment": "v23.1-240-ga524c9f",
- "Rev": "a524c9f7d55cb8925567dc201b44ba555862056d"
+ "Comment": "v23.1-242-gbc9ba4d",
+ "Rev": "bc9ba4d6a83a0fe308fefd8c6001b8ed1607137f"
},
{
"ImportPath": "github.com/fatih/color",
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
index ad59dd5e3..60121bb3b 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
@@ -108,10 +108,13 @@ func freeCache(cache *cache) {
// Light implements the Verify half of the proof of work. It uses a few small
// in-memory caches to verify the nonces found by Full.
type Light struct {
- test bool // if set use a smaller cache size
- mu sync.Mutex // protects the per-epoch map of DAGs
- caches map[uint64]*cache // currently cached verification DAGs
- NumCaches int // Maximum number of DAGs to cache before eviction (only init, don't modify)
+ test bool // If set, use a smaller cache size
+
+ mu sync.Mutex // Protects the per-epoch map of verification caches
+ caches map[uint64]*cache // Currently maintained verification caches
+ future *cache // Pre-generated cache for the estimated future DAG
+
+ NumCaches int // Maximum number of caches to keep before eviction (only init, don't modify)
}
// Verify checks whether the block's nonce is valid.
@@ -192,12 +195,25 @@ func (l *Light) getCache(blockNum uint64) *cache {
evict = cache
}
}
- glog.V(logger.Info).Infof("Evicting DAG for epoch %d in favour of epoch %d", evict.epoch, epoch)
+ glog.V(logger.Debug).Infof("Evicting DAG for epoch %d in favour of epoch %d", evict.epoch, epoch)
delete(l.caches, evict.epoch)
}
- // Create and return a new DAG for the epoch
- c = &cache{epoch: epoch, test: l.test}
+ // If we have the new DAG pre-generated, use that, otherwise create a new one
+ if l.future != nil && l.future.epoch == epoch {
+ glog.V(logger.Debug).Infof("Using pre-generated DAG for epoch %d", epoch)
+ c, l.future = l.future, nil
+ } else {
+ glog.V(logger.Debug).Infof("No pre-generated DAG available, creating new for epoch %d", epoch)
+ c = &cache{epoch: epoch, test: l.test}
+ }
l.caches[epoch] = c
+
+ // If we just used up the future cache, or need a refresh, regenerate
+ if l.future == nil || l.future.epoch <= epoch {
+ glog.V(logger.Debug).Infof("Pre-generating DAG for epoch %d", epoch+1)
+ l.future = &cache{epoch: epoch + 1, test: l.test}
+ go l.future.generate()
+ }
}
c.used = time.Now()
l.mu.Unlock()