This is an automated email from the ASF dual-hosted git repository.

belliottsmith pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra-accord.git


The following commit(s) were added to refs/heads/trunk by this push:
     new a081e19e Result natively supports persistable/non-persistable 
distinction
a081e19e is described below

commit a081e19e33ddeb91040f2ff8f0bef119f57d11fb
Author: Benedict Elliott Smith <[email protected]>
AuthorDate: Fri May 15 13:42:25 2026 +0100

    Result natively supports persistable/non-persistable distinction
    
    patch by Benedict; reviewed by Alex Petrov and Ariel Weisberg for 
CASSANDRA-21375
---
 accord-core/src/main/java/accord/api/Result.java   | 11 +++++++
 .../accord/coordinate/AbstractCoordination.java    |  1 -
 .../accord/coordinate/CoordinateSyncPoint.java     |  4 +--
 .../accord/coordinate/CoordinationAdapter.java     |  4 +--
 .../java/accord/coordinate/ExecuteSyncPoint.java   |  4 +--
 .../src/main/java/accord/coordinate/Persist.java   |  8 ++---
 .../java/accord/coordinate/PersistSyncPoint.java   |  4 +--
 .../main/java/accord/coordinate/PersistTxn.java    |  4 +--
 .../src/main/java/accord/impl/CommandChange.java   |  7 +++--
 .../src/main/java/accord/impl/LocalDelivery.java   |  1 -
 .../src/main/java/accord/local/Command.java        | 35 +++++++++++-----------
 .../src/main/java/accord/local/CommandBuilder.java |  8 ++---
 .../src/main/java/accord/local/Commands.java       | 31 ++++++++++++-------
 .../src/main/java/accord/local/SafeCommand.java    | 10 +++----
 .../src/main/java/accord/messages/Apply.java       | 21 ++++++-------
 .../accord/messages/ApplyThenWaitUntilApplied.java | 13 ++++----
 .../src/main/java/accord/messages/CheckStatus.java | 10 +++----
 .../src/main/java/accord/messages/Propagate.java   |  6 ++--
 .../java/accord/impl/basic/InMemoryJournal.java    |  4 +--
 .../src/test/java/accord/impl/list/ListResult.java |  4 +--
 .../src/test/java/accord/impl/mock/MockStore.java  |  4 +--
 .../test/java/accord/local/CheckedCommands.java    |  6 ++--
 .../java/accord/local/cfk/CommandsForKeyTest.java  |  3 +-
 .../test/java/accord/messages/ReadDataTest.java    |  4 +--
 .../java/accord/maelstrom/MaelstromResult.java     |  3 +-
 25 files changed, 117 insertions(+), 93 deletions(-)

diff --git a/accord-core/src/main/java/accord/api/Result.java 
b/accord-core/src/main/java/accord/api/Result.java
index 15fbe217..783bef6c 100644
--- a/accord-core/src/main/java/accord/api/Result.java
+++ b/accord-core/src/main/java/accord/api/Result.java
@@ -28,4 +28,15 @@ public interface Result extends Outcome
 {
     @Override
     default ProgressToken asProgressToken() { return ProgressToken.APPLIED; }
+
+    PersistableResult toPersistable();
+
+    interface PersistableResult extends Result
+    {
+        @Override
+        default PersistableResult toPersistable()
+        {
+            return this;
+        }
+    }
 }
diff --git 
a/accord-core/src/main/java/accord/coordinate/AbstractCoordination.java 
b/accord-core/src/main/java/accord/coordinate/AbstractCoordination.java
index 55f327bb..59cbf720 100644
--- a/accord-core/src/main/java/accord/coordinate/AbstractCoordination.java
+++ b/accord-core/src/main/java/accord/coordinate/AbstractCoordination.java
@@ -30,7 +30,6 @@ import javax.annotation.Nullable;
 import accord.api.Timeouts;
 import accord.coordinate.tracking.AbstractTracker;
 import accord.coordinate.tracking.RequestStatus;
-import accord.impl.LocalDelivery;
 import accord.local.MapReduceConsumeCommandStores;
 import accord.local.Node;
 import accord.local.SequentialAsyncExecutor;
diff --git 
a/accord-core/src/main/java/accord/coordinate/CoordinateSyncPoint.java 
b/accord-core/src/main/java/accord/coordinate/CoordinateSyncPoint.java
index 74a0fc02..fb6eec6a 100644
--- a/accord-core/src/main/java/accord/coordinate/CoordinateSyncPoint.java
+++ b/accord-core/src/main/java/accord/coordinate/CoordinateSyncPoint.java
@@ -26,7 +26,7 @@ import javax.annotation.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.Tracing;
 import accord.coordinate.CoordinationAdapter.Adapters;
 import accord.coordinate.CoordinationAdapter.Adapters.SyncPointAdapter;
@@ -214,7 +214,7 @@ public class CoordinateSyncPoint<R> extends 
CoordinatePreAccept<R>
         Txn txn = node.agent().emptySystemTxn(txnId.kind(), txnId.domain());
         Deps deps = syncPoint.waitFor;
         Route<?> route = syncPoint.route;
-        Result result = txn.result(txnId, executeAt, null);
+        PersistableResult result = txn.result(txnId, executeAt, 
null).toPersistable();
         Apply apply = Apply.FACTORY.create(Maximal, to, participates, txnId, 
ballot, route, txn, executeAt, deps, null, result, syncPoint.fullRoute, 
ExecuteFlags.none());
         node.send(to, apply, tracing);
     }
diff --git 
a/accord-core/src/main/java/accord/coordinate/CoordinationAdapter.java 
b/accord-core/src/main/java/accord/coordinate/CoordinationAdapter.java
index 0db36879..5244a7c4 100644
--- a/accord-core/src/main/java/accord/coordinate/CoordinationAdapter.java
+++ b/accord-core/src/main/java/accord/coordinate/CoordinationAdapter.java
@@ -293,7 +293,7 @@ public interface CoordinationAdapter<R>
                 try
                 {
                     Topologies all = execution(node, any, sendTo, route, 
txnId, executeAt);
-                    new PersistTxn(node, executor, all, txnId, ballot, 
require, txn, executeAt, deps, writes, result, route, flags, 
informDurableOnDone, Apply.FACTORY, applyKind)
+                    new PersistTxn(node, executor, all, txnId, ballot, 
require, txn, executeAt, deps, writes, result.toPersistable(), route, flags, 
informDurableOnDone, Apply.FACTORY, applyKind)
                     .start();
                 }
                 catch (TopologyException e)
@@ -408,7 +408,7 @@ public interface CoordinationAdapter<R>
                 try
                 {
                     Topologies all = forExecution(node, sendTo, txnId, 
executeAt, deps);
-                    new PersistSyncPoint(node, executor, all, txnId, ballot, 
sendTo, txn, executeAt, deps, writes, result, informDurableOnDone, route, 
Maximal)
+                    new PersistSyncPoint(node, executor, all, txnId, ballot, 
sendTo, txn, executeAt, deps, writes, result.toPersistable(), 
informDurableOnDone, route, Maximal)
                     .start();
                 }
                 catch (Throwable t)
diff --git a/accord-core/src/main/java/accord/coordinate/ExecuteSyncPoint.java 
b/accord-core/src/main/java/accord/coordinate/ExecuteSyncPoint.java
index 50095783..1db7c7df 100644
--- a/accord-core/src/main/java/accord/coordinate/ExecuteSyncPoint.java
+++ b/accord-core/src/main/java/accord/coordinate/ExecuteSyncPoint.java
@@ -23,7 +23,7 @@ import java.util.function.BiConsumer;
 
 import javax.annotation.Nonnull;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.coordinate.tracking.AbstractTracker;
 import accord.coordinate.tracking.DurabilityTracker;
 import accord.coordinate.tracking.RequestStatus;
