Skip to content

Commit e0d167f

Browse files
authored
fet(event): optimize event service to obtain transaction information (#6443)
* feat(event): solve the problem of concurrent access to a single SR * feat(event): solve the concurrency problem of single SR obtaining solid ID
1 parent 40cc590 commit e0d167f

File tree

5 files changed

+94
-41
lines changed

5 files changed

+94
-41
lines changed

framework/src/main/java/org/tron/core/Wallet.java

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,37 +2771,7 @@ public BytesMessage getShieldTransactionHash(Transaction transaction)
27712771
}
27722772

27732773
public TransactionInfoList getTransactionInfoByBlockNum(long blockNum) {
2774-
TransactionInfoList.Builder transactionInfoList = TransactionInfoList.newBuilder();
2775-
2776-
try {
2777-
TransactionRetCapsule result = dbManager.getTransactionRetStore()
2778-
.getTransactionInfoByBlockNum(ByteArray.fromLong(blockNum));
2779-
2780-
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
2781-
result.getInstance().getTransactioninfoList().forEach(
2782-
transactionInfo -> transactionInfoList.addTransactionInfo(transactionInfo)
2783-
);
2784-
} else {
2785-
Block block = chainBaseManager.getBlockByNum(blockNum).getInstance();
2786-
2787-
if (block != null) {
2788-
List<Transaction> listTransaction = block.getTransactionsList();
2789-
for (Transaction transaction : listTransaction) {
2790-
TransactionInfoCapsule transactionInfoCapsule = dbManager.getTransactionHistoryStore()
2791-
.get(Sha256Hash.hash(CommonParameter.getInstance()
2792-
.isECKeyCryptoEngine(), transaction.getRawData().toByteArray()));
2793-
2794-
if (transactionInfoCapsule != null) {
2795-
transactionInfoList.addTransactionInfo(transactionInfoCapsule.getInstance());
2796-
}
2797-
}
2798-
}
2799-
}
2800-
} catch (BadItemException | ItemNotFoundException e) {
2801-
logger.warn(e.getMessage());
2802-
}
2803-
2804-
return transactionInfoList.build();
2774+
return dbManager.getTransactionInfoByBlockNum(blockNum);
28052775
}
28062776

