mirror of
https://github.com/FlipsideCrypto/dcrd.git
synced 2026-02-06 10:56:47 +00:00
The legacy ticket database, which was GOB serialized and stored on shut down, has been removed. Ticket state information is now held in a stake node, which acts as a modularized "black box" to contain all information about the state of the stake system. Stake nodes are now a component of the blockchain blockNode struct, and are updated with them. Stake nodes, like their internal treap primitives, are immutable objects that are created with their connect and disconnect node functions. The blockchain database now stores all information about the stake state of the best node in the block database. The blockchain makes the assumption that the stake state of the best node is known at any given time. If the states of former blocks or sidechains must be evaluated, this can be achieved by iterating backwards along the blockchain from the best node, and then connecting stake nodes iteratively if necessary. Performance improvements with this new module are dramatic. The long delays on start up and shut down are removed. Blockchain synchronization time is improved approximately 5-10x on the mainnet chain. The state of the database is atomic, so unexpected shut downs should no longer have the ability to disrupt the chain state. An upgrade path has been added for version 1 blockchain databases. Users with this blockchain database will automatically update when they start their clients.
85 lines
2.4 KiB
Go
85 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/btcsuite/btclog"
|
|
"github.com/decred/dcrutil"
|
|
)
|
|
|
|
// blockProgressLogger provides periodic logging for other services in order
|
|
// to show users progress of certain "actions" involving some or all current
|
|
// blocks. Ex: syncing to best chain, indexing all blocks, etc.
|
|
type blockProgressLogger struct {
|
|
receivedLogBlocks int64
|
|
receivedLogTx int64
|
|
receivedLogSTx int64
|
|
lastBlockLogTime time.Time
|
|
|
|
subsystemLogger btclog.Logger
|
|
progressAction string
|
|
sync.Mutex
|
|
}
|
|
|
|
// newBlockProgressLogger returns a new block progress logger.
|
|
// The progress message is templated as follows:
|
|
// {progressAction} {numProcessed} {blocks|block} in the last {timePeriod}
|
|
// ({numTxs}, height {lastBlockHeight}, {lastBlockTimeStamp})
|
|
func newBlockProgressLogger(progressMessage string, logger btclog.Logger) *blockProgressLogger {
|
|
return &blockProgressLogger{
|
|
lastBlockLogTime: time.Now(),
|
|
progressAction: progressMessage,
|
|
subsystemLogger: logger,
|
|
}
|
|
}
|
|
|
|
// logBlockHeight logs a new block height as an information message to show
|
|
// progress to the user. In order to prevent spam, it limits logging to one
|
|
// message every 10 seconds with duration and totals included.
|
|
func (b *blockProgressLogger) logBlockHeight(block *dcrutil.Block) {
|
|
b.Lock()
|
|
defer b.Unlock()
|
|
b.receivedLogBlocks++
|
|
b.receivedLogTx += int64(len(block.MsgBlock().Transactions))
|
|
b.receivedLogSTx += int64(len(block.MsgBlock().STransactions))
|
|
|
|
now := time.Now()
|
|
duration := now.Sub(b.lastBlockLogTime)
|
|
if duration < time.Second*10 {
|
|
return
|
|
}
|
|
|
|
// Truncate the duration to 10s of milliseconds.
|
|
durationMillis := int64(duration / time.Millisecond)
|
|
tDuration := 10 * time.Millisecond * time.Duration(durationMillis/10)
|
|
|
|
// Log information about new block height.
|
|
blockStr := "blocks"
|
|
if b.receivedLogBlocks == 1 {
|
|
blockStr = "block"
|
|
}
|
|
txStr := "transactions"
|
|
if b.receivedLogTx == 1 {
|
|
txStr = "transaction"
|
|
}
|
|
stxStr := "stake transactions"
|
|
if b.receivedLogTx == 1 {
|
|
stxStr = "stake transaction"
|
|
}
|
|
b.subsystemLogger.Infof("%s %d %s in the last %s (%d %s, %d %s, height "+
|
|
"%d, %s)",
|
|
b.progressAction, b.receivedLogBlocks, blockStr, tDuration,
|
|
b.receivedLogTx, txStr, b.receivedLogSTx, stxStr, block.Height(),
|
|
block.MsgBlock().Header.Timestamp)
|
|
|
|
b.receivedLogBlocks = 0
|
|
b.receivedLogTx = 0
|
|
b.receivedLogSTx = 0
|
|
b.lastBlockLogTime = now
|
|
}
|
|
|
|
func (b *blockProgressLogger) SetLastLogTime(time time.Time) {
|
|
b.lastBlockLogTime = time
|
|
}
|