Skip to content

Commit 9985e73

Browse files
committed
try fix for parallelization
Signed-off-by: Karim Taam <karim.t2am@gmail.com>
1 parent 2106eea commit 9985e73

File tree

15 files changed

+191
-112
lines changed

15 files changed

+191
-112
lines changed

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private void handleFailedBlockProcessing(
241241
protected BlockProcessingResult processBlock(
242242
final ProtocolContext context, final MutableWorldState worldState, final Block block) {
243243

244-
return blockProcessor.processBlock(context.getBlockchain(), worldState, block);
244+
return blockProcessor.processBlock(context, context.getBlockchain(), worldState, block);
245245
}
246246

247247
@Override

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.hyperledger.besu.datatypes.Wei;
2323
import org.hyperledger.besu.ethereum.BlockProcessingOutputs;
2424
import org.hyperledger.besu.ethereum.BlockProcessingResult;
25+
import org.hyperledger.besu.ethereum.ProtocolContext;
2526
import org.hyperledger.besu.ethereum.chain.Blockchain;
2627
import org.hyperledger.besu.ethereum.core.BlockHeader;
2728
import org.hyperledger.besu.ethereum.core.MutableWorldState;
@@ -95,6 +96,7 @@ protected AbstractBlockProcessor(
9596

9697
@Override
9798
public BlockProcessingResult processBlock(
99+
final ProtocolContext protocolContext,
98100
final Blockchain blockchain,
99101
final MutableWorldState worldState,
100102
final BlockHeader blockHeader,
@@ -103,6 +105,7 @@ public BlockProcessingResult processBlock(
103105
final Optional<List<Withdrawal>> maybeWithdrawals,
104106
final PrivateMetadataUpdater privateMetadataUpdater) {
105107
return processBlock(
108+
protocolContext,
106109
blockchain,
107110
worldState,
108111
blockHeader,
@@ -114,6 +117,7 @@ public BlockProcessingResult processBlock(
114117
}
115118

116119
protected BlockProcessingResult processBlock(
120+
final ProtocolContext protocolContext,
117121
final Blockchain blockchain,
118122
final MutableWorldState worldState,
119123
final BlockHeader blockHeader,
@@ -148,7 +152,7 @@ protected BlockProcessingResult processBlock(
148152

149153
final Optional<PreprocessingContext> preProcessingContext =
150154
preprocessingBlockFunction.run(
151-
worldState,
155+
protocolContext,
152156
privateMetadataUpdater,
153157
blockHeader,
154158
transactions,
@@ -239,7 +243,7 @@ protected BlockProcessingResult processBlock(
239243
protocolSpec.getRequestProcessorCoordinator();
240244
Optional<List<Request>> maybeRequests = Optional.empty();
241245
if (requestProcessor.isPresent()) {
242-
ProcessRequestContext context =
246+
ProcessRequestContext processRequestContext =
243247
new ProcessRequestContext(
244248
blockHeader,
245249
worldState,
@@ -248,7 +252,7 @@ protected BlockProcessingResult processBlock(
248252
blockHashLookup,
249253
OperationTracer.NO_TRACING);
250254

251-
maybeRequests = Optional.of(requestProcessor.get().process(context));
255+
maybeRequests = Optional.of(requestProcessor.get().process(processRequestContext));
252256
}
253257

254258
if (!rewardCoinbase(worldState, blockHeader, ommers, skipZeroBlockRewards)) {
@@ -332,7 +336,7 @@ public interface PreprocessingContext {}
332336

333337
public interface PreprocessingFunction {
334338
Optional<PreprocessingContext> run(
335-
final MutableWorldState worldState,
339+
final ProtocolContext protocolContext,
336340
final PrivateMetadataUpdater privateMetadataUpdater,
337341
final BlockHeader blockHeader,
338342
final List<Transaction> transactions,
@@ -344,7 +348,7 @@ class NoPreprocessing implements PreprocessingFunction {
344348

345349
@Override
346350
public Optional<PreprocessingContext> run(
347-
final MutableWorldState worldState,
351+
final ProtocolContext protocolContext,
348352
final PrivateMetadataUpdater privateMetadataUpdater,
349353
final BlockHeader blockHeader,
350354
final List<Transaction> transactions,

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BlockProcessor.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import org.hyperledger.besu.datatypes.Wei;
1818
import org.hyperledger.besu.ethereum.BlockProcessingResult;
19+
import org.hyperledger.besu.ethereum.ProtocolContext;
1920
import org.hyperledger.besu.ethereum.chain.Blockchain;
2021
import org.hyperledger.besu.ethereum.core.Block;
2122
import org.hyperledger.besu.ethereum.core.BlockHeader;
@@ -68,14 +69,19 @@ default boolean isFailed() {
6869
/**
6970
* Processes the block.
7071
*
72+
* @param protocolContext the current context of the protocol
7173
* @param blockchain the blockchain to append the block to
7274
* @param worldState the world state to apply changes to
7375
* @param block the block to process
7476
* @return the block processing result
7577
*/
7678
default BlockProcessingResult processBlock(
77-
final Blockchain blockchain, final MutableWorldState worldState, final Block block) {
79+
final ProtocolContext protocolContext,
80+
final Blockchain blockchain,
81+
final MutableWorldState worldState,
82+
final Block block) {
7883
return processBlock(
84+
protocolContext,
7985
blockchain,
8086
worldState,
8187
block.getHeader(),
@@ -88,6 +94,7 @@ default BlockProcessingResult processBlock(
8894
/**
8995
* Processes the block.
9096
*
97+
* @param protocolContext the current context of the protocol
9198
* @param blockchain the blockchain to append the block to
9299
* @param worldState the world state to apply changes to
93100
* @param blockHeader the block header for the block
@@ -96,18 +103,27 @@ default BlockProcessingResult processBlock(
96103
* @return the block processing result
97104
*/
98105
default BlockProcessingResult processBlock(
106+
final ProtocolContext protocolContext,
99107
final Blockchain blockchain,
100108
final MutableWorldState worldState,
101109
final BlockHeader blockHeader,
102110
final List<Transaction> transactions,
103111
final List<BlockHeader> ommers) {
104112
return processBlock(
105-
blockchain, worldState, blockHeader, transactions, ommers, Optional.empty(), null);
113+
protocolContext,
114+
blockchain,
115+
worldState,
116+
blockHeader,
117+
transactions,
118+
ommers,
119+
Optional.empty(),
120+
null);
106121
}
107122

108123
/**
109124
* Processes the block.
110125
*
126+
* @param protocolContext the current context of the protocol
111127
* @param blockchain the blockchain to append the block to
112128
* @param worldState the world state to apply changes to
113129
* @param blockHeader the block header for the block
@@ -118,6 +134,7 @@ default BlockProcessingResult processBlock(
118134
* @return the block processing result
119135
*/
120136
BlockProcessingResult processBlock(
137+
ProtocolContext protocolContext,
121138
Blockchain blockchain,
122139
MutableWorldState worldState,
123140
BlockHeader blockHeader,
@@ -129,13 +146,15 @@ BlockProcessingResult processBlock(
129146
/**
130147
* Processes the block when running Besu in GoQuorum-compatible mode
131148
*
149+
* @param protocolContext the current context of the protocol
132150
* @param blockchain the blockchain to append the block to
133151
* @param worldState the world state to apply public transactions to
134152
* @param privateWorldState the private world state to apply private transaction to
135153
* @param block the block to process
136154
* @return the block processing result
137155
*/
138156
default BlockProcessingResult processBlock(
157+
final ProtocolContext protocolContext,
139158
final Blockchain blockchain,
140159
final MutableWorldState worldState,
141160
final MutableWorldState privateWorldState,

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.hyperledger.besu.datatypes.Wei;
2626
import org.hyperledger.besu.ethereum.BlockProcessingResult;
2727
import org.hyperledger.besu.ethereum.MainnetBlockValidator;
28+
import org.hyperledger.besu.ethereum.ProtocolContext;
2829
import org.hyperledger.besu.ethereum.chain.Blockchain;
2930
import org.hyperledger.besu.ethereum.core.BlockHeader;
3031
import org.hyperledger.besu.ethereum.core.MiningConfiguration;
@@ -988,6 +989,7 @@ private record DaoBlockProcessor(BlockProcessor wrapped) implements BlockProcess
988989

989990
@Override
990991
public BlockProcessingResult processBlock(
992+
final ProtocolContext protocolContext,
991993
final Blockchain blockchain,
992994
final MutableWorldState worldState,
993995
final BlockHeader blockHeader,
@@ -997,6 +999,7 @@ public BlockProcessingResult processBlock(
997999
final PrivateMetadataUpdater privateMetadataUpdater) {
9981000
updateWorldStateForDao(worldState);
9991001
return wrapped.processBlock(
1002+
protocolContext,
10001003
blockchain,
10011004
worldState,
10021005
blockHeader,

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/PrivacyBlockProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hyperledger.besu.enclave.EnclaveClientException;
2222
import org.hyperledger.besu.enclave.types.ReceiveResponse;
2323
import org.hyperledger.besu.ethereum.BlockProcessingResult;
24+
import org.hyperledger.besu.ethereum.ProtocolContext;
2425
import org.hyperledger.besu.ethereum.chain.Blockchain;
2526
import org.hyperledger.besu.ethereum.core.BlockHeader;
2627
import org.hyperledger.besu.ethereum.core.MutableWorldState;
@@ -83,6 +84,7 @@ public void setPublicWorldStateArchive(final WorldStateArchive publicWorldStateA
8384

8485
@Override
8586
public BlockProcessingResult processBlock(
87+
final ProtocolContext protocolContext,
8688
final Blockchain blockchain,
8789
final MutableWorldState worldState,
8890
final BlockHeader blockHeader,
@@ -102,6 +104,7 @@ public BlockProcessingResult processBlock(
102104

103105
final BlockProcessingResult result =
104106
blockProcessor.processBlock(
107+
protocolContext,
105108
blockchain,
106109
worldState,
107110
blockHeader,

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hyperledger.besu.datatypes.Address;
1818
import org.hyperledger.besu.datatypes.Wei;
1919
import org.hyperledger.besu.ethereum.BlockProcessingResult;
20+
import org.hyperledger.besu.ethereum.ProtocolContext;
2021
import org.hyperledger.besu.ethereum.chain.Blockchain;
2122
import org.hyperledger.besu.ethereum.core.BlockHeader;
2223
import org.hyperledger.besu.ethereum.core.MutableWorldState;
@@ -31,7 +32,7 @@
3132
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecBuilder;
3233
import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater;
3334
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
34-
import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState;
35+
import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedWorldStateProvider;
3536
import org.hyperledger.besu.evm.operation.BlockHashOperation;
3637
import org.hyperledger.besu.evm.worldstate.WorldUpdater;
3738
import org.hyperledger.besu.metrics.BesuMetricCategory;
@@ -137,6 +138,7 @@ protected TransactionProcessingResult getTransactionProcessingResult(
137138

138139
@Override
139140
public BlockProcessingResult processBlock(
141+
final ProtocolContext protocolContext,
140142
final Blockchain blockchain,
141143
final MutableWorldState worldState,
142144
final BlockHeader blockHeader,
@@ -146,6 +148,7 @@ public BlockProcessingResult processBlock(
146148
final PrivateMetadataUpdater privateMetadataUpdater) {
147149
final BlockProcessingResult blockProcessingResult =
148150
super.processBlock(
151+
protocolContext,
149152
blockchain,
150153
worldState,
151154
blockHeader,
@@ -154,13 +157,15 @@ public BlockProcessingResult processBlock(
154157
maybeWithdrawals,
155158
privateMetadataUpdater,
156159
new ParallelTransactionPreprocessing());
160+
157161
if (blockProcessingResult.isFailed()) {
158162
// Fallback to non-parallel processing if there is a block processing exception .
159163
LOG.warn(
160164
"Block processing failed. Falling back to non-parallel processing for block #{} ({})",
161165
blockHeader.getNumber(),
162166
blockHeader.getBlockHash());
163167
return super.processBlock(
168+
protocolContext,
164169
blockchain,
165170
worldState,
166171
blockHeader,
@@ -209,20 +214,20 @@ class ParallelTransactionPreprocessing implements PreprocessingFunction {
209214

210215
@Override
211216
public Optional<PreprocessingContext> run(
212-
final MutableWorldState worldState,
217+
final ProtocolContext protocolContext,
213218
final PrivateMetadataUpdater privateMetadataUpdater,
214219
final BlockHeader blockHeader,
215220
final List<Transaction> transactions,
216221
final Address miningBeneficiary,
217222
final BlockHashOperation.BlockHashLookup blockHashLookup,
218223
final Wei blobGasPrice) {
219-
if ((worldState instanceof DiffBasedWorldState)) {
224+
if ((protocolContext.getWorldStateArchive() instanceof DiffBasedWorldStateProvider)) {
220225
ParallelizedConcurrentTransactionProcessor parallelizedConcurrentTransactionProcessor =
221226
new ParallelizedConcurrentTransactionProcessor(transactionProcessor);
222227
// runAsyncBlock, if activated, facilitates the non-blocking parallel execution of
223228
// transactions in the background through an optimistic strategy.
224229
parallelizedConcurrentTransactionProcessor.runAsyncBlock(
225-
worldState,
230+
protocolContext,
226231
blockHeader,
227232
transactions,
228233
miningBeneficiary,

0 commit comments

Comments
 (0)