Merge pull request #13880 from karalabe/remote-miner-fix

consensus/ethash, eth: don't mine if 0 threads are set
This commit is contained in:
Péter Szilágyi 2017-04-08 20:40:54 +03:00 committed by GitHub
commit badbaf66b6
4 changed files with 31 additions and 12 deletions

View File

@ -555,11 +555,18 @@ func (ethash *Ethash) Threads() int {
// SetThreads updates the number of mining threads currently enabled. Calling // SetThreads updates the number of mining threads currently enabled. Calling
// this method does not start mining, only sets the thread count. If zero is // this method does not start mining, only sets the thread count. If zero is
// specified, the miner will use all cores of the machine. // specified, the miner will use all cores of the machine. Setting a thread
// count below zero is allowed and will cause the miner to idle, without any
// work being done.
func (ethash *Ethash) SetThreads(threads int) { func (ethash *Ethash) SetThreads(threads int) {
ethash.lock.Lock() ethash.lock.Lock()
defer ethash.lock.Unlock() defer ethash.lock.Unlock()
// If we're running a shared PoW, set the thread count on that instead
if ethash.shared != nil {
ethash.shared.SetThreads(threads)
return
}
// Update the threads and ping any running seal to pull in any changes // Update the threads and ping any running seal to pull in any changes
ethash.threads = threads ethash.threads = threads
select { select {

View File

@ -61,6 +61,9 @@ func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, stop
if threads == 0 { if threads == 0 {
threads = runtime.NumCPU() threads = runtime.NumCPU()
} }
if threads < 0 {
threads = 0 // Allows disabling local mining without extra logic around local/remote
}
var pend sync.WaitGroup var pend sync.WaitGroup
for i := 0; i < threads; i++ { for i := 0; i < threads; i++ {
pend.Add(1) pend.Add(1)

View File

@ -139,16 +139,17 @@ func NewPrivateMinerAPI(e *Ethereum) *PrivateMinerAPI {
// threads allowed to use. // threads allowed to use.
func (api *PrivateMinerAPI) Start(threads *int) error { func (api *PrivateMinerAPI) Start(threads *int) error {
// Set the number of threads if the seal engine supports it // Set the number of threads if the seal engine supports it
if threads != nil { if threads == nil {
threads = new(int)
} else if *threads == 0 {
*threads = -1 // Disable the miner from within
}
type threaded interface { type threaded interface {
SetThreads(threads int) SetThreads(threads int)
} }
if th, ok := api.e.engine.(threaded); ok { if th, ok := api.e.engine.(threaded); ok {
log.Info("Updated mining threads", "threads", *threads) log.Info("Updated mining threads", "threads", *threads)
th.SetThreads(*threads) th.SetThreads(*threads)
} else {
log.Warn("Current seal engine isn't threaded")
}
} }
// Start the miner and return // Start the miner and return
if !api.e.IsMining() { if !api.e.IsMining() {
@ -159,6 +160,12 @@ func (api *PrivateMinerAPI) Start(threads *int) error {
// Stop the miner // Stop the miner
func (api *PrivateMinerAPI) Stop() bool { func (api *PrivateMinerAPI) Stop() bool {
type threaded interface {
SetThreads(threads int)
}
if th, ok := api.e.engine.(threaded); ok {
th.SetThreads(-1)
}
api.e.StopMining() api.e.StopMining()
return true return true
} }

View File

@ -240,8 +240,10 @@ func CreateConsensusEngine(ctx *node.ServiceContext, config *Config, chainConfig
log.Warn("Ethash used in shared mode") log.Warn("Ethash used in shared mode")
return ethash.NewShared() return ethash.NewShared()
default: default:
return ethash.New(ctx.ResolvePath(config.EthashCacheDir), config.EthashCachesInMem, config.EthashCachesOnDisk, engine := ethash.New(ctx.ResolvePath(config.EthashCacheDir), config.EthashCachesInMem, config.EthashCachesOnDisk,
config.EthashDatasetDir, config.EthashDatasetsInMem, config.EthashDatasetsOnDisk) config.EthashDatasetDir, config.EthashDatasetsInMem, config.EthashDatasetsOnDisk)
engine.SetThreads(-1) // Disable CPU mining
return engine
} }
} }