diff --git a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java index 093594f1c95..5aee55b1c13 100644 --- a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java @@ -4,6 +4,8 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; + +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -20,6 +22,9 @@ public class RealtimeEventService { private EventPluginLoader instance = EventPluginLoader.getInstance(); + @Getter + private static Object contractLock = new Object(); + @Autowired private Manager manager; @@ -94,30 +99,32 @@ public void flush(BlockEvent blockEvent, boolean isRemove) { } } - if (instance.isContractEventTriggerEnable()) { - if (blockEvent.getSmartContractTrigger() == null) { - logger.warn("SmartContractTrigger is null. {}", blockEvent.getBlockId().getString()); - } else { - blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { - v.setTriggerName(Trigger.CONTRACTEVENT_TRIGGER_NAME); - v.setRemoved(isRemove); - EventPluginLoader.getInstance().postContractEventTrigger(v); - }); + synchronized (contractLock) { + if (instance.isContractEventTriggerEnable()) { + if (blockEvent.getSmartContractTrigger() == null) { + logger.warn("SmartContractTrigger is null. {}", blockEvent.getBlockId().getString()); + } else { + blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { + v.setTriggerName(Trigger.CONTRACTEVENT_TRIGGER_NAME); + v.setRemoved(isRemove); + EventPluginLoader.getInstance().postContractEventTrigger(v); + }); + } } - } - if (instance.isContractLogTriggerEnable() && blockEvent.getSmartContractTrigger() != null) { - blockEvent.getSmartContractTrigger().getContractLogTriggers().forEach(v -> { - v.setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME); - v.setRemoved(isRemove); - EventPluginLoader.getInstance().postContractLogTrigger(v); - }); - if (instance.isContractLogTriggerRedundancy()) { - blockEvent.getSmartContractTrigger().getRedundancies().forEach(v -> { + if (instance.isContractLogTriggerEnable() && blockEvent.getSmartContractTrigger() != null) { + blockEvent.getSmartContractTrigger().getContractLogTriggers().forEach(v -> { v.setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME); v.setRemoved(isRemove); EventPluginLoader.getInstance().postContractLogTrigger(v); }); + if (instance.isContractLogTriggerRedundancy()) { + blockEvent.getSmartContractTrigger().getRedundancies().forEach(v -> { + v.setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME); + v.setRemoved(isRemove); + EventPluginLoader.getInstance().postContractLogTrigger(v); + }); + } } } } diff --git a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java index 6102a87f892..0614541f16f 100644 --- a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java @@ -86,27 +86,32 @@ public void flush(BlockEvent blockEvent) { } } - if (instance.isSolidityEventTriggerEnable()) { - if (blockEvent.getSmartContractTrigger() == null) { - logger.warn("SmartContractTrigger is null. {}", blockEvent.getBlockId()); - } else { - blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { - v.setTriggerName(Trigger.SOLIDITYEVENT_TRIGGER_NAME); - EventPluginLoader.getInstance().postSolidityEventTrigger(v); - }); + synchronized (RealtimeEventService.getContractLock()) { + if (instance.isSolidityEventTriggerEnable()) { + if (blockEvent.getSmartContractTrigger() == null) { + logger.warn("SmartContractTrigger is null. {}", blockEvent.getBlockId()); + } else { + blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { + v.setTriggerName(Trigger.SOLIDITYEVENT_TRIGGER_NAME); + v.setRemoved(false); + EventPluginLoader.getInstance().postSolidityEventTrigger(v); + }); + } } - } - if (instance.isSolidityLogTriggerEnable() && blockEvent.getSmartContractTrigger() != null) { - blockEvent.getSmartContractTrigger().getContractLogTriggers().forEach(v -> { - v.setTriggerName(Trigger.SOLIDITYLOG_TRIGGER_NAME); - EventPluginLoader.getInstance().postSolidityLogTrigger(v); - }); - if (instance.isSolidityLogTriggerRedundancy()) { - blockEvent.getSmartContractTrigger().getRedundancies().forEach(v -> { + if (instance.isSolidityLogTriggerEnable() && blockEvent.getSmartContractTrigger() != null) { + blockEvent.getSmartContractTrigger().getContractLogTriggers().forEach(v -> { v.setTriggerName(Trigger.SOLIDITYLOG_TRIGGER_NAME); + v.setRemoved(false); EventPluginLoader.getInstance().postSolidityLogTrigger(v); }); + if (instance.isSolidityLogTriggerRedundancy()) { + blockEvent.getSmartContractTrigger().getRedundancies().forEach(v -> { + v.setTriggerName(Trigger.SOLIDITYLOG_TRIGGER_NAME); + v.setRemoved(false); + EventPluginLoader.getInstance().postSolidityLogTrigger(v); + }); + } } }