Commit c736f790 authored by mdj33's avatar mdj33 Committed by vipwzw

process continuous del type case

parent 23971884
...@@ -377,14 +377,13 @@ func (client *client) GetLastSeqOnMainChain() (int64, error) { ...@@ -377,14 +377,13 @@ func (client *client) GetLastSeqOnMainChain() (int64, error) {
func (client *client) GetSeqByHashOnMainChain(hash []byte) (int64, error) { func (client *client) GetSeqByHashOnMainChain(hash []byte) (int64, error) {
seq, err := client.grpcClient.GetSequenceByHash(context.Background(), &types.ReqHash{Hash: hash}) seq, err := client.grpcClient.GetSequenceByHash(context.Background(), &types.ReqHash{Hash: hash})
if err != nil { if err != nil {
plog.Error("GetLastSeqOnMainChain", "Error", err.Error()) plog.Error("GetSeqByHashOnMainChain", "Error", err.Error())
return -1, err return -1, err
} }
//the reflect checked in grpcHandle //the reflect checked in grpcHandle
return seq.Data, nil return seq.Data, nil
} }
func (client *client) GetBlocksByHashesFromMainChain(hashes [][]byte) (*types.BlockDetails, error) { func (client *client) GetBlocksByHashesFromMainChain(hashes [][]byte) (*types.BlockDetails, error) {
req := &types.ReqHashes{Hashes: hashes} req := &types.ReqHashes{Hashes: hashes}
blocks, err := client.grpcClient.GetBlockByHashes(context.Background(), req) blocks, err := client.grpcClient.GetBlockByHashes(context.Background(), req)
...@@ -438,12 +437,13 @@ func (client *client) RequestTx(seq *int64, preMainBlockHash *[]byte) ([]*types. ...@@ -438,12 +437,13 @@ func (client *client) RequestTx(seq *int64, preMainBlockHash *[]byte) ([]*types.
if err != nil { if err != nil {
return nil, nil, -1, err return nil, nil, -1, err
} }
plog.Info("RequestTx", "LastSeq", lastSeq, "CurrSeq", currSeq) plog.Info("RequestTx", "LastMainSeq", lastSeq, "CurrSeq", currSeq)
if lastSeq >= currSeq { if lastSeq >= currSeq {
blockDetail, seqTy, err := client.GetBlockOnMainBySeq(currSeq) blockDetail, seqTy, err := client.GetBlockOnMainBySeq(currSeq)
if err != nil { if err != nil {
return nil, nil, -1, err return nil, nil, -1, err
} }
//genesis block with seq=-1 not check //genesis block with seq=-1 not check
if currSeq == 0 || if currSeq == 0 ||
(bytes.Equal(*preMainBlockHash, blockDetail.Block.ParentHash) && seqTy == addAct) || (bytes.Equal(*preMainBlockHash, blockDetail.Block.ParentHash) && seqTy == addAct) ||
...@@ -465,6 +465,8 @@ func (client *client) RequestTx(seq *int64, preMainBlockHash *[]byte) ([]*types. ...@@ -465,6 +465,8 @@ func (client *client) RequestTx(seq *int64, preMainBlockHash *[]byte) ([]*types.
return txs, blockDetail.Block, seqTy, nil return txs, blockDetail.Block, seqTy, nil
} }
//not consistent case be processed at below //not consistent case be processed at below
plog.Error("RequestTx", "preMainHash", common.Bytes2Hex(*preMainBlockHash), "currSeq parentHash", common.Bytes2Hex(blockDetail.Block.ParentHash),
"currSeq currentHash", common.Bytes2Hex(blockDetail.Block.Hash()), "curr seq", currSeq, "ty", seqTy, "currSeq Mainheight", blockDetail.Block.Height)
} }
//lastSeq < CurrSeq case: //lastSeq < CurrSeq case:
...@@ -478,19 +480,19 @@ func (client *client) RequestTx(seq *int64, preMainBlockHash *[]byte) ([]*types. ...@@ -478,19 +480,19 @@ func (client *client) RequestTx(seq *int64, preMainBlockHash *[]byte) ([]*types.
// 1. lastSeq < currSeq-1 // 1. lastSeq < currSeq-1
// 2. lastSeq >= currSeq and seq not consistent or fork case // 2. lastSeq >= currSeq and seq not consistent or fork case
// whether found matched block or not, return err to re-requestTx // whether found matched block or not, return err to re-requestTx
client.findHashMatchedBlock(seq, preMainBlockHash) client.switchHashMatchedBlock(seq, preMainBlockHash)
return nil, nil, -1, errors.New("hash not matched") return nil, nil, -1, errors.New("hash not matched")
} }
// search base on para block but not last MainBlockHash, last MainBlockHash can not back tracing // search base on para block but not last MainBlockHash, last MainBlockHash can not back tracing
func (client *client) findHashMatchedBlock(currSeq *int64, preMainBlockHash *[]byte) { func (client *client) switchHashMatchedBlock(currSeq *int64, preMainBlockHash *[]byte) {
lastBlock, err := client.RequestLastBlock() lastBlock, err := client.RequestLastBlock()
if err != nil { if err != nil {
plog.Error("Parachain RequestLastBlock fail", "err", err) plog.Error("Parachain RequestLastBlock fail", "err", err)
return return
} }
//genesis block scenario, get new main node's blockHash as preMainHash, genesis sequence as currSeq //genesis block scenario, get new main node's blockHash as preMainHash, genesis sequence as currSeq
if lastBlock.Height ==0 { if lastBlock.Height == 0 {
lastSeq, _, lastSeqMainHash, _, err := client.getLastBlockInfo() lastSeq, _, lastSeqMainHash, _, err := client.getLastBlockInfo()
if err != nil { if err != nil {
plog.Error("Parachain GetLastSeq fail", "err", err) plog.Error("Parachain GetLastSeq fail", "err", err)
...@@ -498,6 +500,7 @@ func (client *client) findHashMatchedBlock(currSeq *int64, preMainBlockHash *[]b ...@@ -498,6 +500,7 @@ func (client *client) findHashMatchedBlock(currSeq *int64, preMainBlockHash *[]b
} }
*currSeq = lastSeq *currSeq = lastSeq
*preMainBlockHash = lastSeqMainHash *preMainBlockHash = lastSeqMainHash
plog.Error("switchHashMatchedBlock sync from height 0")
return return
} }
...@@ -511,13 +514,33 @@ func (client *client) findHashMatchedBlock(currSeq *int64, preMainBlockHash *[]b ...@@ -511,13 +514,33 @@ func (client *client) findHashMatchedBlock(currSeq *int64, preMainBlockHash *[]b
if err != nil { if err != nil {
return return
} }
plog.Info("switchHashMatchedBlock", "lastBlock height", miner.Height, "mainheight",
miner.MainBlockHeight, "mainhash", common.Bytes2Hex(miner.MainBlockHash))
mainSeq, err := client.GetSeqByHashOnMainChain(miner.MainBlockHash) mainSeq, err := client.GetSeqByHashOnMainChain(miner.MainBlockHash)
if err != nil { if err != nil {
findDepth-- findDepth--
if findDepth == 0 { if findDepth == 0 {
plog.Error("findHashMatchedBlock depth overflow", "last info:mainHeight", miner.MainBlockHeight, plog.Error("switchHashMatchedBlock depth overflow", "last info:mainHeight", miner.MainBlockHeight,
"mainHash", string(miner.MainBlockHash), "search depth", searchHashMatchBlockDepth) "mainHash", common.Bytes2Hex(miner.MainBlockHash), "search depth", searchHashMatchBlockDepth)
panic("findHashMatchedBlock depth overflow, restart and re-connect main node") panic("switchHashMatchedBlock depth overflow, restart and re-connect main node")
}
if height == 1 {
plog.Error("switchHashMatchedBlock search to height=1 not found", "lastBlockHeight", lastBlock.Height,
"height1 mainHash", common.Bytes2Hex(miner.MainBlockHash))
err = client.removeBlocks(0)
if err != nil {
*preMainBlockHash = nil
return
}
lastSeq, _, lastSeqMainHash, _, err := client.getLastBlockInfo()
if err != nil {
plog.Error("Parachain GetLastSeq fail", "err", err)
return
}
*currSeq = lastSeq
*preMainBlockHash = lastSeqMainHash
plog.Error("switchHashMatchedBlock sync from height 0")
return
} }
continue continue
} }
...@@ -531,6 +554,7 @@ func (client *client) findHashMatchedBlock(currSeq *int64, preMainBlockHash *[]b ...@@ -531,6 +554,7 @@ func (client *client) findHashMatchedBlock(currSeq *int64, preMainBlockHash *[]b
*currSeq = mainSeq + 1 *currSeq = mainSeq + 1
*preMainBlockHash = miner.MainBlockHash *preMainBlockHash = miner.MainBlockHash
plog.Info("switchHashMatchedBlock succ", "currHeight", height, "lastHeight", lastBlock.Height, "set new currSeq", *currSeq, "new preMainBlockHash", common.Bytes2Hex(*preMainBlockHash))
return return
} }
} }
...@@ -557,7 +581,7 @@ func (client *client) removeBlocks(endHeight int64) error { ...@@ -557,7 +581,7 @@ func (client *client) removeBlocks(endHeight int64) error {
plog.Error("Parachain GetBlockedSeq fail", "err", err) plog.Error("Parachain GetBlockedSeq fail", "err", err)
return err return err
} }
plog.Error("Parachain removeBlocks succ", "localHeight", lastBlock.Height, "blockedSeq", blockedSeq)
} }
} }
...@@ -589,17 +613,23 @@ func (client *client) CreateBlock() { ...@@ -589,17 +613,23 @@ func (client *client) CreateBlock() {
time.Sleep(time.Second) time.Sleep(time.Second)
continue continue
} }
lastSeqMainHash = blockOnMain.Hash()
lastSeqMainHeight := blockOnMain.Height lastSeqMainHeight := blockOnMain.Height
lastSeqMainHash = blockOnMain.Hash()
if seqTy == delAct {
lastSeqMainHash = blockOnMain.ParentHash
}
_, lastBlock, _, lastBlockMainHeight, err := client.getLastBlockInfo() _, lastBlock, lastBlockMainHash, lastBlockMainHeight, err := client.getLastBlockInfo()
if err != nil { if err != nil {
plog.Error("Parachain GetLastSeq fail", "err", err) plog.Error("Parachain GetLastSeq fail", "err", err)
time.Sleep(time.Second) time.Sleep(time.Second)
continue continue
} }
plog.Info("Parachain process block", "lastSeq", lastSeq, "curSeq", currSeq, "lastSeqMainHeight", lastSeqMainHeight, "lastBlockMainHeight", lastBlockMainHeight) plog.Info("Parachain process block", "lastSeq", lastSeq, "curSeq", currSeq,
"lastSeqMainHeight", lastSeqMainHeight, "lastSeqMainHash", common.ToHex(lastSeqMainHash),
"lastBlockMainHeight", lastBlockMainHeight, "lastBlockMainHash", common.ToHex(lastBlockMainHash))
if seqTy == delAct { if seqTy == delAct {
if len(txs) == 0 { if len(txs) == 0 {
...@@ -709,7 +739,6 @@ func (client *client) WriteBlock(prev []byte, paraBlock *types.Block, seq int64) ...@@ -709,7 +739,6 @@ func (client *client) WriteBlock(prev []byte, paraBlock *types.Block, seq int64)
return nil return nil
} }
// 向blockchain删区块 // 向blockchain删区块
func (client *client) DelBlock(block *types.Block, seq int64) error { func (client *client) DelBlock(block *types.Block, seq int64) error {
plog.Debug("delete block in parachain") plog.Debug("delete block in parachain")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment