Skip to content

Commit 543fbb1

Browse files
committed
fix(net): fix the bug of missing data in mongo
1 parent 42732b0 commit 543fbb1

1 file changed

Lines changed: 59 additions & 48 deletions

File tree

framework/src/main/java/org/tron/core/db/Manager.java

Lines changed: 59 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ public class Manager {
241241
@Getter
242242
private volatile long latestSolidityNumShutDown;
243243
@Getter
244+
private long lastUsedSolidityNum = -1;
245+
private boolean useSolidity = false;
246+
@Getter
244247
private int maxFlushCount;
245248

246249
@Getter
@@ -525,12 +528,18 @@ public void init() {
525528
Thread triggerCapsuleProcessThread = new Thread(triggerCapsuleProcessLoop);
526529
triggerCapsuleProcessThread.setDaemon(true);
527530
triggerCapsuleProcessThread.start();
531+
if (eventPluginLoaded) {
532+
useSolidity = EventPluginLoader.getInstance().isBlockLogTriggerSolidified()
533+
| EventPluginLoader.getInstance().isTransactionLogTriggerEnable()
534+
| EventPluginLoader.getInstance().isTransactionLogTriggerSolidified();
535+
}
528536
}
529537

530538
// start json rpc filter process
531539
if (CommonParameter.getInstance().isJsonRpcFilterEnabled()) {
532540
Thread filterProcessThread = new Thread(filterProcessLoop);
533541
filterProcessThread.start();
542+
useSolidity |= CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable();
534543
}
535544

536545
//initStoreFactory
@@ -2027,17 +2036,11 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif
20272036
return;
20282037
}
20292038

2030-
BlockCapsule blockCapsule;
2031-
try {
2032-
blockCapsule = chainBaseManager.getBlockByNum(latestSolidifiedBlockNumber);
2033-
} catch (Exception e) {
2034-
logger.error("PostSolidityFilter getBlockByNum = {} except, {}.",
2035-
latestSolidifiedBlockNumber, e.getMessage());
2036-
return;
2039+
List<BlockCapsule> capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber);
2040+
for (BlockCapsule blockCapsule : capsuleList) {
2041+
postBlockFilter(blockCapsule, true);
2042+
postLogsFilter(blockCapsule, true, false);
20372043
}
2038-
2039-
postBlockFilter(blockCapsule, true);
2040-
postLogsFilter(blockCapsule, true, false);
20412044
}
20422045

20432046
private void postSolidityTrigger(final long oldSolidNum, final long latestSolidifiedBlockNumber) {
@@ -2054,28 +2057,27 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi
20542057
}
20552058

20562059
if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) {
2057-
SolidityTriggerCapsule solidityTriggerCapsule
2058-
= new SolidityTriggerCapsule(latestSolidifiedBlockNumber);
2059-
2060-
BlockCapsule blockCapsule;
2061-
try {
2062-
blockCapsule = chainBaseManager.getBlockByNum(latestSolidifiedBlockNumber);
2060+
List<BlockCapsule> capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber);
2061+
for(BlockCapsule blockCapsule : capsuleList){
2062+
SolidityTriggerCapsule solidityTriggerCapsule
2063+
= new SolidityTriggerCapsule(latestSolidifiedBlockNumber);
20632064
solidityTriggerCapsule.setTimeStamp(blockCapsule.getTimeStamp());
2064-
} catch (Exception e) {
2065-
logger.error("PostSolidityTrigger getBlockByNum = {} except, {}.",
2066-
latestSolidifiedBlockNumber, e.getMessage());
2067-
}
20682065

2069-
boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule);
2070-
if (!result) {
2071-
logger.info("Too many trigger, lost solidified trigger, block number: {}.",
2072-
latestSolidifiedBlockNumber);
2066+
boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule);
2067+
if (!result) {
2068+
logger.info("Too many trigger, lost solidified trigger, block number: {}.",
2069+
latestSolidifiedBlockNumber);
2070+
}
20732071
}
20742072
}
20752073

