mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-06-07 14:46:44 +00:00
kaspaminer: User tickers and regulate each block individually (#1580)
* User tickers and regulate each block individually * Add comments, logs and rename variables * Fix review comments
This commit is contained in:
parent
dd3b2cf7d1
commit
837fa65735
@ -44,34 +44,32 @@ func mineLoop(client *minerClient, numberOfBlocks uint64, targetBlocksPerSecond
|
|||||||
|
|
||||||
spawn("blocksLoop", func() {
|
spawn("blocksLoop", func() {
|
||||||
const windowSize = 10
|
const windowSize = 10
|
||||||
var expectedDurationForWindow time.Duration
|
|
||||||
var windowExpectedEndTime time.Time
|
|
||||||
hasBlockRateTarget := targetBlocksPerSecond != 0
|
hasBlockRateTarget := targetBlocksPerSecond != 0
|
||||||
|
var windowTicker, blockTicker *time.Ticker
|
||||||
|
// We use tickers to limit the block rate:
|
||||||
|
// 1. windowTicker -> makes sure that the last windowSize blocks take at least windowSize*targetBlocksPerSecond.
|
||||||
|
// 2. blockTicker -> makes sure that each block takes at least targetBlocksPerSecond/windowSize.
|
||||||
|
// that way we both allow for fluctuation in block rate but also make sure they're not too big (by an order of magnitude)
|
||||||
if hasBlockRateTarget {
|
if hasBlockRateTarget {
|
||||||
expectedDurationForWindow = time.Duration(float64(windowSize)/targetBlocksPerSecond) * time.Second
|
windowRate := time.Duration(float64(time.Second) / (targetBlocksPerSecond / windowSize))
|
||||||
windowExpectedEndTime = time.Now().Add(expectedDurationForWindow)
|
blockRate := time.Duration(float64(time.Second) / (targetBlocksPerSecond * windowSize))
|
||||||
|
log.Infof("Minimum average time per %d blocks: %s, smaller minimum time per block: %s", windowSize, windowRate, blockRate)
|
||||||
|
windowTicker = time.NewTicker(windowRate)
|
||||||
|
blockTicker = time.NewTicker(blockRate)
|
||||||
|
defer windowTicker.Stop()
|
||||||
|
defer blockTicker.Stop()
|
||||||
}
|
}
|
||||||
blockInWindowIndex := 0
|
windowStart := time.Now()
|
||||||
|
for blockIndex := 1; ; blockIndex++ {
|
||||||
sleepTime := 0 * time.Second
|
|
||||||
|
|
||||||
for {
|
|
||||||
foundBlockChan <- mineNextBlock(mineWhenNotSynced)
|
foundBlockChan <- mineNextBlock(mineWhenNotSynced)
|
||||||
|
|
||||||
if hasBlockRateTarget {
|
if hasBlockRateTarget {
|
||||||
blockInWindowIndex++
|
<-blockTicker.C
|
||||||
if blockInWindowIndex == windowSize-1 {
|
if (blockIndex % windowSize) == 0 {
|
||||||
deviation := windowExpectedEndTime.Sub(time.Now())
|
tickerStart := time.Now()
|
||||||
if deviation > 0 {
|
<-windowTicker.C
|
||||||
sleepTime = deviation / windowSize
|
log.Infof("Finished mining %d blocks in: %s. slept for: %s", windowSize, time.Since(windowStart), time.Since(tickerStart))
|
||||||
log.Infof("Finished to mine %d blocks %s earlier than expected. Setting the miner "+
|
windowStart = time.Now()
|
||||||
"to sleep %s between blocks to compensate",
|
|
||||||
windowSize, deviation, sleepTime)
|
|
||||||
}
|
}
|
||||||
blockInWindowIndex = 0
|
|
||||||
windowExpectedEndTime = time.Now().Add(expectedDurationForWindow)
|
|
||||||
}
|
|
||||||
time.Sleep(sleepTime)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user