@@ -241,6 +241,8 @@ public class Manager {
241241 @ Getter
242242 private volatile long latestSolidityNumShutDown ;
243243 @ Getter
244+ private long lastUsedSolidityNum = -1 ;
245+ @ Getter
244246 private int maxFlushCount ;
245247
246248 @ Getter
@@ -2030,17 +2032,11 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif
20302032 return ;
20312033 }
20322034
2033- BlockCapsule blockCapsule ;
2034- try {
2035- blockCapsule = chainBaseManager .getBlockByNum (latestSolidifiedBlockNumber );
2036- } catch (Exception e ) {
2037- logger .error ("PostSolidityFilter getBlockByNum = {} except, {}." ,
2038- latestSolidifiedBlockNumber , e .getMessage ());
2039- return ;
2035+ List <BlockCapsule > capsuleList = getContinuousBlockCapsule (latestSolidifiedBlockNumber );
2036+ for (BlockCapsule blockCapsule : capsuleList ) {
2037+ postBlockFilter (blockCapsule , true );
2038+ postLogsFilter (blockCapsule , true , false );
20402039 }
2041-
2042- postBlockFilter (blockCapsule , true );
2043- postLogsFilter (blockCapsule , true , false );
20442040 }
20452041
20462042 private void postSolidityTrigger (final long oldSolidNum , final long latestSolidifiedBlockNumber ) {
@@ -2057,28 +2053,23 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi
20572053 }
20582054
20592055 if (eventPluginLoaded && EventPluginLoader .getInstance ().isSolidityTriggerEnable ()) {
2060- SolidityTriggerCapsule solidityTriggerCapsule
2061- = new SolidityTriggerCapsule (latestSolidifiedBlockNumber );
2062-
2063- BlockCapsule blockCapsule ;
2064- try {
2065- blockCapsule = chainBaseManager .getBlockByNum (latestSolidifiedBlockNumber );
2056+ List <BlockCapsule > capsuleList = getContinuousBlockCapsule (latestSolidifiedBlockNumber );
2057+ for (BlockCapsule blockCapsule : capsuleList ) {
2058+ SolidityTriggerCapsule solidityTriggerCapsule
2059+ = new SolidityTriggerCapsule (blockCapsule .getNum ());//unique key
20662060 solidityTriggerCapsule .setTimeStamp (blockCapsule .getTimeStamp ());
2067- } catch (Exception e ) {
2068- logger .error ("PostSolidityTrigger getBlockByNum = {} except, {}." ,
2069- latestSolidifiedBlockNumber , e .getMessage ());
2070- }
2071-
2072- boolean result = triggerCapsuleQueue .offer (solidityTriggerCapsule );
2073- if (!result ) {
2074- logger .info ("Too many trigger, lost solidified trigger, block number: {}." ,
2075- latestSolidifiedBlockNumber );
2061+ boolean result = triggerCapsuleQueue .offer (solidityTriggerCapsule );
2062+ if (!result ) {
2063+ logger .info ("Too many trigger, lost solidified trigger, block number: {}." ,
2064+ blockCapsule .getNum ());
2065+ }
20762066 }
20772067 }
20782068
20792069 if (CommonParameter .getInstance ().isJsonRpcHttpSolidityNodeEnable ()) {
20802070 postSolidityFilter (oldSolidNum , latestSolidifiedBlockNumber );
20812071 }
2072+ lastUsedSolidityNum = latestSolidifiedBlockNumber ;
20822073 }
20832074
20842075 private void processTransactionTrigger (BlockCapsule newBlock ) {
@@ -2189,53 +2180,63 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified,
21892180 }
21902181
21912182 private void postBlockTrigger (final BlockCapsule blockCapsule ) {
2192- BlockCapsule newBlock = blockCapsule ;
2193-
21942183 // post block and logs for jsonrpc
21952184 if (CommonParameter .getInstance ().isJsonRpcHttpFullNodeEnable ()) {
21962185 postBlockFilter (blockCapsule , false );
21972186 postLogsFilter (blockCapsule , false , false );
21982187 }
21992188
22002189 // process block trigger
2190+ long solidityBlkNum = getDynamicPropertiesStore ().getLatestSolidifiedBlockNum ();
22012191 if (eventPluginLoaded && EventPluginLoader .getInstance ().isBlockLogTriggerEnable ()) {
2192+ List <BlockCapsule > capsuleList = new ArrayList <>();
22022193 if (EventPluginLoader .getInstance ().isBlockLogTriggerSolidified ()) {
2203- long solidityBlkNum = getDynamicPropertiesStore ().getLatestSolidifiedBlockNum ();
2204- try {
2205- newBlock = chainBaseManager
2206- .getBlockByNum (solidityBlkNum );
2207- } catch (Exception e ) {
2208- logger .error ("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}." ,
2209- solidityBlkNum , e .getMessage ());
2210- }
2194+ capsuleList = getContinuousBlockCapsule (solidityBlkNum );
2195+ } else {
2196+ capsuleList .add (blockCapsule );
22112197 }
22122198
2213- BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule (newBlock );
2214- blockLogTriggerCapsule .setLatestSolidifiedBlockNumber (getDynamicPropertiesStore ()
2215- .getLatestSolidifiedBlockNum ());
2216- if (!triggerCapsuleQueue .offer (blockLogTriggerCapsule )) {
2217- logger .info ("Too many triggers, block trigger lost: {}." , newBlock .getBlockId ());
2199+ for (BlockCapsule capsule : capsuleList ) {
2200+ BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule (capsule );
2201+ blockLogTriggerCapsule .setLatestSolidifiedBlockNumber (solidityBlkNum );
2202+ if (!triggerCapsuleQueue .offer (blockLogTriggerCapsule )) {
2203+ logger .info ("Too many triggers, block trigger lost: {}." , capsule .getBlockId ());
2204+ }
22182205 }
22192206 }
22202207
22212208 // process transaction trigger
22222209 if (eventPluginLoaded && EventPluginLoader .getInstance ().isTransactionLogTriggerEnable ()) {
2223- // set newBlock
2210+ List < BlockCapsule > capsuleList = new ArrayList <>();
22242211 if (EventPluginLoader .getInstance ().isTransactionLogTriggerSolidified ()) {
2225- long solidityBlkNum = getDynamicPropertiesStore ().getLatestSolidifiedBlockNum ();
2226- try {
2227- newBlock = chainBaseManager .getBlockByNum (solidityBlkNum );
2228- } catch (Exception e ) {
2229- logger .error ("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}." ,
2230- solidityBlkNum , e .getMessage ());
2231- }
2212+ capsuleList = getContinuousBlockCapsule (solidityBlkNum );
22322213 } else {
22332214 // need to reset block
2234- newBlock = blockCapsule ;
2215+ capsuleList . add ( blockCapsule ) ;
22352216 }
22362217
2237- processTransactionTrigger (newBlock );
2218+ for (BlockCapsule capsule : capsuleList ) {
2219+ processTransactionTrigger (capsule );
2220+ }
2221+ }
2222+ }
2223+
2224+ private List <BlockCapsule > getContinuousBlockCapsule (long solidityBlkNum ) {
2225+ List <BlockCapsule > capsuleList = new ArrayList <>();
2226+ long start = lastUsedSolidityNum < 0 ? solidityBlkNum : (lastUsedSolidityNum + 1 );
2227+ if (solidityBlkNum > start ) {
2228+ logger .info ("Continuous block start:{}, end:{}" , start , solidityBlkNum );
2229+ }
2230+ for (long blockNum = start ; blockNum <= solidityBlkNum ; blockNum ++) {
2231+ try {
2232+ BlockCapsule capsule = chainBaseManager .getBlockByNum (blockNum );
2233+ capsuleList .add (capsule );
2234+ } catch (Exception e ) {
2235+ logger .error ("GetContinuousBlockCapsule getBlockByNum blkNum = {} except, error is {}." ,
2236+ solidityBlkNum , e .getMessage ());
2237+ }
22382238 }
2239+ return capsuleList ;
22392240 }
22402241
22412242 // return energyUsageTotal of the current transaction
0 commit comments