From 253eb1e388dd6258bc0ddbce498044eb23b101ec Mon Sep 17 00:00:00 2001
From: Michael Eischer <eischer@cs.fau.de>
Date: Thu, 2 Jul 2020 14:19:24 +0200
Subject: [PATCH] Move replica config assertions to static block

This ensures that a local configuration test will trigger these checks.
---
 src/refit/config/REFITConfig.java            | 4 +++-
 src/refit/replica/REFITMicroIRMCReplica.java | 9 +++++----
 src/refit/replica/REFITReplica.java          | 9 +++++----
 src/refit/replica/REFITSpiderReplica.java    | 9 +++++----
 src/refit/replica/REFITWeaveReplica.java     | 9 +++++----
 5 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/src/refit/config/REFITConfig.java b/src/refit/config/REFITConfig.java
index d55d275..046b465 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 a76f645..e2a404d 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 b1fbaf8..c3fa03e 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 11c113e..5824581 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 442e8ed..e037a10 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]));
-- 
GitLab