20762074
if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) {
20772075
postSolidityFilter(oldSolidNum, latestSolidifiedBlockNumber);
20782076
}
2077+
2078+
if (useSolidity) {
2079+
lastUsedSolidityNum = latestSolidifiedBlockNumber;
2080+
}
20792081
}
20802082

20812083
private void processTransactionTrigger(BlockCapsule newBlock) {
@@ -2184,7 +2186,6 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified,
21842186
}
21852187

21862188
private void postBlockTrigger(final BlockCapsule blockCapsule) {
2187-
BlockCapsule newBlock = blockCapsule;
21882189

21892190
// post block and logs for jsonrpc
21902191
if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) {
@@ -2193,44 +2194,54 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) {
21932194
}
21942195

21952196
// process block trigger
2197+
long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
21962198
if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) {
2199+
List<BlockCapsule> capsuleList = new ArrayList<>();
21972200
if (EventPluginLoader.getInstance().isBlockLogTriggerSolidified()) {
2198-
long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
2199-
try {
2200-
newBlock = chainBaseManager
2201-
.getBlockByNum(solidityBlkNum);
2202-
} catch (Exception e) {
2203-
logger.error("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}.",
2204-
solidityBlkNum, e.getMessage());
2205-
}
2201+
capsuleList = getCrossBlockCapsule(solidityBlkNum);
2202+
} else {
2203+
capsuleList.add(blockCapsule);
22062204
}
22072205

2208-
BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule(newBlock);
2209-
blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore()
2210-
.getLatestSolidifiedBlockNum());
2211-
if (!triggerCapsuleQueue.offer(blockLogTriggerCapsule)) {
2212-
logger.info("Too many triggers, block trigger lost: {}.", newBlock.getBlockId());
2206+
for (BlockCapsule capsule : capsuleList) {
2207+
BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule(capsule);
2208+
blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore()
2209+
.getLatestSolidifiedBlockNum());
2210+
if (!triggerCapsuleQueue.offer(blockLogTriggerCapsule)) {
2211+
logger.info("Too many triggers, block trigger lost: {}.", capsule.getBlockId());
2212+
}
22132213
}
22142214
}
22152215

22162216
// process transaction trigger
22172217
if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) {
2218-
// set newBlock
2218+
List<BlockCapsule> capsuleList = new ArrayList<>();
22192219
if (EventPluginLoader.getInstance().isTransactionLogTriggerSolidified()) {
2220-
long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
2221-
try {
2222-
newBlock = chainBaseManager.getBlockByNum(solidityBlkNum);
2223-
} catch (Exception e) {
2224-
logger.error("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}.",
2225-
solidityBlkNum, e.getMessage());
2226-
}
2220+
capsuleList = getCrossBlockCapsule(solidityBlkNum);
22272221
} else {
22282222
// need to reset block
2229-
newBlock = blockCapsule;
2223+
capsuleList.add(blockCapsule);
22302224
}
22312225

2232-
processTransactionTrigger(newBlock);
2226+
for (BlockCapsule capsule : capsuleList) {
2227+
processTransactionTrigger(capsule);
2228+
}
2229+
}
2230+
}
2231+
2232+
private List<BlockCapsule> getCrossBlockCapsule(long solidityBlkNum) {
2233+
List<BlockCapsule> capsuleList = new ArrayList<>();
2234+
long start = lastUsedSolidityNum < 0 ? (solidityBlkNum - 1) : lastUsedSolidityNum;
2235+
for (long i = start + 1; i <= solidityBlkNum; i++) {
2236+
try {
2237+
BlockCapsule capsule = chainBaseManager.getBlockByNum(solidityBlkNum);
2238+
capsuleList.add(capsule);
2239+
} catch (Exception e) {
2240+
logger.error("GetCrossBlockCapsule getBlockByNum blkNum = {} except, error is {}.",
2241+
solidityBlkNum, e.getMessage());
2242+
}
22332243
}
2244+
return capsuleList;
22342245
}
22352246

22362247
// return energyUsageTotal of the current transaction

0 commit comments

Comments
 (0)