Skip to content

Commit f431331

Browse files
committed
fix RandomScheduler: do not mutate messages from non-faulty replicas
1 parent 81fba32 commit f431331

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

simulator/src/main/java/byzzbench/simulator/scheduler/RandomScheduler.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import java.util.List;
1616
import java.util.Optional;
1717
import java.util.Random;
18-
import java.util.stream.Collectors;
18+
import java.util.SortedSet;
1919

2020
/**
2121
* A scheduler that randomly selects events to deliver, drop, mutate or timeout.
@@ -52,14 +52,17 @@ public synchronized Optional<EventDecision> scheduleNext(Scenario scenario) thro
5252
}
5353

5454
List<TimeoutEvent> timeoutEvents = this.getQueuedTimeoutEvents(scenario);
55-
List<Event> clientRequestEvents = availableEvents.stream().filter(ClientRequestEvent.class::isInstance).collect(Collectors.toList());
56-
List<Event> messageEvents = availableEvents.stream().filter(MessageEvent.class::isInstance).collect(Collectors.toList());
55+
List<Event> clientRequestEvents = availableEvents.stream().filter(ClientRequestEvent.class::isInstance).toList();
56+
List<MessageEvent> messageEvents = availableEvents.stream().filter(MessageEvent.class::isInstance).map(MessageEvent.class::cast).toList();
57+
58+
SortedSet<String> faultyReplicaIds = scenario.getFaultyReplicaIds();
59+
List<MessageEvent> mutateableMessageEvents = messageEvents.stream().filter(msg -> faultyReplicaIds.contains(msg.getSenderId())).toList();
5760

5861
int timeoutWeight = timeoutEvents.size() * this.deliverTimeoutWeight();
5962
int deliverMessageWeight = messageEvents.size() * this.deliverMessageWeight();
6063
int deliverClientRequestWeight = clientRequestEvents.size() * this.deliverClientRequestWeight();
6164
int dropMessageWeight = (messageEvents.size() * this.dropMessageWeight(scenario));
62-
int mutateMessageWeight = (messageEvents.size() * this.mutateMessageWeight(scenario));
65+
int mutateMessageWeight = (mutateableMessageEvents.size() * this.mutateMessageWeight(scenario));
6366
int dieRoll = random.nextInt(timeoutWeight + deliverMessageWeight
6467
+ deliverClientRequestWeight + dropMessageWeight + mutateMessageWeight);
6568

@@ -102,7 +105,7 @@ public synchronized Optional<EventDecision> scheduleNext(Scenario scenario) thro
102105
// check if we should mutate-and-deliver a message sent between nodes
103106
dieRoll -= mutateMessageWeight;
104107
if (dieRoll < 0) {
105-
Event message = messageEvents.get(random.nextInt(messageEvents.size()));
108+
Event message = mutateableMessageEvents.get(random.nextInt(mutateableMessageEvents.size()));
106109
List<MessageMutationFault> mutators = this.getMessageMutatorService().getMutatorsForEvent(message);
107110

108111
if (mutators.isEmpty()) {

0 commit comments

Comments
 (0)