Skip to content

Commit da34e9d

Browse files
committed
Mutations, Termination, Logging, Bug fixes
1 parent d9721d2 commit da34e9d

29 files changed

+1728
-218
lines changed

simulator/src/main/java/byzzbench/simulator/config/ByzzBenchConfig.java

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
@Data
2121
@Validated
2222
public class ByzzBenchConfig {
23+
private boolean smallScope = true;
24+
2325
/**
2426
* Whether to start generating scenarios on startup automatically.
2527
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package byzzbench.simulator.faults;
2+
3+
public interface ReplicaFault {
4+
String getFaultyReplicaId();
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package byzzbench.simulator.faults;
2+
3+
public interface RoundBasedFault {
4+
long getRound();
5+
}

simulator/src/main/java/byzzbench/simulator/faults/factories/ByzzFuzzScenarioFaultFactory.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import byzzbench.simulator.faults.FaultFactory;
77
import byzzbench.simulator.faults.faults.ByzzFuzzNetworkFault;
88
import byzzbench.simulator.faults.faults.ByzzFuzzProcessFault;
9+
import byzzbench.simulator.protocols.event_driven_hotstuff.EDHotStuffScenario;
910
import byzzbench.simulator.scheduler.ByzzFuzzScheduler;
1011
import byzzbench.simulator.utils.SetSubsets;
1112
import org.springframework.stereotype.Component;
@@ -36,7 +37,7 @@ public List<Fault> generateFaults(FaultContext input) {
3637
int c = scheduler.getNumRoundsWithProcessFaults();
3738
int d = scheduler.getNumRoundsWithNetworkFaults();
3839
int r = scheduler.getNumRoundsWithFaults();
39-
Set<String> nodeIds = scenario.getNodes().keySet();
40+
Set<String> nodeIds = scenario.getReplicas().keySet();
4041

4142
// Create network faults
4243
for (int i = 1; i <= d; i++) {
@@ -58,8 +59,14 @@ public List<Fault> generateFaults(FaultContext input) {
5859
}
5960

6061
// Faults
61-
System.out.println("ByzzFuzzFaults:");
62-
faults.forEach(fault -> System.out.println(fault.getId()));
62+
if(input.getScenario() instanceof EDHotStuffScenario edHotStuffScenario) {
63+
edHotStuffScenario.log("ByzzFuzzFaults:");
64+
faults.forEach(fault -> edHotStuffScenario.log(fault.getId()));
65+
}
66+
else {
67+
System.out.println("ByzzFuzzFaults:");
68+
faults.forEach(fault -> System.out.println(fault.getId()));
69+
}
6370

6471
return faults;
6572
}

simulator/src/main/java/byzzbench/simulator/faults/faults/ByzzFuzzNetworkFault.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package byzzbench.simulator.faults.faults;
22

33
import byzzbench.simulator.faults.BaseFault;
4+
import byzzbench.simulator.faults.RoundBasedFault;
45
import byzzbench.simulator.faults.behaviors.CreateNetworkPartitionsBehavior;
56
import byzzbench.simulator.faults.predicates.MessageRoundPredicate;
7+
import lombok.Getter;
68

79
import java.util.Set;
810

@@ -12,7 +14,10 @@
1214
* matches the round number of the fault, and the sender and receiver of the message
1315
* are not in the same partition, the message will be dropped.
1416
*/
15-
public class ByzzFuzzNetworkFault extends BaseFault {
17+
public class ByzzFuzzNetworkFault extends BaseFault implements RoundBasedFault {
18+
19+
@Getter
20+
private final long round;
1621
/**
1722
* Create a new ByzzFuzzNetworkFault
1823
*
@@ -25,5 +30,6 @@ public ByzzFuzzNetworkFault(Set<String> partition, int round) {
2530
new MessageRoundPredicate(round),
2631
new CreateNetworkPartitionsBehavior(partition)
2732
);
33+
this.round = round;
2834
}
2935
}

simulator/src/main/java/byzzbench/simulator/faults/faults/ByzzFuzzProcessFault.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package byzzbench.simulator.faults.faults;
22

33
import byzzbench.simulator.faults.BaseFault;
4+
import byzzbench.simulator.faults.ReplicaFault;
5+
import byzzbench.simulator.faults.RoundBasedFault;
46
import byzzbench.simulator.faults.behaviors.MutateMessageBehavior;
57
import byzzbench.simulator.faults.predicates.MessageRecipientHasIdPredicate;
68
import byzzbench.simulator.faults.predicates.MessageRoundPredicate;
79
import byzzbench.simulator.faults.predicates.MessageSenderHasIdPredicate;
10+
import lombok.Getter;
811

912
import java.util.Set;
1013

@@ -13,7 +16,13 @@
1316
* messages that contain a round number. If the message matches the sender, receiver and
1417
* round number of the fault, a random mutation is applied to the message.
1518
*/
16-
public class ByzzFuzzProcessFault extends BaseFault {
19+
public class ByzzFuzzProcessFault extends BaseFault implements RoundBasedFault, ReplicaFault {
20+
21+
@Getter
22+
private final long round;
23+
24+
private final String senderId;
25+
1726
/**
1827
* Create a new ByzzFuzzProcessFault
1928
*
@@ -29,5 +38,11 @@ public ByzzFuzzProcessFault(Set<String> recipients, String sender, int round) {
2938
.and(new MessageRecipientHasIdPredicate(recipients)),
3039
new MutateMessageBehavior()
3140
);
41+
this.round = round;
42+
this.senderId = sender;
43+
}
44+
45+
public String getFaultyReplicaId() {
46+
return senderId;
3247
}
3348
}

simulator/src/main/java/byzzbench/simulator/protocols/event_driven_hotstuff/EDHSPacemaker.java

+19-6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public EDHSPacemaker(EDHotStuffReplica replica, EDHSNode initialLeft, EDHSQuorum
2626
}
2727

2828
public String getLeaderId(long viewNumber) {
29-
int leaderIndex = (int) (viewNumber % (replica.getReplicaIds().size()));
29+
int leaderIndex = (int) (Math.floor((double) viewNumber / 4) % (replica.getReplicaIds().size()));
3030

3131
return replica.getReplicaIds().get(leaderIndex);
3232
}
@@ -57,9 +57,21 @@ public void updateHighQC(EDHSQuorumCertificate newQC) {
5757
}
5858
}
5959

60-
public void onNewViewQuorum() { onBeat(); }
61-
public void onNewQC() { onBeat(); }
62-
public void onClientRequest() { onBeat(); }
60+
public void onNewViewQuorum() {
61+
onBeat();
62+
63+
replica.log("PM: on NEW-VIEW quorum");
64+
}
65+
public void onNewQC() {
66+
onBeat();
67+
68+
replica.log("PM: on new QC");
69+
}
70+
public void onClientRequest() {
71+
onBeat();
72+
73+
replica.log("PM: on client request");
74+
}
6375

6476
private void onBeat() {
6577
try {
@@ -82,10 +94,11 @@ private void onBeat() {
8294
}
8395

8496
public void onNextSyncView() {
97+
replica.log("Next view sync timeout");
98+
99+
replica.increaseTimeout();
85100
replica.nextView();
86101
replica.sendMessage(new NewViewMessage(replica.getViewNumber(), highQC), getLeaderId());
87-
88-
replica.log("Next view sync timeout");
89102
}
90103

91104
// NEW-VIEW
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package byzzbench.simulator.protocols.event_driven_hotstuff;
2+
3+
import lombok.Data;
4+
import lombok.Getter;
5+
import lombok.ToString;
6+
7+
@Data
8+
public class EDHSScenarioState {
9+
private boolean livenessViolation;
10+
private boolean agreementViolation;
11+
private long maxView;
12+
private long minView;
13+
private int commitedNodes;
14+
private boolean validAssumptions;
15+
16+
public EDHSScenarioState() {
17+
livenessViolation = false;
18+
agreementViolation = false;
19+
maxView = 0;
20+
minView = 0;
21+
commitedNodes = 0;
22+
validAssumptions = true;
23+
}
24+
25+
@Override
26+
public String toString() {
27+
return "EDHSScenarioState{" +
28+
"livenessViolation=" + livenessViolation +
29+
", agreementViolation=" + agreementViolation +
30+
", maxView=" + maxView +
31+
", minView=" + minView +
32+
", commitedNodes=" + commitedNodes +
33+
", validAssumptions=" + validAssumptions +
34+
'}';
35+
}
36+
}

0 commit comments

Comments
 (0)