Add new cds-access-api proxies
[controller.git] / opendaylight / md-sal / cds-access-api / src / main / java / org / opendaylight / controller / cluster / access / concepts / ResponseEnvelope.java
index 9f998e7fac49b81d71e97487ed306c7205a0dda8..50d1e7434ce1c845fb9c5948f0759b41d526fb88 100644 (file)
@@ -7,10 +7,49 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.concepts.WritableObjects;
+
 public abstract class ResponseEnvelope<T extends Response<?, ?>> extends Envelope<T> {
+    interface SerialForm<T extends Response<?, ?>, E extends ResponseEnvelope<T>> extends Envelope.SerialForm<T, E> {
+        @Override
+        default void writeExternal(final ObjectOutput out, final @NonNull E envelope) throws IOException {
+            Envelope.SerialForm.super.writeExternal(out, envelope);
+            WritableObjects.writeLong(out, envelope.getExecutionTimeNanos());
+        }
+
+        @Override
+        default E readExternal(final ObjectInput in, final long sessionId, final long txSequence, final T message)
+                throws IOException {
+            return readExternal(in, sessionId, txSequence, message, WritableObjects.readLong(in));
+        }
+
+        E readExternal(ObjectInput in, long sessionId, long txSequence, T message, long executionTimeNanos);
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    ResponseEnvelope(final T message, final long sessionId, final long txSequence) {
+    private final long executionTimeNanos;
+
+    ResponseEnvelope(final T message, final long sessionId, final long txSequence, final long executionTimeNanos) {
         super(message, sessionId, txSequence);
+        checkArgument(executionTimeNanos >= 0, "Negative executionTime");
+        this.executionTimeNanos = executionTimeNanos;
+    }
+
+    /**
+     * Return the time the request took to execute in nanoseconds. This may not reflect the actual CPU time, but rather
+     * a measure of the complexity involved in servicing the original request.
+     *
+     * @return Time the request took to execute in nanoseconds
+     */
+    public final long getExecutionTimeNanos() {
+        return executionTimeNanos;
     }
 }