Handle the case when newModification() fails
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / databroker / actors / dds / LocalProxyTransaction.java
index feddd5fc5a5763999cd4abf087ba8c6b54686f6a..93c8c9350e2d4fc0c164e8c5a700b9125c494abd 100644 (file)
@@ -26,8 +26,10 @@ import org.opendaylight.controller.cluster.access.commands.ReadTransactionSucces
 import org.opendaylight.controller.cluster.access.commands.TransactionPurgeRequest;
 import org.opendaylight.controller.cluster.access.commands.TransactionRequest;
 import org.opendaylight.controller.cluster.access.concepts.Response;
+import org.opendaylight.controller.cluster.access.concepts.RuntimeRequestException;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 import org.opendaylight.controller.cluster.datastore.util.AbstractDataTreeModificationCursor;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
@@ -52,6 +54,7 @@ import org.slf4j.LoggerFactory;
  *
  * @author Robert Varga
  */
+// FIXME: sealed when we have JDK17+
 abstract class LocalProxyTransaction extends AbstractProxyTransaction {
     private static final Logger LOG = LoggerFactory.getLogger(LocalProxyTransaction.class);
 
@@ -77,12 +80,24 @@ abstract class LocalProxyTransaction extends AbstractProxyTransaction {
 
     @Override
     FluentFuture<Boolean> doExists(final YangInstanceIdentifier path) {
-        return FluentFutures.immediateBooleanFluentFuture(readOnlyView().readNode(path).isPresent());
+        final boolean result;
+        try {
+            result = readOnlyView().readNode(path).isPresent();
+        } catch (FailedDataTreeModificationException e) {
+            return FluentFutures.immediateFailedFluentFuture(ReadFailedException.MAPPER.apply(e));
+        }
+        return FluentFutures.immediateBooleanFluentFuture(result);
     }
 
     @Override
     FluentFuture<Optional<NormalizedNode>> doRead(final YangInstanceIdentifier path) {
-        return FluentFutures.immediateFluentFuture(readOnlyView().readNode(path));
+        final Optional<NormalizedNode> result;
+        try {
+            result = readOnlyView().readNode(path);
+        } catch (FailedDataTreeModificationException e) {
+            return FluentFutures.immediateFailedFluentFuture(ReadFailedException.MAPPER.apply(e));
+        }
+        return FluentFutures.immediateFluentFuture(result);
     }
 
     @Override
@@ -140,14 +155,24 @@ abstract class LocalProxyTransaction extends AbstractProxyTransaction {
 
     @NonNull Response<?, ?> handleExistsRequest(final @NonNull DataTreeSnapshot snapshot,
             final @NonNull ExistsTransactionRequest request) {
-        return new ExistsTransactionSuccess(request.getTarget(), request.getSequence(),
-            snapshot.readNode(request.getPath()).isPresent());
+        try {
+            return new ExistsTransactionSuccess(request.getTarget(), request.getSequence(),
+                snapshot.readNode(request.getPath()).isPresent());
+        } catch (FailedDataTreeModificationException e) {
+            return request.toRequestFailure(new RuntimeRequestException("Failed to access data",
+                ReadFailedException.MAPPER.apply(e)));
+        }
     }
 
     @NonNull Response<?, ?> handleReadRequest(final @NonNull DataTreeSnapshot snapshot,
             final @NonNull ReadTransactionRequest request) {
-        return new ReadTransactionSuccess(request.getTarget(), request.getSequence(),
-            snapshot.readNode(request.getPath()));
+        try {
+            return new ReadTransactionSuccess(request.getTarget(), request.getSequence(),
+                snapshot.readNode(request.getPath()));
+        } catch (FailedDataTreeModificationException e) {
+            return request.toRequestFailure(new RuntimeRequestException("Failed to access data",
+                ReadFailedException.MAPPER.apply(e)));
+        }
     }
 
     private boolean handleReadRequest(final TransactionRequest<?> request, final Consumer<Response<?, ?>> callback) {