28072777
public NodeList listNodes() {

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
import org.tron.core.store.WitnessScheduleStore;
164164
import org.tron.core.store.WitnessStore;
165165
import org.tron.core.utils.TransactionRegister;
166+
import org.tron.protos.Protocol;
166167
import org.tron.protos.Protocol.AccountType;
167168
import org.tron.protos.Protocol.Permission;
168169
import org.tron.protos.Protocol.Transaction;
@@ -2488,6 +2489,40 @@ private boolean isBlockWaitingLock() {
24882489
return blockWaitLock.get() > NO_BLOCK_WAITING_LOCK;
24892490
}
24902491

2492+
public TransactionInfoList getTransactionInfoByBlockNum(long blockNum) {
2493+
TransactionInfoList.Builder transactionInfoList = TransactionInfoList.newBuilder();
2494+
2495+
try {
2496+
TransactionRetCapsule result = getTransactionRetStore()
2497+
.getTransactionInfoByBlockNum(ByteArray.fromLong(blockNum));
2498+
2499+
if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) {
2500+
result.getInstance().getTransactioninfoList().forEach(
2501+
transactionInfo -> transactionInfoList.addTransactionInfo(transactionInfo)
2502+
);
2503+
} else {
2504+
Protocol.Block block = chainBaseManager.getBlockByNum(blockNum).getInstance();
2505+
2506+
if (block != null) {
2507+
List<Transaction> listTransaction = block.getTransactionsList();
2508+
for (Transaction transaction : listTransaction) {
2509+
TransactionInfoCapsule transactionInfoCapsule = getTransactionHistoryStore()
2510+
.get(Sha256Hash.hash(CommonParameter.getInstance()
2511+
.isECKeyCryptoEngine(), transaction.getRawData().toByteArray()));
2512+
2513+
if (transactionInfoCapsule != null) {
2514+
transactionInfoList.addTransactionInfo(transactionInfoCapsule.getInstance());
2515+
}
2516+
}
2517+
}
2518+
}
2519+
} catch (BadItemException | ItemNotFoundException e) {
2520+
logger.warn(e.getMessage());
2521+
}
2522+
2523+
return transactionInfoList.build();
2524+
}
2525+
24912526
public void close() {
24922527
stopRePushThread();
24932528
stopRePushTriggerThread();

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,16 @@ public BlockEvent getBlockEvent(long blockNum) throws Exception {
5757
BlockCapsule block = manager.getChainBaseManager().getBlockByNum(blockNum);
5858
block.getTransactions().forEach(t -> t.setBlockNum(block.getNum()));
5959
long solidNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
60+
long headNum = manager.getHeadBlockNum();
61+
// solve the single SR concurrency problem
62+
if (solidNum >= headNum && headNum > 0) {
63+
solidNum = headNum - 1;
64+
}
6065
BlockEvent blockEvent = new BlockEvent();
6166
blockEvent.setBlockId(block.getBlockId());
6267
blockEvent.setParentId(block.getParentBlockId());
6368
blockEvent.setSolidId(manager.getChainBaseManager().getBlockIdByNum(solidNum));
69+
6470
if (instance.isBlockLogTriggerEnable()) {
6571
blockEvent.setBlockLogTriggerCapsule(getBlockLogTrigger(block, solidNum));
6672
}
@@ -88,18 +94,13 @@ public BlockEvent getBlockEvent(long blockNum) throws Exception {
8894
}
8995

9096
public SmartContractTrigger getContractTrigger(BlockCapsule block, long solidNum) {
91-
TransactionRetCapsule result;
92-
try {
93-
result = manager.getChainBaseManager().getTransactionRetStore()
94-
.getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum()));
95-
} catch (BadItemException e) {
96-
throw new RuntimeException(e);
97-
}
97+
98+
GrpcAPI.TransactionInfoList list = manager.getTransactionInfoByBlockNum(block.getNum());
9899

99100
SmartContractTrigger contractTrigger = new SmartContractTrigger();
100101
for (int i = 0; i < block.getTransactions().size(); i++) {
101102
Protocol.Transaction tx = block.getInstance().getTransactions(i);
102-
Protocol.TransactionInfo txInfo = result.getInstance().getTransactioninfo(i);
103+
Protocol.TransactionInfo txInfo = list.getTransactionInfo(i);
103104

104105
List<ContractTrigger> triggers = parseLogs(tx, txInfo);
105106
for (ContractTrigger trigger : triggers) {

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ private void syncEvent() {
5454
try {
5555
long tmp = instance.getStartSyncBlockNum();
5656
long endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
57-
while (tmp <= endNum) {
57+
while (tmp < endNum) {
58+
if (thread.isInterrupted()) {
59+
throw new InterruptedException();
60+
}
5861
if (instance.isUseNativeQueue()) {
5962
Thread.sleep(20);
6063
} else if (instance.isBusy()) {
@@ -67,7 +70,8 @@ private void syncEvent() {
6770
tmp++;
6871
endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
6972
}
70-
initEventService(manager.getChainBaseManager().getBlockIdByNum(endNum));
73+
long startNum = endNum == 0 ? 0 : endNum - 1;
74+
initEventService(manager.getChainBaseManager().getBlockIdByNum(startNum));
7175
} catch (InterruptedException e1) {
7276
logger.warn("History event service interrupted.");
7377
Thread.currentThread().interrupt();

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.junit.Rule;
3434
import org.junit.Test;
3535
import org.junit.rules.TemporaryFolder;
36+
import org.tron.api.GrpcAPI;
3637
import org.tron.common.application.TronApplicationContext;
3738
import org.tron.common.crypto.ECKey;
3839
import org.tron.common.runtime.RuntimeImpl;
@@ -52,7 +53,10 @@
5253
import org.tron.core.capsule.AccountCapsule;
5354
import org.tron.core.capsule.AssetIssueCapsule;
5455
import org.tron.core.capsule.BlockCapsule;
56+
import org.tron.core.capsule.BytesCapsule;
5557
import org.tron.core.capsule.TransactionCapsule;
58+
import org.tron.core.capsule.TransactionInfoCapsule;
59+
import org.tron.core.capsule.TransactionRetCapsule;
5660
import org.tron.core.capsule.WitnessCapsule;
5761
import org.tron.core.config.DefaultConfig;
5862
import org.tron.core.config.Parameter;
@@ -1233,6 +1237,45 @@ public void testExpiration() {
12331237

12341238
}
12351239

1240+
@Test
1241+
public void testGetTransactionInfoByBlockNum() throws Exception {
1242+
1243+
Transaction transaction = Protocol.Transaction.newBuilder()
1244+
.addSignature(ByteString.copyFrom(new byte[1])).build();
1245+
TransactionCapsule transactionCapsule = new TransactionCapsule(transaction);
1246+
1247+
Protocol.BlockHeader.raw raw = Protocol.BlockHeader.raw.newBuilder().setNumber(1000L).build();
1248+
Protocol.BlockHeader header = Protocol.BlockHeader.newBuilder().setRawData(raw).build();
1249+
Block block = Block.newBuilder().setBlockHeader(header).addTransactions(transaction).build();
1250+
1251+
Protocol.TransactionInfo info = Protocol.TransactionInfo.newBuilder()
1252+
.setBlockNumber(1000L).build();
1253+
1254+
BlockCapsule blockCapsule = new BlockCapsule(block);
1255+
byte[] blockId = new BlockCapsule(block).getBlockId().getBytes();
1256+
dbManager.getBlockIndexStore().put(ByteArray.fromLong(1000L), new BytesCapsule(blockId));
1257+
dbManager.getBlockStore().put(blockId, blockCapsule);
1258+
dbManager.getTransactionHistoryStore().put(transactionCapsule.getTransactionId().getBytes(),
1259+
new TransactionInfoCapsule(info));
1260+
1261+
GrpcAPI.TransactionInfoList transactionInfoList = dbManager.getTransactionInfoByBlockNum(1000L);
1262+
1263+
Assert.assertEquals(1, transactionInfoList.getTransactionInfoCount());
1264+
1265+
Protocol.TransactionRet ret = Protocol.TransactionRet.newBuilder()
1266+
.addTransactioninfo(info)
1267+
.addTransactioninfo(info).build();
1268+
1269+
TransactionRetCapsule transactionRetCapsule = new TransactionRetCapsule(ret.toByteArray());
1270+
1271+
dbManager.getTransactionRetStore()
1272+
.put(ByteArray.fromLong(1000L), transactionRetCapsule);
1273+
1274+
transactionInfoList = dbManager.getTransactionInfoByBlockNum(1000L);
1275+
1276+
Assert.assertEquals(2, transactionInfoList.getTransactionInfoCount());
1277+
}
1278+
12361279
@Test
12371280
public void blockTrigger() {
12381281
Manager manager = spy(new Manager());

0 commit comments

Comments
 (0)