@@ -123,7 +123,7 @@ public class ExecuteSyncPoint extends 
AbstractCoordination<Route<Range>, Durabil
         node.agent().coordinatorEvents().onExecuting(syncPoint.syncId, null, 
syncPoint.waitFor, null);
         // TODO (desired): special Apply message that doesn't resend deps if 
path=MEDIUM
         Txn txn = node.agent().emptySystemTxn(syncPoint.syncId.kind(), 
syncPoint.syncId.domain());
-        Result result = txn.result(syncPoint.syncId, syncPoint.executeAt, 
null);
+        PersistableResult result = txn.result(syncPoint.syncId, 
syncPoint.executeAt, null).toPersistable();
         super.start();
         contact(to -> new ApplyThenWaitUntilApplied(to, tracker.topologies(), 
syncPoint.executeAt, tracker.topologies().currentEpoch(), syncPoint.fullRoute, 
syncPoint.syncId, txn, syncPoint.waitFor, scope, null, result));
     }
diff --git a/accord-core/src/main/java/accord/coordinate/Persist.java 
b/accord-core/src/main/java/accord/coordinate/Persist.java
index 21f72020..304b6af3 100644
--- a/accord-core/src/main/java/accord/coordinate/Persist.java
+++ b/accord-core/src/main/java/accord/coordinate/Persist.java
@@ -24,7 +24,7 @@ import java.util.function.Predicate;
 
 import javax.annotation.Nullable;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.coordinate.ExecuteFlag.CoordinationFlags;
 import accord.coordinate.tracking.AbstractTracker;
 import accord.coordinate.tracking.QuorumTracker;
@@ -61,7 +61,7 @@ public abstract class Persist extends 
AbstractCoordination<FullRoute<?>, Void, A
     protected final Timestamp executeAt;
     protected final Deps stableDeps;
     protected final Writes writes;
-    protected final Result result;
+    protected final PersistableResult result;
     protected final CoordinationFlags flags;
     // TODO (expected): track separate ALL and Quorum, so we can report 
Universal durability to permit faster GC
     protected final SimpleTracker<?> tracker;
@@ -69,12 +69,12 @@ public abstract class Persist extends 
AbstractCoordination<FullRoute<?>, Void, A
     protected final Apply.Kind applyKind;
     protected final boolean informDurableOnDone;
 
-    protected Persist(Node node, SequentialAsyncExecutor executor, Topologies 
all, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, Timestamp executeAt, 
Deps stableDeps, Writes writes, Result result, FullRoute<?> route, 
CoordinationFlags flags, boolean informDurableOnDone, Apply.Factory factory, 
Apply.Kind applyKind)
+    protected Persist(Node node, SequentialAsyncExecutor executor, Topologies 
all, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, Timestamp executeAt, 
Deps stableDeps, Writes writes, PersistableResult result, FullRoute<?> route, 
CoordinationFlags flags, boolean informDurableOnDone, Apply.Factory factory, 
Apply.Kind applyKind)
     {
         this(node, executor, all, txnId, ballot, sendTo, txn, executeAt, 
stableDeps, writes, result, route, flags, informDurableOnDone, factory, 
applyKind, QuorumTracker::new, node.agent());
     }
 
-    protected Persist(Node node, SequentialAsyncExecutor executor, Topologies 
all, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, Timestamp executeAt, 
Deps stableDeps, Writes writes, Result result, FullRoute<?> route, 
CoordinationFlags flags, boolean informDurableOnDone, Apply.Factory factory, 
Apply.Kind applyKind, Function<Topologies, SimpleTracker<?>> trackerFactory, 
BiConsumer<? super Void, Throwable> callback)
+    protected Persist(Node node, SequentialAsyncExecutor executor, Topologies 
all, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, Timestamp executeAt, 
Deps stableDeps, Writes writes, PersistableResult result, FullRoute<?> route, 
CoordinationFlags flags, boolean informDurableOnDone, Apply.Factory factory, 
Apply.Kind applyKind, Function<Topologies, SimpleTracker<?>> trackerFactory, 
BiConsumer<? super Void, Throwable> callback)
     {
         super(node, executor, txnId, route, all.nodes(), callback);
         this.ballot = ballot;
diff --git a/accord-core/src/main/java/accord/coordinate/PersistSyncPoint.java 
b/accord-core/src/main/java/accord/coordinate/PersistSyncPoint.java
index 68c84a0d..4d786b8f 100644
--- a/accord-core/src/main/java/accord/coordinate/PersistSyncPoint.java
+++ b/accord-core/src/main/java/accord/coordinate/PersistSyncPoint.java
@@ -18,7 +18,7 @@
 
 package accord.coordinate;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.coordinate.ExecuteFlag.CoordinationFlags;
 import accord.local.Node;
 import accord.local.SequentialAsyncExecutor;
@@ -35,7 +35,7 @@ import accord.topology.Topologies;
 
 public class PersistSyncPoint extends Persist
 {
-    public PersistSyncPoint(Node node, SequentialAsyncExecutor executor, 
Topologies topologies, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, 
Timestamp executeAt, Deps deps, Writes writes, Result result, boolean 
informDurableOnDone, FullRoute<?> route, Apply.Kind applyKind)
+    public PersistSyncPoint(Node node, SequentialAsyncExecutor executor, 
Topologies topologies, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, 
Timestamp executeAt, Deps deps, Writes writes, PersistableResult result, 
boolean informDurableOnDone, FullRoute<?> route, Apply.Kind applyKind)
     {
         super(node, executor, topologies, txnId, ballot, sendTo, txn, 
executeAt, deps, writes, result, route, CoordinationFlags.none(), 
informDurableOnDone, Apply.FACTORY, applyKind);
     }
diff --git a/accord-core/src/main/java/accord/coordinate/PersistTxn.java 
b/accord-core/src/main/java/accord/coordinate/PersistTxn.java
index db510668..dd765ba7 100644
--- a/accord-core/src/main/java/accord/coordinate/PersistTxn.java
+++ b/accord-core/src/main/java/accord/coordinate/PersistTxn.java
@@ -18,7 +18,7 @@
 
 package accord.coordinate;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.coordinate.ExecuteFlag.CoordinationFlags;
 import accord.local.Node;
 import accord.local.SequentialAsyncExecutor;
@@ -36,7 +36,7 @@ import accord.topology.Topologies;
 public class PersistTxn extends Persist
 {
     // TODO (desired): standardise parameter order with CoordinationAdapter 
(and others)
-    public PersistTxn(Node node, SequentialAsyncExecutor executor, Topologies 
topologies, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, Timestamp 
executeAt, Deps deps, Writes writes, Result result, FullRoute<?> route, 
CoordinationFlags flags, boolean informDurableOnDone, Apply.Factory factory, 
Apply.Kind applyKind)
+    public PersistTxn(Node node, SequentialAsyncExecutor executor, Topologies 
topologies, TxnId txnId, Ballot ballot, Route<?> sendTo, Txn txn, Timestamp 
executeAt, Deps deps, Writes writes, PersistableResult result, FullRoute<?> 
route, CoordinationFlags flags, boolean informDurableOnDone, Apply.Factory 
factory, Apply.Kind applyKind)
     {
         super(node, executor, topologies, txnId, ballot, sendTo, txn, 
executeAt, deps, writes, result, route, flags, informDurableOnDone, factory, 
applyKind);
     }
diff --git a/accord-core/src/main/java/accord/impl/CommandChange.java 
b/accord-core/src/main/java/accord/impl/CommandChange.java
index 3cd32797..a3a05960 100644
--- a/accord-core/src/main/java/accord/impl/CommandChange.java
+++ b/accord-core/src/main/java/accord/impl/CommandChange.java
@@ -28,6 +28,7 @@ import javax.annotation.Nullable;
 import com.google.common.annotations.VisibleForTesting;
 
 import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.local.Cleanup;
 import accord.local.Cleanup.Input;
 import accord.local.Command;
@@ -203,7 +204,7 @@ public class CommandChange
         protected Timestamp executesAtLeast;
 
         protected Writes writes;
-        protected Result result;
+        protected PersistableResult result;
 
         protected Cleanup cleanup;
 
@@ -588,7 +589,7 @@ public class CommandChange
             return new MinimalCommand.MinimalWithConcreteDeps(txnId, 
saveStatus, durability, participants, executeAt, partialDeps());
         }
 
-        public void forceResult(Result newValue)
+        public void forceResult(PersistableResult newValue)
         {
             this.result = newValue;
         }
@@ -667,7 +668,7 @@ public class CommandChange
             }
         }
 
