From 891d98db0fa78651f096338154a8125ea8ce5fc2 Mon Sep 17 00:00:00 2001 From: Meredith Baxter Date: Tue, 8 Oct 2019 15:51:02 -0400 Subject: [PATCH 1/3] Make SyncState variables visible across threads Signed-off-by: Meredith Baxter --- .../besu/ethereum/eth/sync/state/SyncState.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java index 159c03b9789..4e53e202676 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java @@ -25,6 +25,7 @@ import org.hyperledger.besu.util.Subscribers; import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; import com.google.common.annotations.VisibleForTesting; @@ -33,12 +34,12 @@ public class SyncState { private final Blockchain blockchain; private final EthPeers ethPeers; - private long startingBlock; - private boolean lastInSync = true; private final Subscribers inSyncListeners = Subscribers.create(); private final Subscribers syncStatusListeners = Subscribers.create(); - private Optional syncTarget = Optional.empty(); - private long chainHeightListenerId; + private volatile long chainHeightListenerId; + private volatile Optional syncTarget = Optional.empty(); + private volatile long startingBlock; + private AtomicBoolean lastInSync = new AtomicBoolean(true); public SyncState(final Blockchain blockchain, final EthPeers ethPeers) { this.blockchain = blockchain; @@ -166,8 +167,7 @@ public long bestChainHeight(final long localChainHeight) { private synchronized void checkInSync() { final boolean currentInSync = isInSync(); - if (lastInSync != currentInSync) { - lastInSync = currentInSync; + if (lastInSync.compareAndSet(!currentInSync, currentInSync)) { if (!currentInSync) { // when we fall out of sync change our starting block startingBlock = blockchain.getChainHeadBlockNumber(); From 409c0f53f83bda076ccd1fd26037a6c130700e66 Mon Sep 17 00:00:00 2001 From: Meredith Baxter Date: Tue, 8 Oct 2019 15:53:40 -0400 Subject: [PATCH 2/3] Add final keyword Signed-off-by: Meredith Baxter --- .../org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java index 4e53e202676..f60adfe9993 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java @@ -39,7 +39,7 @@ public class SyncState { private volatile long chainHeightListenerId; private volatile Optional syncTarget = Optional.empty(); private volatile long startingBlock; - private AtomicBoolean lastInSync = new AtomicBoolean(true); + private final AtomicBoolean lastInSync = new AtomicBoolean(true); public SyncState(final Blockchain blockchain, final EthPeers ethPeers) { this.blockchain = blockchain; From 58152f79d28111fa03611dd3464e5dae68cd3577 Mon Sep 17 00:00:00 2001 From: Meredith Baxter Date: Tue, 8 Oct 2019 16:42:55 -0400 Subject: [PATCH 3/3] Synchronize replaceSyncTarget Signed-off-by: Meredith Baxter --- .../org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java index f60adfe9993..560d7055877 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/state/SyncState.java @@ -140,7 +140,7 @@ public void clearSyncTarget() { replaceSyncTarget(Optional.empty()); } - private void replaceSyncTarget(final Optional newTarget) { + private synchronized void replaceSyncTarget(final Optional newTarget) { syncTarget.ifPresent(this::removeEstimatedHeightListener); syncTarget = newTarget; newTarget.ifPresent(this::addEstimatedHeightListener);