Strict Serializability Verifier may incorrectly handle blind writes when witnessed before the writing operation ACKs

patch by Benedict; reviewed by Alex Petrov for CASSANDRA-20905
diff --git a/.gitmodules b/.gitmodules
index 616dacf..a0aed84 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,4 @@
 [submodule "modules/accord"]
 	path = modules/accord
-	url = https://github.com/apache/cassandra-accord.git
-	branch = trunk
+	url = https://github.com/belliottsmith/cassandra-accord.git
+	branch = 20905-ssverifier
diff --git a/modules/accord b/modules/accord
index 9c7f856..ff4119f 160000
--- a/modules/accord
+++ b/modules/accord
@@ -1 +1 @@
-Subproject commit 9c7f856c3e1f10c6f985495702edb844cfee2b80
+Subproject commit ff4119fa45ad9700cfa94cd50b5cd4af9dd0b7a4
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryValidator.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryValidator.java
index 282b16d..cae2632 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryValidator.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryValidator.java
@@ -22,7 +22,7 @@
 
 public interface HistoryValidator
 {
-    Checker witness(int start, int end);
+    Checker witness(Object witnessedBy, int start, int end);
 
     void print(@Nullable Integer pk);
 
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/LinearizabilityValidator.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/LinearizabilityValidator.java
index 67c95a7..47a88ae 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/paxos/LinearizabilityValidator.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/LinearizabilityValidator.java
@@ -37,7 +37,7 @@
     }
 
     @Override
-    public Checker witness(int start, int end)
+    public Checker witness(Object witnessedBy, int start, int end)
     {
         return new Checker()
         {
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/LoggingHistoryValidator.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/LoggingHistoryValidator.java
index b39c311..f51cbe3 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/paxos/LoggingHistoryValidator.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/LoggingHistoryValidator.java
@@ -35,11 +35,11 @@
     }
 
     @Override
-    public Checker witness(int start, int end)
+    public Checker witness(Object witnessedBy, int start, int end)
     {
         StringBuilder sb = new StringBuilder();
         sb.append("Witness(start=").append(start).append(", end=").append(end).append(")\n");
-        Checker sub = delegate.witness(start, end);
+        Checker sub = delegate.witness(witnessedBy, start, end);
         return new Checker()
         {
             @Override
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PairOfSequencesAccordSimulation.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PairOfSequencesAccordSimulation.java
index 4abc65a..35deb18 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/paxos/PairOfSequencesAccordSimulation.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PairOfSequencesAccordSimulation.java
@@ -203,7 +203,7 @@
                 IntHashSet seen = new IntHashSet();
                 //TODO if there isn't a value then we get empty read, which then doesn't make it into the QueryResult
                 // given the fact that we always run with the partitions defined this should be fine
-                try (HistoryValidator.Checker checker = validator.witness(outcome.start, outcome.end))
+                try (HistoryValidator.Checker checker = validator.witness(outcome, outcome.start, outcome.end))
                 {
                     while (result.hasNext())
                     {
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/StrictSerializabilityValidator.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/StrictSerializabilityValidator.java
index 332bb3d..5691d7c 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/paxos/StrictSerializabilityValidator.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/StrictSerializabilityValidator.java
@@ -43,7 +43,7 @@
     }
 
     @Override
-    public Checker witness(int start, int end)
+    public Checker witness(Object witnessedBy, int start, int end)
     {
         verifier.begin();
         return new Checker()
@@ -63,7 +63,7 @@
             @Override
             public void close()
             {
-                convertHistoryViolation(() -> verifier.apply("", start, end));
+                convertHistoryViolation(() -> verifier.apply(witnessedBy, start, end));
             }
         };
     }
diff --git a/test/simulator/test/org/apache/cassandra/simulator/paxos/HistoryValidatorTest.java b/test/simulator/test/org/apache/cassandra/simulator/paxos/HistoryValidatorTest.java
index a52345d..46b4345 100644
--- a/test/simulator/test/org/apache/cassandra/simulator/paxos/HistoryValidatorTest.java
+++ b/test/simulator/test/org/apache/cassandra/simulator/paxos/HistoryValidatorTest.java
@@ -326,7 +326,7 @@
     {
         String type = events.length == 1 ? "single" : "multiple";
         logger.info("[Validator={}, Observation=({}, {}, {})] Validating {} {}}", validator.getClass().getSimpleName(), ob.id, ob.start, ob.end, type, events);
-        try (HistoryValidator.Checker check = validator.witness(ob.start, ob.end))
+        try (HistoryValidator.Checker check = validator.witness(ob, ob.start, ob.end))
         {
             for (Event e : events)
                 e.process(ob, check);
@@ -477,7 +477,7 @@
 
         void process(HistoryValidator validator)
         {
-            try (HistoryValidator.Checker check = validator.witness(start, end))
+            try (HistoryValidator.Checker check = validator.witness("", start, end))
             {
                 for (Operation a : actions)
                     a.check(check);