-        private static Command.Truncated truncated(TxnId txnId, SaveStatus 
status, Durability durability, StoreParticipants participants, Timestamp 
executeAt, PartialDeps partialDeps, Timestamp executesAtLeast, Writes writes, 
Result result)
+        private static Command.Truncated truncated(TxnId txnId, SaveStatus 
status, Durability durability, StoreParticipants participants, Timestamp 
executeAt, PartialDeps partialDeps, Timestamp executesAtLeast, Writes writes, 
PersistableResult result)
         {
             switch (status)
             {
diff --git a/accord-core/src/main/java/accord/impl/LocalDelivery.java 
b/accord-core/src/main/java/accord/impl/LocalDelivery.java
index 4369529c..61b51fd9 100644
--- a/accord-core/src/main/java/accord/impl/LocalDelivery.java
+++ b/accord-core/src/main/java/accord/impl/LocalDelivery.java
@@ -21,7 +21,6 @@ package accord.impl;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 
-import accord.api.AsyncExecutor;
 import accord.api.MessageSink;
 import accord.api.Timeouts;
 import accord.api.Timeouts.RegisteredTimeout;
diff --git a/accord-core/src/main/java/accord/local/Command.java 
b/accord-core/src/main/java/accord/local/Command.java
index b9afe19e..e8d22a2c 100644
--- a/accord-core/src/main/java/accord/local/Command.java
+++ b/accord-core/src/main/java/accord/local/Command.java
@@ -26,6 +26,7 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.RoutingKey;
 import accord.local.MinimalCommand.MinimalWithConcreteDeps;
 import accord.primitives.AbstractRanges;
@@ -151,7 +152,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
     public final @Nullable PartialTxn partialTxn() { return partialTxn; }
 
     public @Nullable Writes writes() { return null; }
-    public @Nullable Result result() { return null; }
+    public @Nullable PersistableResult result() { return null; }
     public @Nullable WaitingOn waitingOn() { return null; }
 
     /**
@@ -317,7 +318,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
             return truncated(command, participants, newSaveStatus);
         }
 
-        public static Truncated truncated(TxnId txnId, SaveStatus saveStatus, 
Durability durability, StoreParticipants participants, @Nullable Timestamp 
executeAt, @Nullable PartialDeps partialDeps, @Nullable Writes writes, Result 
result)
+        public static Truncated truncated(TxnId txnId, SaveStatus saveStatus, 
Durability durability, StoreParticipants participants, @Nullable Timestamp 
executeAt, @Nullable PartialDeps partialDeps, @Nullable Writes writes, 
PersistableResult result)
         {
             Invariants.requireArgument(!txnId.awaitsOnlyDeps());
             return validate(new Truncated(txnId, saveStatus, durability, 
participants, executeAt, partialDeps, writes, result));
@@ -328,7 +329,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
             Timestamp executesAtLeast = command.executesAtLeast();
             PartialDeps partialDeps = newSaveStatus.known.is(DepsKnown) ? 
command.partialDeps : null;
             Writes writes = null;
-            Result result = null;
+            PersistableResult result = null;
             if (newSaveStatus.known.is(Outcome.Apply))
             {
                 writes = command.writes();
@@ -337,12 +338,12 @@ public abstract class Command extends 
MinimalWithConcreteDeps
             return truncated(command.txnId(), newSaveStatus, 
command.durability(), participants, command.executeAt, partialDeps, writes, 
result, executesAtLeast);
         }
 
-        public static Truncated truncated(Command common, SaveStatus 
saveStatus, @Nullable Timestamp executeAt, @Nullable PartialDeps partialDeps, 
@Nullable Writes writes, @Nullable Result result, @Nullable Timestamp 
executesAtLeast)
+        public static Truncated truncated(Command common, SaveStatus 
saveStatus, @Nullable Timestamp executeAt, @Nullable PartialDeps partialDeps, 
@Nullable Writes writes, @Nullable PersistableResult result, @Nullable 
Timestamp executesAtLeast)
         {
             return truncated(common.txnId(), saveStatus, common.durability(), 
common.participants(), executeAt, partialDeps, writes, result, executesAtLeast);
         }
 
-        public static Truncated truncated(TxnId txnId, SaveStatus saveStatus, 
Durability durability, StoreParticipants participants, Timestamp executeAt, 
PartialDeps partialDeps, Writes writes, Result result, @Nullable Timestamp 
executesAtLeast)
+        public static Truncated truncated(TxnId txnId, SaveStatus saveStatus, 
Durability durability, StoreParticipants participants, Timestamp executeAt, 
PartialDeps partialDeps, Writes writes, PersistableResult result, @Nullable 
Timestamp executesAtLeast)
         {
             if (!txnId.awaitsOnlyDeps())
             {
@@ -371,7 +372,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
         }
 
         @Nullable final Writes writes;
-        @Nullable final Result result;
+        @Nullable final PersistableResult result;
 
         public Truncated(Command copy, SaveStatus saveStatus)
         {
@@ -380,7 +381,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
             this.result = copy.result();
         }
 
-        public Truncated(TxnId txnId, SaveStatus saveStatus, Durability 
durability, @Nonnull StoreParticipants participants, @Nullable Timestamp 
executeAt, @Nullable PartialDeps partialDeps, @Nullable Writes writes, 
@Nullable Result result)
+        public Truncated(TxnId txnId, SaveStatus saveStatus, Durability 
durability, @Nonnull StoreParticipants participants, @Nullable Timestamp 
executeAt, @Nullable PartialDeps partialDeps, @Nullable Writes writes, 
@Nullable PersistableResult result)
         {
             super(txnId, saveStatus, durability, participants, Ballot.MAX, 
executeAt, null, partialDeps, Ballot.MAX);
             this.writes = writes;
@@ -405,7 +406,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
         }
 
         @Override
-        public @Nullable Result result()
+        public @Nullable PersistableResult result()
         {
             return result;
         }
@@ -431,7 +432,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
             this.executesAtLeast = executesAtLeast;
         }
 
-        public TruncatedAwaitsOnlyDeps(TxnId txnId, SaveStatus saveStatus, 
Durability durability, StoreParticipants participants, @Nullable Timestamp 
executeAt, @Nullable PartialDeps partialDeps, @Nullable Writes writes, 
@Nullable Result result, @Nullable Timestamp executesAtLeast)
+        public TruncatedAwaitsOnlyDeps(TxnId txnId, SaveStatus saveStatus, 
Durability durability, StoreParticipants participants, @Nullable Timestamp 
executeAt, @Nullable PartialDeps partialDeps, @Nullable Writes writes, 
@Nullable PersistableResult result, @Nullable Timestamp executesAtLeast)
         {
             super(txnId, saveStatus, durability, participants, executeAt, 
partialDeps, writes, result);
             this.executesAtLeast = executesAtLeast;
@@ -634,7 +635,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
 
     public static class Executed extends Committed
     {
-        public static Executed executed(TxnId txnId, SaveStatus status, 
Durability durability, @Nonnull StoreParticipants participants, Ballot 
promised, Timestamp executeAt, PartialTxn partialTxn, PartialDeps partialDeps, 
Ballot acceptedOrCommitted, WaitingOn waitingOn, Writes writes, Result result)
+        public static Executed executed(TxnId txnId, SaveStatus status, 
Durability durability, @Nonnull StoreParticipants participants, Ballot 
promised, Timestamp executeAt, PartialTxn partialTxn, PartialDeps partialDeps, 
Ballot acceptedOrCommitted, WaitingOn waitingOn, Writes writes, 
PersistableResult result)
         {
             return validate(new Executed(txnId, status, durability, 
participants, promised, executeAt, partialTxn, partialDeps, 
acceptedOrCommitted, waitingOn, writes, result));
         }
@@ -650,7 +651,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
         }
 
         private final Writes writes;
-        private final Result result;
+        private final PersistableResult result;
 
         private Executed(Command copy, SaveStatus status)
         {
@@ -665,7 +666,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
             validateWrites(txnId(), writes);
         }
 
-        private Executed(TxnId txnId, SaveStatus status, Durability 
durability, @Nonnull StoreParticipants participants, Ballot promised, Timestamp 
executeAt, PartialTxn partialTxn, PartialDeps partialDeps, Ballot 
acceptedOrCommitted, WaitingOn waitingOn, Writes writes, Result result)
+        private Executed(TxnId txnId, SaveStatus status, Durability 
durability, @Nonnull StoreParticipants participants, Ballot promised, Timestamp 
executeAt, PartialTxn partialTxn, PartialDeps partialDeps, Ballot 
acceptedOrCommitted, WaitingOn waitingOn, Writes writes, PersistableResult 
result)
         {
             super(txnId, status, durability, participants, promised, 
executeAt, partialTxn, partialDeps, acceptedOrCommitted, waitingOn);
             validateWrites(txnId, writes);
@@ -701,7 +702,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
             return writes;
         }
 
-        public Result result()
+        public PersistableResult result()
         {
             return result;
         }
@@ -1361,17 +1362,17 @@ public abstract class Command extends 
MinimalWithConcreteDeps
         return committed(command, SaveStatus.ReadyToExecute);
     }
 
-    static Command.Executed preapplied(Command command, Timestamp applyAt, 
Writes writes, Result result)
+    static Command.Executed preapplied(Command command, Timestamp applyAt, 
Writes writes, PersistableResult result)
     {
         return executed(command.txnId(), SaveStatus.get(Status.PreApplied, 
command.known()), command.durability(), command.participants(), 
command.promised(), applyAt, command.partialTxn(), command.partialDeps(), 
command.acceptedOrCommitted(), command.waitingOn(), writes, result);
     }
 
-    static Command.Executed preapplied(Command command, @Nonnull 
StoreParticipants participants, Ballot promised, Timestamp executeAt, 
PartialTxn partialTxn, PartialDeps partialDeps, Command.WaitingOn waitingOn, 
Writes writes, Result result)
+    static Command.Executed preapplied(Command command, @Nonnull 
StoreParticipants participants, Ballot promised, Timestamp executeAt, 
PartialTxn partialTxn, PartialDeps partialDeps, Command.WaitingOn waitingOn, 
Writes writes, PersistableResult result)
     {
         return executed(command.txnId(), SaveStatus.get(Status.PreApplied, 
command.known()), command.durability(), participants, promised, executeAt, 
partialTxn, partialDeps, command.acceptedOrCommitted(), waitingOn, writes, 
result);
     }
 
-    static Command.Executed applying(Command command, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, Result 
result)
+    static Command.Executed applying(Command command, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, 
PersistableResult result)
     {
         return executed(command.txnId(), SaveStatus.Applying, 
command.durability(), participants, command.promised(), executeAt, partialTxn, 
partialDeps, command.acceptedOrCommitted(), waitingOn, writes, result);
     }
@@ -1381,7 +1382,7 @@ public abstract class Command extends 
MinimalWithConcreteDeps
         return executed(command, SaveStatus.Applying);
     }
 
-    static Command.Executed applied(Command command, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, Result 
result)
+    static Command.Executed applied(Command command, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, 
PersistableResult result)
     {
         return executed(command.txnId(), SaveStatus.Applied, 
command.durability(), participants, command.promised(), executeAt, partialTxn, 
partialDeps, command.acceptedOrCommitted(), waitingOn, writes, result);
     }
diff --git a/accord-core/src/main/java/accord/local/CommandBuilder.java 
b/accord-core/src/main/java/accord/local/CommandBuilder.java
index 52a64594..ecfc8cdd 100644
--- a/accord-core/src/main/java/accord/local/CommandBuilder.java
+++ b/accord-core/src/main/java/accord/local/CommandBuilder.java
@@ -18,7 +18,7 @@
 
 package accord.local;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.primitives.Ballot;
 import accord.primitives.PartialDeps;
 import accord.primitives.PartialTxn;
@@ -44,7 +44,7 @@ public class CommandBuilder
     private Ballot acceptedOrCommitted = Ballot.ZERO;
     private Command.WaitingOn waitingOn;
     private Writes writes;
-    private Result result;
+    private PersistableResult result;
 
     public CommandBuilder(TxnId txnId)
     {
@@ -166,12 +166,12 @@ public class CommandBuilder
         return this;
     }
 
-    public Result result()
+    public PersistableResult result()
     {
         return result;
     }
 
-    public CommandBuilder result(Result result)
+    public CommandBuilder result(PersistableResult result)
     {
         this.result = result;
         return this;
diff --git a/accord-core/src/main/java/accord/local/Commands.java 
b/accord-core/src/main/java/accord/local/Commands.java
index 86130e81..3bfc31a9 100644
--- a/accord-core/src/main/java/accord/local/Commands.java
+++ b/accord-core/src/main/java/accord/local/Commands.java
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
 
 import accord.api.Data;
 import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.RoutingKey;
 import accord.api.ViolationHandler.ViolationHandlerHolder;
 import accord.local.Command.WaitingOn;
@@ -531,12 +532,12 @@ public class Commands
         RaceWithRecovery
     }
 
-    public static ApplyOutcome apply(SafeCommandStore safeStore, SafeCommand 
safeCommand, StoreParticipants participants, Ballot ballot, TxnId txnId, 
Route<?> route, Timestamp executeAt, @Nullable Deps deps, @Nullable Txn txn, 
Writes writes, Result result)
+    public static ApplyOutcome apply(SafeCommandStore safeStore, SafeCommand 
safeCommand, StoreParticipants participants, Ballot ballot, TxnId txnId, 
Route<?> route, Timestamp executeAt, @Nullable Deps deps, @Nullable Txn txn, 
Writes writes, PersistableResult result)
     {
         return apply(SaveStatus.PreApplied, safeStore, safeCommand, 
participants, ballot, txnId, route, executeAt, deps, txn, writes, result);
     }
 
-    public static ApplyOutcome apply(SaveStatus newSaveStatus, 
SafeCommandStore safeStore, SafeCommand safeCommand, StoreParticipants 
participants, Ballot ballot, TxnId txnId, Route<?> route, Timestamp executeAt, 
@Nullable Deps deps, @Nullable Txn txn, Writes writes, Result result)
+    public static ApplyOutcome apply(SaveStatus newSaveStatus, 
SafeCommandStore safeStore, SafeCommand safeCommand, StoreParticipants 
participants, Ballot ballot, TxnId txnId, Route<?> route, Timestamp executeAt, 
@Nullable Deps deps, @Nullable Txn txn, Writes writes, PersistableResult result)
     {
         Invariants.require(newSaveStatus == SaveStatus.PreApplied || 
newSaveStatus == Applying || newSaveStatus == SaveStatus.Applied);
         Command command = safeCommand.current();
@@ -721,10 +722,10 @@ public class Commands
         final Participants<?> participants;
         final Timestamp applyAt;
         final Writes writes;
-        final Result result;
+        final PersistableResult result;
         final boolean force;
 
-        protected PostFastApply(Head<?> head, CommandStore commandStore, TxnId 
txnId, Participants<?> participants, Timestamp applyAt, Writes writes, Result 
result, boolean force)
+        protected PostFastApply(Head<?> head, CommandStore commandStore, TxnId 
txnId, Participants<?> participants, Timestamp applyAt, Writes writes, 
PersistableResult result, boolean force)
         {
             super(head);
             this.commandStore = commandStore;
@@ -936,17 +937,21 @@ public class Commands
         Result result = txn.result(txnId, applyAt, null);
 
         safeStore.commandStore().node.reportLocalExecution(txnId, route, 
ballot, applyAt, writes, result);
-        command = safeCommand.preapplied(safeStore, applyAt, writes, result);
+        command = safeCommand.preapplied(safeStore, applyAt, writes, 
result.toPersistable());
         return command;
     }
 
     private static void replicaExecuteFastApply(CommandStore unsafeStore, 
Ballot ballot, TxnId txnId, Route<?> route, PartialTxn txn, Data data, 
Timestamp applyAt, Participants<?> executes)
     {
         Writes writes = txn.execute(txnId, applyAt, data);
-        Result result = txn.result(txnId, applyAt, data);
-        unsafeStore.node.reportLocalExecution(txnId, route, ballot, applyAt, 
writes, result);
+        PersistableResult persistResult;
+        {
+            Result result = txn.result(txnId, applyAt, data);
+            unsafeStore.node.reportLocalExecution(txnId, route, ballot, 
applyAt, writes, result);
+            persistResult = result.toPersistable();
+        }
         writes.applyDirect(unsafeStore, executes, txn)
-              .then(head -> new PostFastApply<>(head, unsafeStore, txnId, 
executes, applyAt, writes, result, false))
+              .then(head -> new PostFastApply<>(head, unsafeStore, txnId, 
executes, applyAt, writes, persistResult, false))
               .begin(unsafeStore.agent);
     }
 
@@ -962,10 +967,14 @@ public class Commands
             else
             {
                 Writes writes = txn.execute(txnId, applyAt, data);
-                Result result = txn.result(txnId, applyAt, data);
-                unsafeStore.node.reportLocalExecution(txnId, route, ballot, 
applyAt, writes, result);
+                PersistableResult persistResult;
+                {
+                    Result result = txn.result(txnId, applyAt, data);
+                    unsafeStore.node.reportLocalExecution(txnId, route, 
ballot, applyAt, writes, result);
+                    persistResult = result.toPersistable();
+                }
                 if (command.saveStatus.compareTo(SaveStatus.PreApplied) <= 0)
-                    apply(Applying, safeStore, safeCommand, 
command.participants, command.acceptedOrCommitted(), txnId, command.route(), 
applyAt, command.partialDeps(), command.partialTxn(), writes, result);
+                    apply(Applying, safeStore, safeCommand, 
command.participants, command.acceptedOrCommitted(), txnId, command.route(), 
applyAt, command.partialDeps(), command.partialTxn(), writes, persistResult);
             }
         });
     }
diff --git a/accord-core/src/main/java/accord/local/SafeCommand.java 
b/accord-core/src/main/java/accord/local/SafeCommand.java
index 515f16a5..adee9b02 100644
--- a/accord-core/src/main/java/accord/local/SafeCommand.java
+++ b/accord-core/src/main/java/accord/local/SafeCommand.java
@@ -21,7 +21,7 @@ package accord.local;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.local.Command.Truncated;
 import accord.primitives.Ballot;
 import accord.primitives.PartialDeps;
@@ -158,12 +158,12 @@ public abstract class SafeCommand
         return update(safeStore, 
Command.readyToExecute(current().asCommitted()));
     }
 
-    public Command.Executed preapplied(SafeCommandStore safeStore, Timestamp 
applyAt, Writes writes, Result result)
+    public Command.Executed preapplied(SafeCommandStore safeStore, Timestamp 
applyAt, Writes writes, PersistableResult result)
     {
         return update(safeStore, Command.preapplied(current(), applyAt, 
writes, result));
     }
 
-    public Command.Executed preapplied(SafeCommandStore safeStore, @Nonnull 
StoreParticipants participants, Ballot promised, Timestamp executeAt, 
PartialTxn partialTxn, PartialDeps partialDeps, Command.WaitingOn waitingOn, 
Writes writes, Result result)
+    public Command.Executed preapplied(SafeCommandStore safeStore, @Nonnull 
StoreParticipants participants, Ballot promised, Timestamp executeAt, 
PartialTxn partialTxn, PartialDeps partialDeps, Command.WaitingOn waitingOn, 
Writes writes, PersistableResult result)
     {
         return update(safeStore, Command.preapplied(current(), participants, 
promised, executeAt, partialTxn, partialDeps, waitingOn, writes, result));
     }
@@ -173,7 +173,7 @@ public abstract class SafeCommand
         return update(safeStore, Command.applying(current().asExecuted()));
     }
 
-    public Command.Executed applying(SafeCommandStore safeStore, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, Result 
result)
+    public Command.Executed applying(SafeCommandStore safeStore, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, 
PersistableResult result)
     {
         return update(safeStore, Command.applying(current(), participants, 
executeAt, partialTxn, partialDeps, waitingOn, writes, result));
     }
@@ -188,7 +188,7 @@ public abstract class SafeCommand
         return update(safeStore, Command.applied(current().asExecuted()), 
forceUpdate);
     }
 
-    public Command.Executed applied(SafeCommandStore safeStore, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, Result 
result)
+    public Command.Executed applied(SafeCommandStore safeStore, @Nonnull 
StoreParticipants participants, Timestamp executeAt, PartialTxn partialTxn, 
PartialDeps partialDeps, Command.WaitingOn waitingOn, Writes writes, 
PersistableResult result)
     {
         return update(safeStore, Command.applied(current(), participants, 
executeAt, partialTxn, partialDeps, waitingOn, writes, result));
     }
diff --git a/accord-core/src/main/java/accord/messages/Apply.java 
b/accord-core/src/main/java/accord/messages/Apply.java
index f806a3ef..48845d8e 100644
--- a/accord-core/src/main/java/accord/messages/Apply.java
+++ b/accord-core/src/main/java/accord/messages/Apply.java
@@ -21,6 +21,7 @@ package accord.messages;
 import javax.annotation.Nullable;
 
 import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.coordinate.ExecuteFlag.ExecuteFlags;
 import accord.local.CommandStore;
 import accord.local.CommandStores;
@@ -65,7 +66,7 @@ public class Apply extends RouteRequest<ApplyReply>
     public static final Factory FACTORY = Apply::new;
     public static class SerializationSupport
     {
-        public static Apply create(TxnId txnId, Ballot ballot, Route<?> scope, 
long minEpoch, long waitForEpoch, long maxEpoch, Kind kind, Timestamp 
executeAt, PartialDeps deps, PartialTxn txn, @Nullable FullRoute<?> fullRoute, 
Writes writes, Result result, ExecuteFlags flags)
+        public static Apply create(TxnId txnId, Ballot ballot, Route<?> scope, 
long minEpoch, long waitForEpoch, long maxEpoch, Kind kind, Timestamp 
executeAt, PartialDeps deps, PartialTxn txn, @Nullable FullRoute<?> fullRoute, 
Writes writes, PersistableResult result, ExecuteFlags flags)
         {
             return new Apply(kind, txnId, ballot, scope, minEpoch, 
waitForEpoch, maxEpoch, executeAt, deps, txn, fullRoute, writes, result, flags);
         }
@@ -73,7 +74,7 @@ public class Apply extends RouteRequest<ApplyReply>
 
     public interface Factory
     {
-        Apply create(Kind kind, Id to, Topologies participates, TxnId txnId, 
Ballot ballot, Route<?> scope, Txn txn, Timestamp executeAt, Deps deps, Writes 
writes, Result result, FullRoute<?> fullRoute, ExecuteFlags flags);
+        Apply create(Kind kind, Id to, Topologies participates, TxnId txnId, 
Ballot ballot, Route<?> scope, Txn txn, Timestamp executeAt, Deps deps, Writes 
writes, PersistableResult result, FullRoute<?> fullRoute, ExecuteFlags flags);
     }
 
     public enum Kind { Minimal, Maximal }
@@ -85,7 +86,7 @@ public class Apply extends RouteRequest<ApplyReply>
     private @Nullable PartialTxn txn;
     public final @Nullable FullRoute<?> fullRoute;
     private @Nullable Writes writes;
-    private Result result;
+    private PersistableResult result;
     public final long minEpoch;
     public final long maxEpoch;
     public final ExecuteFlags flags;
@@ -95,7 +96,7 @@ public class Apply extends RouteRequest<ApplyReply>
     public Writes    writes() { return writes; }
     public Result    result() { return result; }
 
-    protected Apply(Kind kind, Id to, Topologies participates, TxnId txnId, 
Ballot ballot, Route<?> sendTo, Txn txn, Timestamp executeAt, Deps deps, Writes 
writes, Result result, FullRoute<?> fullRoute, ExecuteFlags flags)
+    protected Apply(Kind kind, Id to, Topologies participates, TxnId txnId, 
Ballot ballot, Route<?> sendTo, Txn txn, Timestamp executeAt, Deps deps, Writes 
writes, PersistableResult result, FullRoute<?> fullRoute, ExecuteFlags flags)
     {
         super(to, participates, sendTo, txnId);
         Invariants.require(txnId.kind() != Txn.Kind.Write || writes != null);
@@ -112,7 +113,7 @@ public class Apply extends RouteRequest<ApplyReply>
         this.maxEpoch = participates.currentEpoch();
     }
 
-    protected Apply(Kind kind, TxnId txnId, Ballot ballot, Route<?> route, 
long minEpoch, long waitForEpoch, long maxEpoch, Timestamp executeAt, 
PartialDeps deps, @Nullable PartialTxn txn, @Nullable FullRoute<?> fullRoute, 
Writes writes, Result result, ExecuteFlags flags)
+    protected Apply(Kind kind, TxnId txnId, Ballot ballot, Route<?> route, 
long minEpoch, long waitForEpoch, long maxEpoch, Timestamp executeAt, 
PartialDeps deps, @Nullable PartialTxn txn, @Nullable FullRoute<?> fullRoute, 
Writes writes, PersistableResult result, ExecuteFlags flags)
     {
         super(txnId, route, waitForEpoch);
         this.kind = kind;
@@ -208,30 +209,30 @@ public class Apply extends RouteRequest<ApplyReply>
         PartialTxn txn = this.txn;
         PartialDeps deps = this.deps;
         Writes writes = this.writes;
-        Result result = this.result;
+        PersistableResult result = this.result;
         if (ifDoneExpectCancelled()) // check cancellation after reading 
nullable fields
             return null;
 
         return apply(newSaveStatus, safeStore, participants, ballot, txn, 
txnId, executeAt, deps, bestRoute(), writes, result);
     }
 
-    public static ApplyReply apply(SafeCommandStore safeStore, 
StoreParticipants participants, Ballot ballot, PartialTxn txn, TxnId txnId, 
Timestamp executeAt, PartialDeps deps, Route<?> route, Writes writes, Result 
result)
+    public static ApplyReply apply(SafeCommandStore safeStore, 
StoreParticipants participants, Ballot ballot, PartialTxn txn, TxnId txnId, 
Timestamp executeAt, PartialDeps deps, Route<?> route, Writes writes, 
PersistableResult result)
     {
         return apply(PreApplied, safeStore, participants, ballot, txn, txnId, 
executeAt, deps, route, writes, result);
     }
 
-    public static ApplyReply apply(SaveStatus newSaveStatus, SafeCommandStore 
safeStore, StoreParticipants participants, Ballot ballot, PartialTxn txn, TxnId 
txnId, Timestamp executeAt, PartialDeps deps, Route<?> route, Writes writes, 
Result result)
+    public static ApplyReply apply(SaveStatus newSaveStatus, SafeCommandStore 
safeStore, StoreParticipants participants, Ballot ballot, PartialTxn txn, TxnId 
txnId, Timestamp executeAt, PartialDeps deps, Route<?> route, Writes writes, 
PersistableResult result)
     {
         SafeCommand safeCommand = safeStore.get(txnId, participants);
         return apply(newSaveStatus, safeStore, safeCommand, participants, 
ballot, txn, txnId, executeAt, deps, route, writes, result);
     }
 
-    public static ApplyReply apply(SafeCommandStore safeStore, SafeCommand 
safeCommand, StoreParticipants participants, Ballot ballot, PartialTxn txn, 
TxnId txnId, Timestamp executeAt, PartialDeps deps, Route<?> route, Writes 
writes, Result result)
+    public static ApplyReply apply(SafeCommandStore safeStore, SafeCommand 
safeCommand, StoreParticipants participants, Ballot ballot, PartialTxn txn, 
TxnId txnId, Timestamp executeAt, PartialDeps deps, Route<?> route, Writes 
writes, PersistableResult result)
     {
         return apply(PreApplied, safeStore, safeCommand, participants, ballot, 
txn, txnId, executeAt, deps, route, writes, result);
     }
 
-    public static ApplyReply apply(SaveStatus newSaveStatus, SafeCommandStore 
safeStore, SafeCommand safeCommand, StoreParticipants participants, Ballot 
ballot, PartialTxn txn, TxnId txnId, Timestamp executeAt, PartialDeps deps, 
Route<?> route, Writes writes, Result result)
+    public static ApplyReply apply(SaveStatus newSaveStatus, SafeCommandStore 
safeStore, SafeCommand safeCommand, StoreParticipants participants, Ballot 
ballot, PartialTxn txn, TxnId txnId, Timestamp executeAt, PartialDeps deps, 
Route<?> route, Writes writes, PersistableResult result)
     {
         switch (Commands.apply(newSaveStatus, safeStore, safeCommand, 
participants, ballot, txnId, route, executeAt, deps, txn, writes, result))
         {
diff --git 
a/accord-core/src/main/java/accord/messages/ApplyThenWaitUntilApplied.java 
b/accord-core/src/main/java/accord/messages/ApplyThenWaitUntilApplied.java
index cb666926..bc9364bb 100644
--- a/accord-core/src/main/java/accord/messages/ApplyThenWaitUntilApplied.java
+++ b/accord-core/src/main/java/accord/messages/ApplyThenWaitUntilApplied.java
@@ -22,6 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.local.Node;
 import accord.local.SafeCommandStore;
 import accord.local.StoreParticipants;
@@ -56,7 +57,7 @@ public class ApplyThenWaitUntilApplied extends 
WaitUntilApplied
     @SuppressWarnings("unused")
     public static class SerializerSupport
     {
-        public static ApplyThenWaitUntilApplied create(TxnId txnId, 
Participants<?> readScope, long minEpoch, Timestamp executeAt, FullRoute<?> 
route, PartialTxn txn, PartialDeps deps, Writes writes, Result result)
+        public static ApplyThenWaitUntilApplied create(TxnId txnId, 
Participants<?> readScope, long minEpoch, Timestamp executeAt, FullRoute<?> 
route, PartialTxn txn, PartialDeps deps, Writes writes, PersistableResult 
result)
         {
             return new ApplyThenWaitUntilApplied(txnId, readScope, minEpoch, 
executeAt, route, txn, deps, writes, result);
         }
@@ -66,19 +67,19 @@ public class ApplyThenWaitUntilApplied extends 
WaitUntilApplied
     private PartialTxn txn;
     private PartialDeps deps;
     private Writes writes;
-    private Result result;
+    private PersistableResult result;
 
     public PartialTxn   txn() { return txn; }
     public PartialDeps deps() { return deps; }
     public Writes    writes() { return writes; }
     public Result    result() { return result; }
 
-    public ApplyThenWaitUntilApplied(Node.Id to, Topologies topologies, 
Timestamp executeAt, FullRoute<?> route, TxnId txnId, Txn txn, Deps deps, 
Participants<?> readScope, Writes writes, Result result)
+    public ApplyThenWaitUntilApplied(Node.Id to, Topologies topologies, 
Timestamp executeAt, FullRoute<?> route, TxnId txnId, Txn txn, Deps deps, 
Participants<?> readScope, Writes writes, PersistableResult result)
     {
         this(to, topologies, executeAt, executeAt.epoch(), route, txnId, txn, 
deps, readScope, writes, result);
     }
 
-    public ApplyThenWaitUntilApplied(Node.Id to, Topologies topologies, 
Timestamp executeAt, long executeAtEpoch, FullRoute<?> route, TxnId txnId, Txn 
txn, Deps deps, Participants<?> readScope, Writes writes, Result result)
+    public ApplyThenWaitUntilApplied(Node.Id to, Topologies topologies, 
Timestamp executeAt, long executeAtEpoch, FullRoute<?> route, TxnId txnId, Txn 
txn, Deps deps, Participants<?> readScope, Writes writes, PersistableResult 
result)
     {
         super(to, topologies, txnId, readScope, executeAt, executeAtEpoch);
         Route<?> scope = computeScope(to, topologies, route);
@@ -89,7 +90,7 @@ public class ApplyThenWaitUntilApplied extends 
WaitUntilApplied
         this.result = result;
     }
 
-    protected ApplyThenWaitUntilApplied(TxnId txnId, Participants<?> 
readScope, long minEpoch, Timestamp executeAt, FullRoute<?> route, PartialTxn 
txn, PartialDeps deps, Writes writes, Result result)
+    protected ApplyThenWaitUntilApplied(TxnId txnId, Participants<?> 
readScope, long minEpoch, Timestamp executeAt, FullRoute<?> route, PartialTxn 
txn, PartialDeps deps, Writes writes, PersistableResult result)
     {
         super(txnId, readScope, minEpoch, executeAt, executeAt.epoch());
         this.route = route;
@@ -111,7 +112,7 @@ public class ApplyThenWaitUntilApplied extends 
WaitUntilApplied
         PartialTxn txn = this.txn;
         PartialDeps deps = this.deps;
         Writes writes = this.writes;
-        Result result = this.result;
+        PersistableResult result = this.result;
         if (!isPending())
             return null; // we can't throw an exception here else we override 
any non-exceptional reply informing the reason
 
diff --git a/accord-core/src/main/java/accord/messages/CheckStatus.java 
b/accord-core/src/main/java/accord/messages/CheckStatus.java
index 57fe170b..3c03569c 100644
--- a/accord-core/src/main/java/accord/messages/CheckStatus.java
+++ b/accord-core/src/main/java/accord/messages/CheckStatus.java
@@ -20,7 +20,7 @@ package accord.messages;
 
 import javax.annotation.Nullable;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.RoutingKey;
 import accord.coordinate.Infer.InvalidIf;
 import accord.local.Command;
@@ -101,7 +101,7 @@ public class CheckStatus extends 
ParticipantsRequest<Participants<?>, CheckStatu
                                              Ballot promised, Ballot 
maxAcceptedOrCommitted, Ballot acceptedOrCommitted,
                                              @Nullable Timestamp executeAt, 
boolean isCoordinating, Durability durability,
                                              @Nullable Route<?> route, 
@Nullable RoutingKey homeKey, InvalidIf invalidIf,
-                                             PartialTxn partialTxn, 
PartialDeps committedDeps, Writes writes, Result result)
+                                             PartialTxn partialTxn, 
PartialDeps committedDeps, Writes writes, PersistableResult result)
         {
             return new CheckStatusOkFull(map, maxKnowledgeStatus, maxStatus, 
promised, maxAcceptedOrCommitted, acceptedOrCommitted,
                                          executeAt, isCoordinating, 
durability, route, homeKey, invalidIf, partialTxn, committedDeps, writes, 
result);
@@ -538,7 +538,7 @@ public class CheckStatus extends 
ParticipantsRequest<Participants<?>, CheckStatu
         public final PartialTxn partialTxn;
         public final PartialDeps stableDeps; // only set if status >= 
Committed, so safe to merge
         public final Writes writes;
-        public final Result result;
+        public final PersistableResult result;
 
         public CheckStatusOkFull(KnownMap map, boolean isCoordinating, 
Durability durability, InvalidIf invalidIf, Command command)
         {
@@ -551,7 +551,7 @@ public class CheckStatus extends 
ParticipantsRequest<Participants<?>, CheckStatu
 
         protected CheckStatusOkFull(KnownMap map, SaveStatus 
maxNotTruncatedSaveStatus, SaveStatus maxSaveStatus, Ballot promised, Ballot 
maxAcceptedOrCommitted, Ballot acceptedOrCommitted,
                                     Timestamp executeAt, boolean 
isCoordinating, Durability durability, Route<?> route,
-                                    RoutingKey homeKey, InvalidIf invalidIf, 
PartialTxn partialTxn, PartialDeps stableDeps, Writes writes, Result result)
+                                    RoutingKey homeKey, InvalidIf invalidIf, 
PartialTxn partialTxn, PartialDeps stableDeps, Writes writes, PersistableResult 
result)
         {
             super(map, maxNotTruncatedSaveStatus, maxSaveStatus, promised, 
maxAcceptedOrCommitted, acceptedOrCommitted,
                   executeAt, isCoordinating, durability, route, homeKey, 
invalidIf);
@@ -636,7 +636,7 @@ public class CheckStatus extends 
ParticipantsRequest<Participants<?>, CheckStatu
             else if (fullMin.stableDeps == null) committedDeps = 
fullMax.stableDeps;
             else committedDeps = fullMax.stableDeps.with(fullMin.stableDeps);
             Writes writes = (fullMax.writes != null ? fullMax : 
fullMin).writes;
-            Result result = (fullMax.result != null ? fullMax : 
fullMin).result;
+            PersistableResult result = (fullMax.result != null ? fullMax : 
fullMin).result;
 
             return new CheckStatusOkFull(max.map, max.maxKnowledgeSaveStatus, 
max.maxSaveStatus,
                                          max.maxPromised, 
max.maxAcceptedOrCommitted, max.acceptedOrCommitted,
diff --git a/accord-core/src/main/java/accord/messages/Propagate.java 
b/accord-core/src/main/java/accord/messages/Propagate.java
index 5a080dbd..675f998d 100644
--- a/accord-core/src/main/java/accord/messages/Propagate.java
+++ b/accord-core/src/main/java/accord/messages/Propagate.java
@@ -18,7 +18,7 @@
 package accord.messages;
 
 import accord.api.ProtocolModifiers;
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.RoutingKey;
 import accord.api.Tracing;
 import accord.coordinate.FetchData.FetchResult;
@@ -98,7 +98,7 @@ public class Propagate extends 
MapReduceConsumeCommandStores<Route<?>, Void>
     @Nullable final PartialDeps stableDeps;
     @Nullable final Timestamp committedExecuteAt;
     @Nullable final Writes writes;
-    @Nullable final Result result;
+    @Nullable final PersistableResult result;
     final BiConsumer<? super FetchResult, Throwable> callback;
     final @Nullable Tracing tracing;
 
@@ -121,7 +121,7 @@ public class Propagate extends 
MapReduceConsumeCommandStores<Route<?>, Void>
     @Nullable PartialDeps stableDeps,
     @Nullable Timestamp committedExecuteAt,
     @Nullable Writes writes,
-    @Nullable Result result,
+    @Nullable PersistableResult result,
     BiConsumer<? super FetchResult, Throwable> callback,
     @Nullable Tracing tracing)
     {
diff --git a/accord-core/src/test/java/accord/impl/basic/InMemoryJournal.java 
b/accord-core/src/test/java/accord/impl/basic/InMemoryJournal.java
index 6a153a25..8539fbe1 100644
--- a/accord-core/src/test/java/accord/impl/basic/InMemoryJournal.java
+++ b/accord-core/src/test/java/accord/impl/basic/InMemoryJournal.java
@@ -37,7 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import accord.api.Journal;
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.impl.CommandChange;
 import accord.impl.InMemoryCommandStore;
 import accord.local.Cleanup;
@@ -985,7 +985,7 @@ public class InMemoryJournal implements Journal
                     writes = Invariants.nonNull((Writes) 
diff.changes.get(WRITES));
                     break;
                 case RESULT:
-                    result = Invariants.nonNull((Result) 
diff.changes.get(RESULT));
+                    result = Invariants.nonNull((PersistableResult) 
diff.changes.get(RESULT));
                     break;
                 case CLEANUP:
                     Cleanup nextCleanup = Invariants.nonNull((Cleanup) 
diff.changes.get(CLEANUP));
diff --git a/accord-core/src/test/java/accord/impl/list/ListResult.java 
b/accord-core/src/test/java/accord/impl/list/ListResult.java
index c752bd0b..94fcdd4b 100644
--- a/accord-core/src/test/java/accord/impl/list/ListResult.java
+++ b/accord-core/src/test/java/accord/impl/list/ListResult.java
@@ -23,15 +23,15 @@ import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import accord.api.Result.PersistableResult;
 import accord.local.Node.Id;
-import accord.api.Result;
 import accord.messages.MessageType;
 import accord.primitives.Keys;
 import accord.messages.Reply;
 import accord.primitives.Seekables;
 import accord.primitives.TxnId;
 
-public class ListResult implements Result, Reply
+public class ListResult implements PersistableResult, Reply
 {
     public enum Status
     { Applied, RecoveryApplied, HeartBeat, Invalidated, Lost, Other, 
Truncated, Failure }
diff --git a/accord-core/src/test/java/accord/impl/mock/MockStore.java 
b/accord-core/src/test/java/accord/impl/mock/MockStore.java
index 6b0df3f4..2546e232 100644
--- a/accord-core/src/test/java/accord/impl/mock/MockStore.java
+++ b/accord-core/src/test/java/accord/impl/mock/MockStore.java
@@ -22,7 +22,7 @@ import accord.api.Data;
 import accord.api.DataStore;
 import accord.api.Query;
 import accord.api.Read;
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.Update;
 import accord.api.Write;
 import accord.local.CommandStore;
@@ -56,7 +56,7 @@ public class MockStore implements DataStore
         }
     };
 
-    public static final Result RESULT = new Result() {};
+    public static final PersistableResult RESULT = new PersistableResult() {};
     public static final Query QUERY = (txnId, executeAt, keys, data, read, 
update) -> RESULT;
     public static final Write WRITE = (commandStore, key, txnId, executeAt, 
command) -> AsyncChains.success(null);
 
diff --git a/accord-core/src/test/java/accord/local/CheckedCommands.java 
b/accord-core/src/test/java/accord/local/CheckedCommands.java
index 7d29241f..af0e9ff9 100644
--- a/accord-core/src/test/java/accord/local/CheckedCommands.java
+++ b/accord-core/src/test/java/accord/local/CheckedCommands.java
@@ -20,7 +20,7 @@ package accord.local;
 
 import javax.annotation.Nullable;
 
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.messages.Accept;
 import accord.primitives.Ballot;
 import accord.primitives.FullRoute;
@@ -88,12 +88,12 @@ public class CheckedCommands
         consumer.accept(before, after);
     }
 
-    public static void apply(SafeCommandStore safeStore, TxnId txnId, Route<?> 
route, Timestamp executeAt, @Nullable PartialDeps partialDeps, @Nullable 
PartialTxn partialTxn, Writes writes, Result result)
+    public static void apply(SafeCommandStore safeStore, TxnId txnId, Route<?> 
route, Timestamp executeAt, @Nullable PartialDeps partialDeps, @Nullable 
PartialTxn partialTxn, Writes writes, PersistableResult result)
     {
         apply(safeStore, txnId, route, executeAt, partialDeps, partialTxn, 
writes, result, (l, r) -> {});
     }
 
-    public static void apply(SafeCommandStore safeStore, TxnId txnId, Route<?> 
route, Timestamp executeAt, @Nullable PartialDeps partialDeps, @Nullable 
PartialTxn partialTxn, Writes writes, Result result, BiConsumer<Command, 
Command> consumer)
+    public static void apply(SafeCommandStore safeStore, TxnId txnId, Route<?> 
route, Timestamp executeAt, @Nullable PartialDeps partialDeps, @Nullable 
PartialTxn partialTxn, Writes writes, PersistableResult result, 
BiConsumer<Command, Command> consumer)
     {
         StoreParticipants participants = StoreParticipants.execute(safeStore, 
route, txnId.epoch(), txnId, executeAt.epoch());
         SafeCommand safeCommand = safeStore.get(txnId, participants);
diff --git a/accord-core/src/test/java/accord/local/cfk/CommandsForKeyTest.java 
b/accord-core/src/test/java/accord/local/cfk/CommandsForKeyTest.java
index 22b61149..b48128e5 100644
--- a/accord-core/src/test/java/accord/local/cfk/CommandsForKeyTest.java
+++ b/accord-core/src/test/java/accord/local/cfk/CommandsForKeyTest.java
@@ -47,6 +47,7 @@ import accord.api.ProgressLog.BlockedUntil;
 import accord.api.Query;
 import accord.api.Read;
 import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.RoutingKey;
 import accord.api.Update;
 import accord.impl.AbstractReplayer;
@@ -562,7 +563,7 @@ public class CommandsForKeyTest
                               .partialDeps(slice(txnId, deps))
                               .executeAt(executeAt)
                               .waitingOn(waitingOn)
-                              .result(new Result(){});
+                              .result(new PersistableResult(){});
 
             if (txnId.is(Write))
                 builder.writes(new Writes(txnId, executeAt, KEYS, null));
diff --git a/accord-core/src/test/java/accord/messages/ReadDataTest.java 
b/accord-core/src/test/java/accord/messages/ReadDataTest.java
index bcf23c1c..a508c0e4 100644
--- a/accord-core/src/test/java/accord/messages/ReadDataTest.java
+++ b/accord-core/src/test/java/accord/messages/ReadDataTest.java
@@ -35,7 +35,7 @@ import accord.api.Data;
 import accord.api.MessageSink.ReplySink;
 import accord.api.Query;
 import accord.api.Read;
-import accord.api.Result;
+import accord.api.Result.PersistableResult;
 import accord.api.RoutingKey;
 import accord.api.Update;
 import accord.api.Write;
@@ -302,7 +302,7 @@ class ReadDataTest
             Writes writes = new Writes(txnId, executeAt, keys, write);
 
             forEach(store -> 
check(store.chain(PreLoadContext.contextFor(txnId, "Test"), safe -> {
-                CheckedCommands.apply(safe, txnId, route, executeAt, deps, 
partialTxn, writes, Mockito.mock(Result.class));
+                CheckedCommands.apply(safe, txnId, route, executeAt, deps, 
partialTxn, writes, Mockito.mock(PersistableResult.class));
             })));
             return writeResult;
         }
diff --git 
a/accord-maelstrom/src/main/java/accord/maelstrom/MaelstromResult.java 
b/accord-maelstrom/src/main/java/accord/maelstrom/MaelstromResult.java
index bb44cb59..6db3888e 100644
--- a/accord-maelstrom/src/main/java/accord/maelstrom/MaelstromResult.java
+++ b/accord-maelstrom/src/main/java/accord/maelstrom/MaelstromResult.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.NavigableMap;
 import java.util.TreeMap;
 
+import accord.api.Result.PersistableResult;
 import accord.local.Node;
 import accord.local.Node.Id;
 import com.google.gson.TypeAdapter;
@@ -34,7 +35,7 @@ import accord.primitives.Keys;
 
 import static accord.utils.Invariants.illegalState;
 
-public class MaelstromResult implements Result
+public class MaelstromResult implements PersistableResult
 {
     final Node.Id client;
     final long requestId;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to