diff --git a/.gitignore b/.gitignore index 10a97cdd..bbbc7134 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,5 @@ Chain/* /core/*/*_test.go /core/*/*/*_test.go /config/* -node nodectl cscope* diff --git a/core/store/ChainStore/ChainStore.go b/core/store/ChainStore/ChainStore.go index 91fafcaa..0c713429 100644 --- a/core/store/ChainStore/ChainStore.go +++ b/core/store/ChainStore/ChainStore.go @@ -73,7 +73,7 @@ func NewChainStore(file string) (*ChainStore, error) { return nil, err } - return &ChainStore{ + chain := &ChainStore{ st: st, headerIndex: map[uint32]Uint256{}, blockCache: map[Uint256]*Block{}, @@ -81,7 +81,11 @@ func NewChainStore(file string) (*ChainStore, error) { currentBlockHeight: 0, storedHeaderCount: 0, disposed: false, - }, nil + } + + ExportStoreStatus(chain) + + return chain, nil } func (bd *ChainStore) InitLedgerStoreWithGenesisBlock(genesisBlock *Block, defaultBookKeeper []*crypto.PubKey) (uint32, error) { diff --git a/core/store/ChainStore/debug.go b/core/store/ChainStore/debug.go new file mode 100644 index 00000000..755ab677 --- /dev/null +++ b/core/store/ChainStore/debug.go @@ -0,0 +1,51 @@ +package ChainStore + +import ( + // . "DNA/common" + "expvar" + "fmt" + // "time" +) + +type storeStatus struct { + CurrHeaderHeight uint32 + CurrBlockHeight uint32 + HeaderCache map[uint32]string + BlockCache map[uint32]string + HeaderIndex map[uint32]string +} + +func expvarStore(store *ChainStore) func() interface{} { + + return func() interface{} { + store.mu.RLock() + defer store.mu.RUnlock() + + ss := storeStatus{ + HeaderIndex: make(map[uint32]string, len(store.headerIndex)), + CurrHeaderHeight: store.GetHeaderHeight(), + CurrBlockHeight: store.GetHeight(), + HeaderCache: make(map[uint32]string, len(store.headerCache)), + BlockCache: make(map[uint32]string, len(store.blockCache)), + } + + for k, hash := range store.headerIndex { + ss.HeaderIndex[k] = fmt.Sprintf("%x", hash) + } + + for k, header := range store.headerCache { + ss.HeaderCache[header.Blockdata.Height] = fmt.Sprintf("%x", k) + } + for k, block := range store.blockCache { + ss.BlockCache[block.Blockdata.Height] = fmt.Sprintf("%x", k) + } + + return ss + } + +} + +func ExportStoreStatus(store *ChainStore) { + + expvar.Publish("dna_store", expvar.Func(expvarStore(store))) +} diff --git a/net/net.go b/net/net.go index 273023f2..eacdee0e 100644 --- a/net/net.go +++ b/net/net.go @@ -25,5 +25,7 @@ func StartProtocol(pubKey *crypto.PubKey) protocol.Noder { net := node.InitNode(pubKey) net.ConnectSeeds() + node.ExportNodeStatus(net) + return net } diff --git a/net/node/debug.go b/net/node/debug.go new file mode 100644 index 00000000..7aad159c --- /dev/null +++ b/net/node/debug.go @@ -0,0 +1,66 @@ +package node + +import ( + . "DNA/net/protocol" + "expvar" + "fmt" + "time" +) + +type PeerStatus struct { + State uint32 + FlightHeights []uint32 + LastContact string + TryTimes uint32 + Addr string // The address of the node + Height uint64 // The node latest block height +} + +type TxPoolStatus struct { + TxCount int +} + +type nodeStatus struct { + Id uint64 + TxnCnt uint64 // The transactions be transmit by this node + RxTxnCnt uint64 // The transaction received by this node + PublicKey string + Peers []PeerStatus + Connectings []string + TxPool TxPoolStatus +} + +func expvarNodeInfo(node *node) func() interface{} { + + return func() interface{} { + pbkey, _ := node.publicKey.EncodePoint(true) + + ns := nodeStatus{ + Id: node.id, + TxnCnt: node.txnCnt, + RxTxnCnt: node.rxTxnCnt, + PublicKey: fmt.Sprintf("%x", pbkey), + TxPool: TxPoolStatus{TxCount: len(node.TXNPool.txnList)}, + Connectings: node.ConnectingAddrs, + } + + for _, n := range node.nbrNodes.List { + peer := PeerStatus{ + State: n.state, + Height: n.height, + FlightHeights: n.flightHeights, + LastContact: fmt.Sprintf("%gs", float64(time.Now().Sub(n.link.time))/float64(time.Second)), + TryTimes: n.tryTimes, + Addr: fmt.Sprintf("%s:%d", n.link.addr, n.link.port), + } + + ns.Peers = append(ns.Peers, peer) + } + + return ns + } +} + +func ExportNodeStatus(nd Noder) { + expvar.Publish("dna_node", expvar.Func(expvarNodeInfo(nd.(*node)))) +}