*/
package org.opendaylight.controller.cluster.access.commands;
+import static java.util.Objects.requireNonNull;
+
import akka.actor.ActorRef;
-import com.google.common.annotations.Beta;
import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.common.base.Preconditions;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamException;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
/**
* Request to commit a local transaction. Since local transactions do not introduce state on the backend until they
* are ready, this message carries a complete set of modifications.
- *
- * @author Robert Varga
*/
-@Beta
public final class CommitLocalTransactionRequest
extends AbstractLocalTransactionRequest<CommitLocalTransactionRequest> {
+ @java.io.Serial
private static final long serialVersionUID = 1L;
- @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "This field is not Serializable but this class "
- + "implements writeReplace to delegate serialization to a Proxy class and thus instances of this class "
- + "aren't serialized. FindBugs does not recognize this.")
private final DataTreeModification mod;
+ private final Exception delayedFailure;
private final boolean coordinated;
- public CommitLocalTransactionRequest(@Nonnull final TransactionIdentifier identifier,
- @Nonnull final ActorRef replyTo, @Nonnull final DataTreeModification mod, final boolean coordinated) {
- super(identifier, 0, replyTo);
- this.mod = Preconditions.checkNotNull(mod);
+ public CommitLocalTransactionRequest(final @NonNull TransactionIdentifier identifier, final long sequence,
+ final @NonNull ActorRef replyTo, final @NonNull DataTreeModification mod,
+ final @Nullable Exception delayedFailure, final boolean coordinated) {
+ super(identifier, sequence, replyTo);
+ this.mod = requireNonNull(mod);
+ this.delayedFailure = delayedFailure;
this.coordinated = coordinated;
}
+ /**
+ * Return the delayed error detected on the frontend. If this error is present, it will be reported as the result
+ * of the first step of the commit process.
+ *
+ * @return Delayed failure, if present.
+ */
+ public Optional<Exception> getDelayedFailure() {
+ return Optional.ofNullable(delayedFailure);
+ }
+
public DataTreeModification getModification() {
return mod;
}
@Override
protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
- return super.addToStringAttributes(toStringHelper).add("coordinated", coordinated);
+ return super.addToStringAttributes(toStringHelper).add("coordinated", coordinated)
+ .add("delayedError", delayedFailure);
+ }
+
+ @java.io.Serial
+ private void readObject(final ObjectInputStream stream) throws IOException, ClassNotFoundException {
+ throwNSE();
+ }
+
+ @java.io.Serial
+ private void readObjectNoData() throws ObjectStreamException {
+ throwNSE();
+ }
+
+ @java.io.Serial
+ private void writeObject(final ObjectOutputStream stream) throws IOException {
+ throwNSE();
}
}