Skip to content

Commit 04f7991

Browse files
authored
feat(db): optimize the compatibility of obtaining transaction info (#6453)
* feat(db): optimize the compatibility of obtaining transaction information
1 parent 7f237fd commit 04f7991

File tree

7 files changed

+35
-88
lines changed

7 files changed

+35
-88
lines changed

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

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.bouncycastle.util.encoders.Hex;
4949
import org.springframework.beans.factory.annotation.Autowired;
5050
import org.springframework.stereotype.Component;
51+
import org.tron.api.GrpcAPI;
5152
import org.tron.api.GrpcAPI.TransactionInfoList;
5253
import org.tron.common.args.GenesisBlock;
5354
import org.tron.common.bloom.Bloom;
@@ -2158,25 +2159,7 @@ private void processTransactionTrigger(BlockCapsule newBlock) {
21582159
// need to set eth compatible data from transactionInfoList
21592160
if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()
21602161
&& newBlock.getNum() != 0) {
2161-
TransactionInfoList transactionInfoList = TransactionInfoList.newBuilder().build();
2162-
TransactionInfoList.Builder transactionInfoListBuilder = TransactionInfoList.newBuilder();
2163-
2164-
try {
2165-
TransactionRetCapsule result = chainBaseManager.getTransactionRetStore()
2166-
.getTransactionInfoByBlockNum(ByteArray.fromLong(newBlock.getNum()));
2167-
2168-
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
2169-
result.getInstance().getTransactioninfoList().forEach(
2170-
transactionInfoListBuilder::addTransactionInfo
2171-
);
2172-
2173-
transactionInfoList = transactionInfoListBuilder.build();
2174-
}
2175-
} catch (BadItemException e) {
2176-
logger.error("PostBlockTrigger getTransactionInfoList blockNum = {}, error is {}.",
2177-
newBlock.getNum(), e.getMessage());
2178-
}
2179-
2162+
TransactionInfoList transactionInfoList = getTransactionInfoByBlockNum(newBlock.getNum());
21802163
if (transactionCapsuleList.size() == transactionInfoList.getTransactionInfoCount()) {
21812164
long cumulativeEnergyUsed = 0;
21822165
long cumulativeLogCount = 0;
@@ -2234,21 +2217,8 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified,
22342217
boolean removed) {
22352218
if (!blockCapsule.getTransactions().isEmpty()) {
22362219
long blockNumber = blockCapsule.getNum();
2237-
List<TransactionInfo> transactionInfoList = new ArrayList<>();
2238-
2239-
try {
2240-
TransactionRetCapsule result = chainBaseManager.getTransactionRetStore()
2241-
.getTransactionInfoByBlockNum(ByteArray.fromLong(blockNumber));
2242-
2243-
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
2244-
transactionInfoList.addAll(result.getInstance().getTransactioninfoList());
2245-
}
2246-
} catch (BadItemException e) {
2247-
logger.error("ProcessLogsFilter getTransactionInfoList blockNum = {}, error is {}.",
2248-
blockNumber, e.getMessage());
2249-
return;
2250-
}
2251-
2220+
List<TransactionInfo> transactionInfoList
2221+
= getTransactionInfoByBlockNum(blockNumber).getTransactionInfoList();
22522222
LogsFilterCapsule logsFilterCapsule = new LogsFilterCapsule(blockNumber,
22532223
blockCapsule.getBlockId().toString(), blockCapsule.getBloom(), transactionInfoList,
22542224
solidified, removed);

framework/src/main/java/org/tron/core/services/event/BlockEventGet.java

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -329,22 +329,10 @@ public List<TransactionLogTriggerCapsule> getTransactionLogTrigger(BlockCapsule
329329
if (!EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) {
330330
return getTransactionTriggers(block, solidNum);
331331
}
332+
333+
GrpcAPI.TransactionInfoList transactionInfoList
334+
= manager.getTransactionInfoByBlockNum(block.getNum());
332335
List<TransactionCapsule> transactionCapsuleList = block.getTransactions();
333-
GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI
334-
.TransactionInfoList.newBuilder().build();
335-
GrpcAPI.TransactionInfoList.Builder transactionInfoListBuilder = GrpcAPI
336-
.TransactionInfoList.newBuilder();
337-
try {
338-
TransactionRetCapsule result = manager.getChainBaseManager().getTransactionRetStore()
339-
.getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum()));
340-
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
341-
result.getInstance().getTransactioninfoList()
342-
.forEach(transactionInfoListBuilder::addTransactionInfo);
343-
transactionInfoList = transactionInfoListBuilder.build();
344-
}
345-
} catch (BadItemException e) {
346-
logger.error("Get TransactionInfo failed, blockNum {}, {}.", block.getNum(), e.getMessage());
347-
}
348336
if (transactionCapsuleList.size() != transactionInfoList.getTransactionInfoCount()) {
349337
logger.error("Get TransactionInfo size not eq, blockNum {}, {}, {}",
350338
block.getNum(), transactionCapsuleList.size(),
@@ -385,22 +373,8 @@ public List<TransactionLogTriggerCapsule> getTransactionTriggers(BlockCapsule bl
385373
return list;
386374
}
387375

388-
GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI
389-
.TransactionInfoList.newBuilder().build();
390-
GrpcAPI.TransactionInfoList.Builder transactionInfoListBuilder = GrpcAPI
391-
.TransactionInfoList.newBuilder();
392-
try {
393-
TransactionRetCapsule result = manager.getChainBaseManager().getTransactionRetStore()
394-
.getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum()));
395-
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
396-
result.getInstance().getTransactioninfoList()
397-
.forEach(transactionInfoListBuilder::addTransactionInfo);
398-
transactionInfoList = transactionInfoListBuilder.build();
399-
}
400-
} catch (Exception e) {
401-
logger.warn("Get TransactionInfo failed, blockNum {}, {}.", block.getNum(), e.getMessage());
402-
}
403-
376+
GrpcAPI.TransactionInfoList transactionInfoList
377+
= manager.getTransactionInfoByBlockNum(block.getNum());
404378
if (block.getTransactions().size() != transactionInfoList.getTransactionInfoCount()) {
405379
for (TransactionCapsule t : block.getTransactions()) {
406380
TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule(t, block);

framework/src/main/java/org/tron/core/services/event/HistoryEventService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,13 @@ public void init() {
4545

4646
public void close() {
4747
if (thread != null) {
48-
thread.interrupt();
48+
try {
49+
thread.interrupt();
50+
thread.join(1000);
51+
} catch (InterruptedException e) {
52+
Thread.currentThread().interrupt();
53+
logger.warn("Wait close timeout, {}", e.getMessage());
54+
}
4955
}
5056
logger.info("History event service close.");
5157
}

framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogMatch.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,13 @@ public LogFilterElement[] matchBlockOneByOne()
8383
List<LogFilterElement> logFilterElementList = new ArrayList<>();
8484

8585
for (long blockNum : blockNumList) {
86-
TransactionRetCapsule transactionRetCapsule =
87-
manager.getTransactionRetStore()
88-
.getTransactionInfoByBlockNum(ByteArray.fromLong(blockNum));
89-
if (transactionRetCapsule == null) {
90-
//if query condition (address and topics) is empty, we will traversal every block,
91-
//include empty block
86+
List<TransactionInfo> transactionInfoList =
87+
manager.getTransactionInfoByBlockNum(blockNum).getTransactionInfoList();
88+
//if query condition (address and topics) is empty, we will traversal every block,
89+
//include empty block
90+
if (transactionInfoList.isEmpty()) {
9291
continue;
9392
}
94-
TransactionRet transactionRet = transactionRetCapsule.getInstance();
95-
List<TransactionInfo> transactionInfoList = transactionRet.getTransactioninfoList();
96-
9793
String blockHash = manager.getChainBaseManager().getBlockIdByNum(blockNum).toString();
9894
List<LogFilterElement> matchedLog = matchBlock(logFilterWrapper.getLogFilter(), blockNum,
9995
blockHash, transactionInfoList, false);

framework/src/test/java/org/tron/core/db/ManagerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,7 @@ public void testGetTransactionInfoByBlockNum() throws Exception {
12611261
GrpcAPI.TransactionInfoList transactionInfoList = dbManager.getTransactionInfoByBlockNum(1000L);
12621262

12631263
Assert.assertEquals(1, transactionInfoList.getTransactionInfoCount());
1264+
Assert.assertEquals(1, transactionInfoList.getTransactionInfoList().size());
12641265

12651266
Protocol.TransactionRet ret = Protocol.TransactionRet.newBuilder()
12661267
.addTransactioninfo(info)
@@ -1274,6 +1275,7 @@ public void testGetTransactionInfoByBlockNum() throws Exception {
12741275
transactionInfoList = dbManager.getTransactionInfoByBlockNum(1000L);
12751276

12761277
Assert.assertEquals(2, transactionInfoList.getTransactionInfoCount());
1278+
Assert.assertEquals(2, transactionInfoList.getTransactionInfoList().size());
12771279
}
12781280

12791281
@Test

framework/src/test/java/org/tron/core/event/BlockEventGetTest.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.junit.Test;
2020
import org.junit.rules.TemporaryFolder;
2121
import org.mockito.Mockito;
22+
import org.tron.api.GrpcAPI;
2223
import org.tron.common.application.TronApplicationContext;
2324
import org.tron.common.logsfilter.EventPluginConfig;
2425
import org.tron.common.logsfilter.EventPluginLoader;
@@ -233,6 +234,11 @@ public void getTransactionTriggers() throws Exception {
233234

234235
bc = new BlockCapsule(100, ByteString.empty(), 1, transactionList);
235236

237+
Manager manager = mock(Manager.class);
238+
ReflectUtils.setFieldValue(blockEventGet, "manager", manager);
239+
Mockito.when(manager.getTransactionInfoByBlockNum(1))
240+
.thenReturn(GrpcAPI.TransactionInfoList.newBuilder().build());
241+
236242
list = blockEventGet.getTransactionTriggers(bc, 1);
237243
Assert.assertEquals(1, list.size());
238244
Assert.assertEquals(100, list.get(0).getTransactionLogTrigger().getTimeStamp());
@@ -253,21 +259,14 @@ public void getTransactionTriggers() throws Exception {
253259
.addContractResult(ByteString.copyFrom(ByteArray.fromHexString("112233")))
254260
.setReceipt(resourceBuild.build());
255261

256-
Manager manager = mock(Manager.class);
257-
ReflectUtils.setFieldValue(blockEventGet, "manager", manager);
258-
259262
ChainBaseManager chainBaseManager = mock(ChainBaseManager.class);
260263
Mockito.when(manager.getChainBaseManager()).thenReturn(chainBaseManager);
261264

262-
TransactionRetStore transactionRetStore = mock(TransactionRetStore.class);
263-
Mockito.when(chainBaseManager.getTransactionRetStore()).thenReturn(transactionRetStore);
264-
265-
Protocol.TransactionRet transactionRet = Protocol.TransactionRet.newBuilder()
266-
.addTransactioninfo(infoBuild.build()).build();
267265

268-
TransactionRetCapsule result = new TransactionRetCapsule(transactionRet.toByteArray());
266+
GrpcAPI.TransactionInfoList result = GrpcAPI.TransactionInfoList.newBuilder()
267+
.addTransactionInfo(infoBuild.build()).build();
269268

270-
Mockito.when(transactionRetStore.getTransactionInfoByBlockNum(ByteArray.fromLong(0)))
269+
Mockito.when(manager.getTransactionInfoByBlockNum(0))
271270
.thenReturn(result);
272271

273272
Protocol.Block block = Protocol.Block.newBuilder()
@@ -286,8 +285,8 @@ public void getTransactionTriggers() throws Exception {
286285
Assert.assertEquals(2,
287286
list.get(0).getTransactionLogTrigger().getEnergyUsageTotal());
288287

289-
Mockito.when(transactionRetStore.getTransactionInfoByBlockNum(ByteArray.fromLong(0)))
290-
.thenReturn(null);
288+
Mockito.when(manager.getTransactionInfoByBlockNum(0))
289+
.thenReturn(GrpcAPI.TransactionInfoList.newBuilder().build());
291290
list = blockEventGet.getTransactionTriggers(blockCapsule, 1);
292291
Assert.assertEquals(1, list.size());
293292
Assert.assertEquals(1,

framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class HistoryEventServiceTest {
2323

2424
HistoryEventService historyEventService = new HistoryEventService();
2525

26-
@Test
26+
@Test(timeout = 60_000)
2727
public void test() throws Exception {
2828
EventPluginLoader instance = mock(EventPluginLoader.class);
2929
Mockito.when(instance.isUseNativeQueue()).thenReturn(true);

0 commit comments

Comments
 (0)