mirror of https://github.com/poanetwork/quorum.git
Raft updates (#104)
* Move raft checkpoint logging to logger package. This allows us to use it everywhere and turn it on / off from command flags. * Return an error when the pending block is requested in Raft mode.
This commit is contained in:
parent
e3a0ae2703
commit
852ac74467
|
@ -727,6 +727,8 @@ func RegisterEthService(ctx *cli.Context, stack *node.Node, extra []byte) {
|
|||
blockTimeMillis := ctx.GlobalInt(RaftBlockTime.Name)
|
||||
datadir := ctx.GlobalString(DataDirFlag.Name)
|
||||
|
||||
logger.DoLogRaft = true
|
||||
|
||||
if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||
strId := discover.PubkeyID(stack.PublicKey()).String()
|
||||
blockTimeNanos := time.Duration(blockTimeMillis) * time.Millisecond
|
||||
|
|
|
@ -19,6 +19,7 @@ package eth
|
|||
import (
|
||||
"math/big"
|
||||
|
||||
"fmt"
|
||||
"github.com/ethereum/go-ethereum/accounts"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core"
|
||||
|
@ -33,6 +34,8 @@ import (
|
|||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
var raftHasNoPending = fmt.Errorf("Raft mode has no Pending block. Use latest instead.")
|
||||
|
||||
// EthApiBackend implements ethapi.Backend for full nodes
|
||||
type EthApiBackend struct {
|
||||
eth *Ethereum
|
||||
|
@ -58,6 +61,9 @@ func (b *EthApiBackend) HeaderByNumber(blockNr rpc.BlockNumber) *types.Header {
|
|||
func (b *EthApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) {
|
||||
// Pending block is only known by the miner
|
||||
if blockNr == rpc.PendingBlockNumber {
|
||||
if b.eth.protocolManager.raftMode {
|
||||
return nil, raftHasNoPending
|
||||
}
|
||||
block, _, _ := b.eth.blockVoting.Pending()
|
||||
return block, nil
|
||||
}
|
||||
|
@ -71,6 +77,9 @@ func (b *EthApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumb
|
|||
func (b *EthApiBackend) StateAndHeaderByNumber(blockNr rpc.BlockNumber) (ethapi.State, *types.Header, error) {
|
||||
// Pending state is only known by the miner
|
||||
if blockNr == rpc.PendingBlockNumber {
|
||||
if b.eth.protocolManager.raftMode {
|
||||
return nil, nil, raftHasNoPending
|
||||
}
|
||||
block, publicState, privateState := b.eth.blockVoting.Pending()
|
||||
return EthApiState{publicState, privateState}, block.Header(), nil
|
||||
}
|
||||
|
|
|
@ -21,7 +21,6 @@ import (
|
|||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"math/big"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
@ -1194,12 +1193,10 @@ func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction, si
|
|||
from, _ := signedTx.From()
|
||||
addr := crypto.CreateAddress(from, signedTx.Nonce())
|
||||
glog.V(logger.Info).Infof("Tx(%s) created: %s\n", signedTx.Hash().Hex(), addr.Hex())
|
||||
// XXX(joel) use logCheckpoint
|
||||
log.Printf("RAFT-CHECKPOINT TX-CREATED (%v, %v)\n", signedTx.Hash().Hex(), addr.Hex())
|
||||
logger.LogRaftCheckpoint(logger.TxCreated, signedTx.Hash().Hex(), addr.Hex())
|
||||
} else {
|
||||
glog.V(logger.Info).Infof("Tx(%s) to: %s\n", signedTx.Hash().Hex(), tx.To().Hex())
|
||||
// XXX(joel) use logCheckpoint
|
||||
log.Printf("RAFT-CHECKPOINT TX-CREATED (%v, %v)\n", signedTx.Hash().Hex(), tx.To().Hex())
|
||||
logger.LogRaftCheckpoint(logger.TxCreated, signedTx.Hash().Hex(), tx.To().Hex())
|
||||
}
|
||||
|
||||
return signedTx.Hash(), nil
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
package logger
|
||||
|
||||
import (
|
||||
"github.com/ethereum/go-ethereum/logger/glog"
|
||||
)
|
||||
|
||||
const (
|
||||
TxCreated = "TX-CREATED"
|
||||
TxAccepted = "TX-ACCEPTED"
|
||||
BecameMinter = "BECAME-MINTER"
|
||||
BecameVerifier = "BECAME-VERIFIER"
|
||||
)
|
||||
|
||||
var DoLogRaft = false
|
||||
|
||||
func LogRaftCheckpoint(checkpointName string, logValues ...interface{}) {
|
||||
if DoLogRaft {
|
||||
glog.V(Info).Infof("RAFT-CHECKPOINT %s %v\n", checkpointName, logValues)
|
||||
}
|
||||
}
|
|
@ -26,12 +26,6 @@ const (
|
|||
snapshotPeriod = 250
|
||||
|
||||
peerUrlKeyPrefix = "peerUrl-"
|
||||
|
||||
// checkpoints
|
||||
txCreated = "TX-CREATED"
|
||||
txAccepted = "TX-ACCEPTED"
|
||||
becameMinter = "BECAME-MINTER"
|
||||
becameVerifier = "BECAME-VERIFIER"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
|
@ -350,10 +350,10 @@ func (pm *ProtocolManager) handleRoleChange(roleC <-chan interface{}) {
|
|||
}
|
||||
|
||||
if intRole == minterRole {
|
||||
logCheckpoint(becameMinter, "")
|
||||
logger.LogRaftCheckpoint(logger.BecameMinter)
|
||||
pm.minter.start()
|
||||
} else { // verifier
|
||||
logCheckpoint(becameVerifier, "")
|
||||
logger.LogRaftCheckpoint(logger.BecameVerifier)
|
||||
pm.minter.stop()
|
||||
}
|
||||
|
||||
|
@ -605,10 +605,6 @@ func sleep(duration time.Duration) {
|
|||
<-time.NewTimer(duration).C
|
||||
}
|
||||
|
||||
func logCheckpoint(checkpointName string, iface interface{}) {
|
||||
glog.V(logger.Info).Infof("RAFT-CHECKPOINT %s %v\n", checkpointName, iface)
|
||||
}
|
||||
|
||||
func blockExtendsChain(block *types.Block, chain *core.BlockChain) bool {
|
||||
return block.ParentHash() == chain.CurrentBlock().Hash()
|
||||
}
|
||||
|
@ -628,7 +624,7 @@ func (pm *ProtocolManager) applyNewChainHead(block *types.Block) {
|
|||
}
|
||||
|
||||
for _, tx := range block.Transactions() {
|
||||
logCheckpoint(txAccepted, tx.Hash().Hex())
|
||||
logger.LogRaftCheckpoint(logger.TxAccepted, tx.Hash().Hex())
|
||||
}
|
||||
|
||||
_, err := pm.blockchain.InsertChain([]*types.Block{block})
|
||||
|
|
Loading…
Reference in New Issue