Skip to content

Commit d70cb52

Browse files
Merge pull request #6192 from zeusoo001/event-22
feat(event): optimize the event service
2 parents a82baeb + ff44e09 commit d70cb52

26 files changed

+1848
-16
lines changed

common/src/main/java/org/tron/common/logsfilter/EventPluginConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ public class EventPluginConfig {
1515
public static final String SOLIDITY_EVENT_NAME = "solidityevent";
1616
public static final String SOLIDITY_LOG_NAME = "soliditylog";
1717

18+
@Getter
19+
@Setter
20+
private int version;
21+
22+
@Getter
23+
@Setter
24+
private long startSyncBlockNum;
25+
1826
@Getter
1927
@Setter
2028
private String pluginPath;

common/src/main/java/org/tron/common/logsfilter/trigger/BlockLogTrigger.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public BlockLogTrigger() {
3434
@Override
3535
public String toString() {
3636
return new StringBuilder().append("triggerName: ").append(getTriggerName())
37-
.append("timestamp: ")
37+
.append(", timestamp: ")
3838
.append(timeStamp)
3939
.append(", blockNumber: ")
4040
.append(blockNumber)

common/src/main/java/org/tron/common/logsfilter/trigger/SolidityTrigger.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public SolidityTrigger() {
1616
@Override
1717
public String toString() {
1818
return new StringBuilder().append("triggerName: ").append(getTriggerName())
19-
.append("timestamp: ")
19+
.append(", timestamp: ")
2020
.append(timeStamp)
2121
.append(", latestSolidifiedBlockNumber: ")
2222
.append(latestSolidifiedBlockNumber).toString();

common/src/main/java/org/tron/core/Constant.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ public class Constant {
287287

288288
public static final String NATIVE_QUEUE_SEND_LENGTH = "event.subscribe.native.sendqueuelength";
289289

290+
public static final String EVENT_SUBSCRIBE_VERSION = "event.subscribe.version";
291+
public static final String EVENT_SUBSCRIBE_START_SYNC_BLOCK_NUM = "event.subscribe.startSyncBlockNum";
290292
public static final String EVENT_SUBSCRIBE_PATH = "event.subscribe.path";
291293
public static final String EVENT_SUBSCRIBE_SERVER = "event.subscribe.server";
292294
public static final String EVENT_SUBSCRIBE_DB_CONFIG = "event.subscribe.dbconfig";

framework/src/main/java/org/tron/common/application/ApplicationImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.tron.core.db.Manager;
1111
import org.tron.core.metrics.MetricsUtil;
1212
import org.tron.core.net.TronNetService;
13+
import org.tron.core.services.event.EventService;
1314

1415
@Slf4j(topic = "app")
1516
@Component
@@ -18,6 +19,9 @@ public class ApplicationImpl implements Application {
1819
@Autowired
1920
private ServiceContainer services;
2021

22+
@Autowired
23+
private EventService eventService;
24+
2125
@Autowired
2226
private TronNetService tronNetService;
2327

@@ -37,6 +41,7 @@ public class ApplicationImpl implements Application {
3741
*/
3842
public void startup() {
3943
this.startServices();
44+
eventService.init();
4045
if ((!Args.getInstance().isSolidityNode()) && (!Args.getInstance().isP2pDisable())) {
4146
tronNetService.start();
4247
}
@@ -47,6 +52,7 @@ public void startup() {
4752
@Override
4853
public void shutdown() {
4954
this.shutdownServices();
55+
eventService.close();
5056
consensusService.stop();
5157
if (!Args.getInstance().isSolidityNode() && (!Args.getInstance().p2pDisable)) {
5258
tronNetService.close();

framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.tron.common.logsfilter.trigger.SolidityTrigger;
2525
import org.tron.common.logsfilter.trigger.TransactionLogTrigger;
2626
import org.tron.common.logsfilter.trigger.Trigger;
27+
import org.tron.common.utils.JsonUtil;
2728

2829
@Slf4j
2930
public class EventPluginLoader {
@@ -42,6 +43,10 @@ public class EventPluginLoader {
4243

4344
private List<TriggerConfig> triggerConfigList;
4445

46+
private int version = 0;
47+
48+
private long startSyncBlockNum = 0;
49+
4550
private boolean blockLogTriggerEnable = false;
4651

4752
private boolean blockLogTriggerSolidified = false;
@@ -219,6 +224,10 @@ public boolean start(EventPluginConfig config) {
219224
return false;
220225
}
221226

227+
this.version = config.getVersion();
228+
229+
this.startSyncBlockNum = config.getStartSyncBlockNum();
230+
222231
this.triggerConfigList = config.getTriggerConfigList();
223232

224233
useNativeQueue = config.isUseNativeQueue();
@@ -358,6 +367,14 @@ public void postSolidityTrigger(SolidityTrigger trigger) {
358367
}
359368
}
360369

370+
public synchronized int getVersion() {
371+
return version;
372+
}
373+
374+
public synchronized long getStartSyncBlockNum() {
375+
return startSyncBlockNum;
376+
}
377+
361378
public synchronized boolean isBlockLogTriggerEnable() {
362379
return blockLogTriggerEnable;
363380
}

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,15 @@ private static EventPluginConfig getEventPluginConfig(
13601360
final com.typesafe.config.Config config) {
13611361
EventPluginConfig eventPluginConfig = new EventPluginConfig();
13621362

1363+
if (config.hasPath(Constant.EVENT_SUBSCRIBE_VERSION)) {
1364+
eventPluginConfig.setVersion(config.getInt(Constant.EVENT_SUBSCRIBE_VERSION));
1365+
}
1366+
1367+
if (config.hasPath(Constant.EVENT_SUBSCRIBE_START_SYNC_BLOCK_NUM)) {
1368+
eventPluginConfig.setStartSyncBlockNum(config
1369+
.getLong(Constant.EVENT_SUBSCRIBE_START_SYNC_BLOCK_NUM));
1370+
}
1371+
13631372
boolean useNativeQueue = false;
13641373
int bindPort = 0;
13651374
int sendQueueLength = 0;

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

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ public class Manager {
241241
Collections.synchronizedList(Lists.newArrayList());
242242
// the capacity is equal to Integer.MAX_VALUE default
243243
private BlockingQueue<TransactionCapsule> rePushTransactions;
244+
@Getter
244245
private BlockingQueue<TriggerCapsule> triggerCapsuleQueue;
245246
// log filter
246247
private boolean isRunFilterProcessThread = true;
@@ -1111,7 +1112,9 @@ private void switchFork(BlockCapsule newHead)
11111112
while (!getDynamicPropertiesStore()
11121113
.getLatestBlockHeaderHash()
11131114
.equals(binaryTree.getValue().peekLast().getParentHash())) {
1114-
reOrgContractTrigger();
1115+
if (EventPluginLoader.getInstance().getVersion() == 0) {
1116+
reOrgContractTrigger();
1117+
}
11151118
reOrgLogsFilter();
11161119
eraseBlock();
11171120
}
@@ -1373,11 +1376,26 @@ public void pushBlock(final BlockCapsule block)
13731376
}
13741377

13751378
void blockTrigger(final BlockCapsule block, long oldSolid, long newSolid) {
1379+
// post block and logs for jsonrpc
13761380
try {
1381+
if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) {
1382+
postBlockFilter(block, false);
1383+
postLogsFilter(block, false, false);
1384+
}
1385+
1386+
if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) {
1387+
postSolidityFilter(oldSolid, newSolid);
1388+
}
1389+
1390+
if (EventPluginLoader.getInstance().getVersion() != 0) {
1391+
lastUsedSolidityNum = newSolid;
1392+
return;
1393+
}
1394+
13771395
// if event subscribe is enabled, post block trigger to queue
13781396
postBlockTrigger(block);
13791397
// if event subscribe is enabled, post solidity trigger to queue
1380-
postSolidityTrigger(oldSolid, newSolid);
1398+
postSolidityTrigger(newSolid);
13811399
} catch (Exception e) {
13821400
logger.error("Block trigger failed. head: {}, oldSolid: {}, newSolid: {}",
13831401
block.getNum(), oldSolid, newSolid, e);
@@ -1517,7 +1535,8 @@ public TransactionInfo processTransaction(final TransactionCapsule trxCap, Block
15171535

15181536
// if event subscribe is enabled, post contract triggers to queue
15191537
// only trigger when process block
1520-
if (Objects.nonNull(blockCap) && !blockCap.isMerkleRootEmpty()) {
1538+
if (Objects.nonNull(blockCap) && !blockCap.isMerkleRootEmpty()
1539+
&& EventPluginLoader.getInstance().getVersion() == 0) {
15211540
String blockHash = blockCap.getBlockId().toString();
15221541
postContractTrigger(trace, false, blockHash);
15231542
}
@@ -2096,7 +2115,7 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif
20962115
}
20972116
}
20982117

2099-
private void postSolidityTrigger(final long oldSolidNum, final long latestSolidifiedBlockNumber) {
2118+
private void postSolidityTrigger(final long latestSolidifiedBlockNumber) {
21002119
if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityLogTriggerEnable()) {
21012120
for (Long i : Args.getSolidityContractLogTriggerMap().keySet()) {
21022121
postSolidityLogContractTrigger(i, latestSolidifiedBlockNumber);
@@ -2122,10 +2141,6 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi
21222141
}
21232142
}
21242143
}
2125-
2126-
if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) {
2127-
postSolidityFilter(oldSolidNum, latestSolidifiedBlockNumber);
2128-
}
21292144
lastUsedSolidityNum = latestSolidifiedBlockNumber;
21302145
}
21312146

@@ -2237,12 +2252,6 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified,
22372252
}
22382253

22392254
void postBlockTrigger(final BlockCapsule blockCapsule) {
2240-
// post block and logs for jsonrpc
2241-
if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) {
2242-
postBlockFilter(blockCapsule, false);
2243-
postLogsFilter(blockCapsule, false, false);
2244-
}
2245-
22462255
// process block trigger
22472256
long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
22482257
if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) {
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package org.tron.core.services.event;
2+
3+
import com.google.common.collect.Lists;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.concurrent.ConcurrentHashMap;
8+
import lombok.Getter;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.tron.core.capsule.BlockCapsule;
11+
import org.tron.core.services.event.bo.BlockEvent;
12+
import org.tron.core.services.event.exception.EventException;
13+
14+
@Slf4j(topic = "event")
15+
public class BlockEventCache {
16+
@Getter
17+
private static volatile long solidNum;
18+
19+
@Getter
20+
private static volatile BlockEvent head;
21+
22+
@Getter
23+
private static volatile BlockCapsule.BlockId solidId;
24+
25+
private static Map<BlockCapsule.BlockId, BlockEvent> blockEventMap = new ConcurrentHashMap<>();
26+
27+
private static Map<Long, List<BlockEvent>> numMap = new ConcurrentHashMap<>();
28+
29+
public static BlockEvent getBlockEvent(BlockCapsule.BlockId blockId) {
30+
return blockEventMap.get(blockId);
31+
}
32+
33+
public static void init(BlockCapsule.BlockId blockId) {
34+
blockEventMap.clear();
35+
numMap.clear();
36+
solidNum = blockId.getNum();
37+
head = new BlockEvent(blockId);
38+
solidId = blockId;
39+
List<BlockEvent> list = new ArrayList<>();
40+
list.add(head);
41+
numMap.put(blockId.getNum(), list);
42+
blockEventMap.put(blockId, head);
43+
}
44+
45+
public static void add(BlockEvent blockEvent) throws EventException {
46+
logger.info("Add block event, {}", blockEvent.getBlockId().getString(),
47+
blockEvent.getParentId().getString());
48+
if (blockEventMap.get(blockEvent.getParentId()) == null) {
49+
throw new EventException("unlink BlockEvent, "
50+
+ blockEvent.getBlockId().getString() + ", "
51+
+ blockEvent.getParentId().getString());
52+
}
53+
54+
long num = blockEvent.getBlockId().getNum();
55+
List<BlockEvent> list = numMap.get(num);
56+
if (list == null) {
57+
list = new ArrayList<>();
58+
numMap.put(num, list);
59+
}
60+
list.add(blockEvent);
61+
62+
blockEventMap.put(blockEvent.getBlockId(), blockEvent);
63+
64+
if (num > head.getBlockId().getNum()) {
65+
head = blockEvent;
66+
}
67+
68+
if (blockEvent.getSolidId().getNum() > solidId.getNum()) {
69+
solidId = blockEvent.getSolidId();
70+
}
71+
}
72+
73+
public static void remove(BlockCapsule.BlockId solidId) {
74+
logger.info("Remove solidId {}, solidNum {}, {}, {}",
75+
solidId.getString(), solidNum, numMap.size(), blockEventMap.size());
76+
numMap.forEach((k, v) -> {
77+
if (k < solidId.getNum()) {
78+
v.forEach(value -> blockEventMap.remove(value.getBlockId()));
79+
numMap.remove(k);
80+
}
81+
});
82+
solidNum = solidId.getNum();
83+
}
84+
85+
public static List<BlockEvent> getSolidBlockEvents(BlockCapsule.BlockId solidId) {
86+
List<BlockEvent> blockEvents = new ArrayList<>();
87+
BlockCapsule.BlockId tmp = solidId;
88+
while (tmp.getNum() > solidNum) {
89+
BlockEvent blockEvent = blockEventMap.get(tmp);
90+
blockEvents.add(blockEvent);
91+
tmp = blockEvent.getParentId();
92+
}
93+
94+
return Lists.reverse(blockEvents);
95+
}
96+
}

0 commit comments

Comments
 (0)