Skip to content

Commit cd7771b

Browse files
committed
Extended technical report View change protocol
1 parent b66da51 commit cd7771b

File tree

7 files changed

+387
-91
lines changed

7 files changed

+387
-91
lines changed

simulator/src/main/java/byzzbench/simulator/protocols/Zyzzyva/MessageLog.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,16 @@ public MessageLog() {
7676
this.setLastCheckpoint(0L);
7777
}
7878

79-
public List<OrderedRequestMessageWrapper> getOrderedRequestHistory(long sequenceNumber) {
80-
ArrayList<OrderedRequestMessageWrapper> orderedRequestHistory = new ArrayList<>();
79+
/**
80+
* Get the ordered request history from the sequence number to the end of the ordered messages
81+
* @param sequenceNumber - the sequence number to start the history from
82+
* @return - a map of the ordered request history with the sequence number as the key
83+
*/
84+
public SortedMap<Long, OrderedRequestMessageWrapper> getOrderedRequestHistory(long sequenceNumber) {
85+
SortedMap<Long, OrderedRequestMessageWrapper> orderedRequestHistory = new TreeMap<>();
8186
long maxSeqNum = this.getOrderedMessages().isEmpty() ? 0 : this.getOrderedMessages().lastKey();
8287
for (long i = sequenceNumber + 1; i <= maxSeqNum; i++) {
83-
orderedRequestHistory.add(this.orderedMessages.get(i));
88+
orderedRequestHistory.put(i, this.orderedMessages.get(i));
8489
}
8590
return orderedRequestHistory;
8691
}
@@ -194,6 +199,10 @@ public void putRequestCache(String clientId, RequestMessage rm, SpeculativeRespo
194199
this.getResponseCache().put(clientId, new ImmutablePair<>(rm, srw));
195200
}
196201

202+
public void putOrderedRequestMessageWrapper(OrderedRequestMessageWrapper ormw) {
203+
this.getOrderedMessages().put(ormw.getOrderedRequest().getSequenceNumber(), ormw);
204+
}
205+
197206
public long highestTimestampInCacheForClient(String clientId) {
198207
if (!this.getResponseCache().containsKey(clientId)) {
199208
return -1;

simulator/src/main/java/byzzbench/simulator/protocols/Zyzzyva/SpeculativeHistory.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package byzzbench.simulator.protocols.Zyzzyva;
22

33
import java.util.LinkedHashMap;
4+
import java.util.Map;
5+
46
import lombok.extern.java.Log;
57

68
@Log
@@ -90,6 +92,10 @@ public boolean has(long index) {
9092
return this.speculativeHistory.containsKey(index);
9193
}
9294

95+
public Map.Entry<Long, Long> getLastEntry() {
96+
return this.speculativeHistory.lastEntry();
97+
}
98+
9399
/**
94100
* Get the length of the speculative history
95101
* @return the length of the speculative history

simulator/src/main/java/byzzbench/simulator/protocols/Zyzzyva/ZyzzyvaReplica.java

+324-83
Large diffs are not rendered by default.

simulator/src/main/java/byzzbench/simulator/protocols/Zyzzyva/message/NewViewMessage.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@
55
import lombok.With;
66

77
import java.util.Collection;
8+
import java.util.List;
9+
import java.util.SortedMap;
10+
import java.util.SortedSet;
811

912
@Data
1013
@EqualsAndHashCode(callSuper = true)
1114
@With
1215
public class NewViewMessage extends MessagePayload {
1316
private final long futureViewNumber;
14-
private final Collection<ViewChangeMessage> viewChangeMessages;
17+
// ReplicaId -> ViewChangeMessage
18+
private final SortedMap<String, ViewChangeMessage> viewChangeMessages;
19+
// SequenceNumber -> OrderedRequestMessageWrapper
20+
private final SortedMap<Long, OrderedRequestMessageWrapper> orderedRequestHistory;
1521

1622
@Override
1723
public String getType() {

simulator/src/main/java/byzzbench/simulator/protocols/Zyzzyva/message/OrderedRequestMessage.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,21 @@
88

99
@Data
1010
@With
11-
public class OrderedRequestMessage extends MessagePayload {
11+
public class OrderedRequestMessage extends MessagePayload implements Comparable<OrderedRequestMessage> {
1212
private final long viewNumber;
1313
private final long sequenceNumber;
1414
private final long history;
1515
private final byte[] digest;
1616

17+
@Override
18+
public int compareTo(OrderedRequestMessage o) {
19+
if (this.viewNumber != o.viewNumber) {
20+
return Long.compare(this.viewNumber, o.viewNumber);
21+
}
22+
return Long.compare(this.sequenceNumber, o.sequenceNumber);
23+
}
24+
25+
1726
@Override
1827
public boolean equals(Object obj) {
1928
if (obj instanceof OrderedRequestMessage other) {

simulator/src/main/java/byzzbench/simulator/protocols/Zyzzyva/message/OrderedRequestMessageWrapper.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,29 @@
88
@Data
99
@EqualsAndHashCode(callSuper = true)
1010
@With
11-
public class OrderedRequestMessageWrapper extends MessagePayload {
11+
public class OrderedRequestMessageWrapper extends MessagePayload implements Comparable<OrderedRequestMessageWrapper> {
1212
private final OrderedRequestMessage orderedRequest;
1313
private final RequestMessage requestMessage;
1414

15+
@Override
16+
public int compareTo(OrderedRequestMessageWrapper o) {
17+
return orderedRequest.compareTo(o.getOrderedRequest());
18+
}
19+
20+
@Override
21+
public boolean equals(Object obj) {
22+
if (obj instanceof OrderedRequestMessageWrapper other) {
23+
return orderedRequest.equals(other.getOrderedRequest()) &&
24+
requestMessage.equals(other.getRequestMessage());
25+
}
26+
return false;
27+
}
28+
29+
@Override
30+
public int hashCode() {
31+
return orderedRequest.hashCode() ^ requestMessage.hashCode();
32+
}
33+
1534
@Override
1635
public String getType() {
1736
return "ORDERED_REQUEST";

simulator/src/main/java/byzzbench/simulator/protocols/Zyzzyva/message/ViewChangeMessage.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
package byzzbench.simulator.protocols.Zyzzyva.message;
22

3+
import byzzbench.simulator.protocols.Zyzzyva.CommitCertificate;
34
import byzzbench.simulator.transport.MessagePayload;
45
import lombok.Data;
56
import lombok.EqualsAndHashCode;
67
import lombok.With;
78

89
import java.io.Serializable;
910
import java.util.List;
11+
import java.util.SortedMap;
12+
import java.util.SortedSet;
1013

1114
@Data
1215
@EqualsAndHashCode(callSuper = true)
1316
@With
1417
public class ViewChangeMessage extends MessagePayload {
1518
private final long futureViewNumber;
19+
private final long stableCheckpoint;
20+
/// TODO: initialize the message log with checkpoint messages
21+
private final List<CheckpointMessage> checkpoints;
1622
// CC is either the most recent commit certificate for a request since the last view change,
1723
// f + 1 view-confirm messages if no commit certificate is available,
1824
// or a new-view message if neither of the previous options are available.
19-
private final Serializable commitCertificate;
25+
private final CommitCertificate commitCertificate;
2026
// O is i’s ordered request history since the commit certificate indicated by CC
21-
private final List<OrderedRequestMessageWrapper> orderedRequestHistory;
27+
private final SortedMap<Long, OrderedRequestMessageWrapper> orderedRequestHistory;
2228
private final String replicaId;
2329

2430
@Override

0 commit comments

Comments
 (0)