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

Godeps: pull in ethash future cache generator
This commit is contained in:
Péter Szilágyi 2016-03-08 16:55:22 +02:00
commit 31b4ff8cc1
2 changed files with 25 additions and 9 deletions

4
Godeps/Godeps.json generated
View File

@ -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",

View File

@ -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 {
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
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} 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()