Commit 31b4ff8c authored by Péter Szilágyi's avatar Péter Szilágyi

Merge pull request #2310 from karalabe/ethash-future-cache

Godeps: pull in ethash future cache generator
parents 848e50d6 119b7243
...@@ -20,8 +20,8 @@ ...@@ -20,8 +20,8 @@
}, },
{ {
"ImportPath": "github.com/ethereum/ethash", "ImportPath": "github.com/ethereum/ethash",
"Comment": "v23.1-240-ga524c9f", "Comment": "v23.1-242-gbc9ba4d",
"Rev": "a524c9f7d55cb8925567dc201b44ba555862056d" "Rev": "bc9ba4d6a83a0fe308fefd8c6001b8ed1607137f"
}, },
{ {
"ImportPath": "github.com/fatih/color", "ImportPath": "github.com/fatih/color",
......
...@@ -108,10 +108,13 @@ func freeCache(cache *cache) { ...@@ -108,10 +108,13 @@ func freeCache(cache *cache) {
// Light implements the Verify half of the proof of work. It uses a few small // 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. // in-memory caches to verify the nonces found by Full.
type Light struct { type Light struct {
test bool // if set use a smaller cache size 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 mu sync.Mutex // Protects the per-epoch map of verification caches
NumCaches int // Maximum number of DAGs to cache before eviction (only init, don't modify) 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. // Verify checks whether the block's nonce is valid.
...@@ -192,12 +195,25 @@ func (l *Light) getCache(blockNum uint64) *cache { ...@@ -192,12 +195,25 @@ func (l *Light) getCache(blockNum uint64) *cache {
evict = 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) delete(l.caches, evict.epoch)
} }
// Create and return a new DAG for the epoch // If we have the new DAG pre-generated, use that, otherwise create a new one
c = &cache{epoch: epoch, test: l.test} 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 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() c.used = time.Now()
l.mu.Unlock() l.mu.Unlock()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment