@@ -1751,7 +1751,7 @@ def order_3pc_key(self, key):
1751
1751
if self .isMaster :
1752
1752
self .metrics .add_event (MetricsName .MASTER_ORDERED_BATCH_SIZE , pp .discarded )
1753
1753
1754
- self .addToCheckpoint (pp .ppSeqNo , pp .digest , pp .ledgerId )
1754
+ self .addToCheckpoint (pp .ppSeqNo , pp .digest , pp .ledgerId , pp . viewNo )
1755
1755
1756
1756
# BLS multi-sig:
1757
1757
self ._bls_bft_replica .process_order (key , self .quorums , pp )
@@ -1782,6 +1782,12 @@ def processCheckpoint(self, msg: Checkpoint, sender: str) -> bool:
1782
1782
self .discard (msg , reason = "Checkpoint already stable" , logMethod = self .logger .debug )
1783
1783
return True
1784
1784
1785
+ if self .isPrimary is None and msg .viewNo < self .viewNo :
1786
+ self .discard (msg ,
1787
+ reason = "Checkpoint from previous view" ,
1788
+ logMethod = self .logger .debug )
1789
+ return True
1790
+
1785
1791
seqNoStart = msg .seqNoStart
1786
1792
key = (seqNoStart , seqNoEnd )
1787
1793
@@ -1830,7 +1836,7 @@ def __start_catchup_if_needed(self):
1830
1836
format (self , lag_in_checkpoints ))
1831
1837
self .node .start_catchup ()
1832
1838
1833
- def addToCheckpoint (self , ppSeqNo , digest , ledger_id ):
1839
+ def addToCheckpoint (self , ppSeqNo , digest , ledger_id , view_no ):
1834
1840
for (s , e ) in self .checkpoints .keys ():
1835
1841
if s <= ppSeqNo <= e :
1836
1842
state = self .checkpoints [s , e ] # type: CheckpointState
@@ -1858,11 +1864,11 @@ def addToCheckpoint(self, ppSeqNo, digest, ledger_id):
1858
1864
self .checkpoints [s , e ] = state
1859
1865
self .logger .info ("{} sending Checkpoint {} view {} checkpointState digest {}. Ledger {} "
1860
1866
"txn root hash {}. Committed state root hash {} Uncommitted state root hash {}" .
1861
- format (self , (s , e ), self . viewNo , state .digest , ledger_id ,
1867
+ format (self , (s , e ), view_no , state .digest , ledger_id ,
1862
1868
self .txnRootHash (ledger_id ), self .stateRootHash (ledger_id , committed = True ),
1863
1869
self .stateRootHash (ledger_id , committed = False )))
1864
- self .send (Checkpoint (self .instId , self . viewNo , s , e , state .digest ))
1865
- self .processStashedCheckpoints ((s , e ))
1870
+ self .send (Checkpoint (self .instId , view_no , s , e , state .digest ))
1871
+ self .processStashedCheckpoints ((s , e ), view_no )
1866
1872
1867
1873
def markCheckPointStable (self , seqNo ):
1868
1874
previousCheckpoints = []
@@ -1929,16 +1935,16 @@ def stashed_checkpoints_with_quorum(self):
1929
1935
end_pp_seq_numbers .append (seq_no_end )
1930
1936
return sorted (end_pp_seq_numbers )
1931
1937
1932
- def processStashedCheckpoints (self , key ):
1938
+ def processStashedCheckpoints (self , key , view_no ):
1933
1939
# Remove all checkpoints from previous views if any
1934
1940
self ._remove_stashed_checkpoints (till_3pc_key = (self .viewNo , 0 ))
1935
1941
1936
- if key not in self .stashedRecvdCheckpoints .get (self . viewNo , {}):
1942
+ if key not in self .stashedRecvdCheckpoints .get (view_no , {}):
1937
1943
self .logger .trace ("{} have no stashed checkpoints for {}" )
1938
- return 0
1944
+ return
1939
1945
1940
1946
# Get a snapshot of all the senders of stashed checkpoints for `key`
1941
- senders = list (self .stashedRecvdCheckpoints [self . viewNo ][key ].keys ())
1947
+ senders = list (self .stashedRecvdCheckpoints [view_no ][key ].keys ())
1942
1948
total_processed = 0
1943
1949
consumed = 0
1944
1950
@@ -1947,11 +1953,11 @@ def processStashedCheckpoints(self, key):
1947
1953
# `stashedRecvdCheckpoints` because it might be removed from there
1948
1954
# in case own checkpoint was stabilized when we were processing
1949
1955
# stashed checkpoints from previous senders in this loop
1950
- if self . viewNo in self .stashedRecvdCheckpoints \
1951
- and key in self .stashedRecvdCheckpoints [self . viewNo ] \
1952
- and sender in self .stashedRecvdCheckpoints [self . viewNo ][key ]:
1956
+ if view_no in self .stashedRecvdCheckpoints \
1957
+ and key in self .stashedRecvdCheckpoints [view_no ] \
1958
+ and sender in self .stashedRecvdCheckpoints [view_no ][key ]:
1953
1959
if self .processCheckpoint (
1954
- self .stashedRecvdCheckpoints [self . viewNo ][key ].pop (sender ),
1960
+ self .stashedRecvdCheckpoints [view_no ][key ].pop (sender ),
1955
1961
sender ):
1956
1962
consumed += 1
1957
1963
# Note that if `processCheckpoint` returned False then the
@@ -1961,12 +1967,12 @@ def processStashedCheckpoints(self, key):
1961
1967
1962
1968
# If we have consumed stashed checkpoints for `key` from all the
1963
1969
# senders then remove entries which have become empty
1964
- if self . viewNo in self .stashedRecvdCheckpoints \
1965
- and key in self .stashedRecvdCheckpoints [self . viewNo ] \
1966
- and len (self .stashedRecvdCheckpoints [self . viewNo ][key ]) == 0 :
1967
- del self .stashedRecvdCheckpoints [self . viewNo ][key ]
1968
- if len (self .stashedRecvdCheckpoints [self . viewNo ]) == 0 :
1969
- del self .stashedRecvdCheckpoints [self . viewNo ]
1970
+ if view_no in self .stashedRecvdCheckpoints \
1971
+ and key in self .stashedRecvdCheckpoints [view_no ] \
1972
+ and len (self .stashedRecvdCheckpoints [view_no ][key ]) == 0 :
1973
+ del self .stashedRecvdCheckpoints [view_no ][key ]
1974
+ if len (self .stashedRecvdCheckpoints [view_no ]) == 0 :
1975
+ del self .stashedRecvdCheckpoints [view_no ]
1970
1976
1971
1977
restashed = total_processed - consumed
1972
1978
self .logger .info ('{} processed {} stashed checkpoints for {}, '
0 commit comments