diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index b1127029b46..e7aadc7f4aa 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -193,7 +193,8 @@ public class Manager { @Getter @Setter private boolean isSyncMode; - + @Getter + private Object forkLock = new Object(); // map @Getter @Setter @@ -1269,8 +1270,9 @@ public void pushBlock(final BlockCapsule block) chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp(), khaosDb.getHead(), khaosDb.getMiniStore().size(), khaosDb.getMiniUnlinkedStore().size()); - - switchFork(newBlock); + synchronized (forkLock) { + switchFork(newBlock); + } logger.info(SAVE_BLOCK, newBlock); logger.warn( diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 7ff02250eb5..47e13de6109 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -349,4 +349,8 @@ public boolean allowPBFT() { return chainBaseManager.getDynamicPropertiesStore().allowPBFT(); } + public Object getForkLock() { + return dbManager.getForkLock(); + } + } diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 86b775df6f8..5f7ab11f6c9 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -23,7 +23,6 @@ import org.tron.core.capsule.BlockCapsule.BlockId; import org.tron.core.config.Parameter.NetConstants; import org.tron.core.config.args.Args; -import org.tron.core.exception.BadBlockException; import org.tron.core.exception.P2pException; import org.tron.core.exception.P2pException.TypeEnum; import org.tron.core.net.TronNetDelegate; @@ -114,7 +113,10 @@ public void syncNext(PeerConnection peer) { logger.warn("Peer {} is in sync", peer.getInetSocketAddress()); return; } - LinkedList chainSummary = getBlockChainSummary(peer); + LinkedList chainSummary; + synchronized (tronNetDelegate.getForkLock()) { + chainSummary = getBlockChainSummary(peer); + } peer.setSyncChainRequested(new Pair<>(chainSummary, System.currentTimeMillis())); peer.sendMessage(new SyncBlockChainMessage(chainSummary)); } catch (Exception e) {