diff --git a/src/refit/config/REFITConfig.java b/src/refit/config/REFITConfig.java index d55d2751fff2fc49f0e5287522d0031b43da5367..046b46534ee71e4fa76c13633445a3f92b19c30e 100644 --- a/src/refit/config/REFITConfig.java +++ b/src/refit/config/REFITConfig.java @@ -213,7 +213,7 @@ public class REFITConfig { public static final Class<? extends REFITBenchmarkRunnable> APPLICATION_CLIENT = config.getClass("application.client", REFITBenchmarkRunnable.class); public static final Class<? extends REFITClientLibrary> APPLICATION_CLIENT_LIBRARY = config.getClass("application.library", REFITClientLibrary.class); public static final Class<? extends REFITClientPolicy> APPLICATION_CLIENT_POLICY = config.getClass("application.policy", REFITClientPolicy.class); - public static final Class<? extends REFITBaseReplica> APPLICATION_REPLICA = config.getClass("application.replica", REFITBaseReplica.class); + public static final Class<? extends REFITBaseReplica> APPLICATION_REPLICA; // Communication public static final int REPLICA_NETWORK_SEND_BUFFER_SIZE = 1024 * config.getInt("replica.network.buffer.send.kb"); @@ -375,6 +375,8 @@ public class REFITConfig { REFITAssert.assertTrue(!REFITConfig.AUTHENTICATE_MESSAGES || REFITConfig.WAIT_FOR_FULL_REPLY, "ack replies are not yet implemented in the BFT protocol"); + + APPLICATION_REPLICA = config.getClass("application.replica", REFITBaseReplica.class); } diff --git a/src/refit/replica/REFITMicroIRMCReplica.java b/src/refit/replica/REFITMicroIRMCReplica.java index a76f64530a7ec14465c0831a28d4559e84afa6a8..e2a404da638a4af907888cb678554c09ff075757 100644 --- a/src/refit/replica/REFITMicroIRMCReplica.java +++ b/src/refit/replica/REFITMicroIRMCReplica.java @@ -17,14 +17,15 @@ public class REFITMicroIRMCReplica extends REFITBaseReplica { private final REFITAbstractChannelSender orderedChannelSenderStage; private final REFITAbstractChannelReceiver orderedChannelReceiverStage; - - public REFITMicroIRMCReplica(short id, boolean isSingleThreaded) { - super(id, isSingleThreaded, false); - + static { // partial configuration sanity check REFITAssert.assertTrue(REFITConfig.AUTONOMOUS_PANICS && REFITConfig.SEPARATE_EXECUTION_REPLICAS && REFITConfig.BATCH_ALWAYS && REFITOrderGroups.COUNT == 1 && REFITConfig.SIGNED_REQUESTS, "Incompatible configuration"); + } + + public REFITMicroIRMCReplica(short id, boolean isSingleThreaded) { + super(id, isSingleThreaded, false); boolean isExecutor = (id >= REFITConfig.ORDER_GROUP_SIZE); diff --git a/src/refit/replica/REFITReplica.java b/src/refit/replica/REFITReplica.java index b1fbaf833516a525a4ee57aa01965ddee6a72972..c3fa03e16bc623beca07b3a45f4f034e93ee49f0 100644 --- a/src/refit/replica/REFITReplica.java +++ b/src/refit/replica/REFITReplica.java @@ -27,13 +27,14 @@ public class REFITReplica extends REFITBaseReplica { private final REFITExecutionStageBase executionStage; private final REFITFuzzyCheckpointStage fuzzyCheckpointStage; - - public REFITReplica(short id, boolean isSingleThreaded) { - super(id, isSingleThreaded, true); - + static { if (REFITOrderGroups.COUNT > 1) { throw new AssertionError("The base configuration only supports a single order group!"); } + } + + public REFITReplica(short id, boolean isSingleThreaded) { + super(id, isSingleThreaded, true); // Create global stages if (id < REFITConfig.EXEC_GROUP_SIZE) { diff --git a/src/refit/replica/REFITSpiderReplica.java b/src/refit/replica/REFITSpiderReplica.java index 11c113ec6b6e65876190fc3eefa3b6fe8ce312c2..58245811bdf4974254e2477f4a5e8361c10997b4 100644 --- a/src/refit/replica/REFITSpiderReplica.java +++ b/src/refit/replica/REFITSpiderReplica.java @@ -38,14 +38,15 @@ public class REFITSpiderReplica extends REFITBaseReplica { private final REFITAbstractChannelSender orderedChannelSenderStage; private final REFITAbstractChannelReceiver orderedChannelReceiverStage; - - public REFITSpiderReplica(short id, boolean isSingleThreaded) { - super(id, isSingleThreaded, (id >= REFITConfig.ORDER_GROUP_SIZE)); - + static { // partial configuration sanity check REFITAssert.assertTrue(REFITConfig.AUTONOMOUS_PANICS && REFITConfig.SEPARATE_EXECUTION_REPLICAS && REFITConfig.BATCH_ALWAYS && REFITOrderGroups.COUNT == 1 && REFITConfig.SIGNED_REQUESTS, "Incompatible configuration"); + } + + public REFITSpiderReplica(short id, boolean isSingleThreaded) { + super(id, isSingleThreaded, (id >= REFITConfig.ORDER_GROUP_SIZE)); boolean isExecutor = (id >= REFITConfig.ORDER_GROUP_SIZE); int executorID = REFITReplicaGroups.getExecutionGroupId(id); diff --git a/src/refit/replica/REFITWeaveReplica.java b/src/refit/replica/REFITWeaveReplica.java index 442e8ed698d354536978caf19795fea75cf08cc4..e037a10593c6fa29417f43f20a2f77f0594f520b 100644 --- a/src/refit/replica/REFITWeaveReplica.java +++ b/src/refit/replica/REFITWeaveReplica.java @@ -31,14 +31,15 @@ public class REFITWeaveReplica extends REFITBaseReplica { private final REFITGroupMessageRouter msgRouter; - - public REFITWeaveReplica(short id, boolean isSingleThreaded) { - super(id, isSingleThreaded, true); - + static { // minimal sanity check REFITAssert.assertTrue(REFITConfig.LOCATION_BASED_ORDER_GROUPS && REFITConfig.TOTAL_NR_OF_REPLICAS == REFITConfig.ORDER_GROUP_SIZE && REFITConfig.TOTAL_NR_OF_REPLICAS == REFITConfig.EXEC_GROUP_SIZE, "Incompatible configuration"); + } + + public REFITWeaveReplica(short id, boolean isSingleThreaded) { + super(id, isSingleThreaded, true); for (int i = 0; i < REFITOrderGroups.COUNT; i++) { REFITLogger.logDebug(this, "Order group " + i + ": " + Arrays.toString(REFITConfig.ORDER_GROUPS[i]));