Merge "BUG-9048 Fix actor crash when writing incorrect data"
authorTomas Cere <tcere@cisco.com>
Thu, 12 Oct 2017 10:17:48 +0000 (10:17 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 12 Oct 2017 10:17:48 +0000 (10:17 +0000)
1  2 
netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/WriteAdapter.java

index 08ca01bb960b4c77426d7490f166048c541a8b08,ef5df778d630d4b26a844a86a7fac5f027498d0d..a214dd4fc71a7a45383f7f78e63686a648ca9e0a
@@@ -49,27 -54,35 +55,35 @@@ class WriteAdapter 
  
              @Override
              public void onFailure(@Nonnull final Throwable throwable) {
-                 requester.tell(throwable, self);
+                 requester.tell(new SubmitFailedReply(throwable), self);
              }
 -        });
 +        }, MoreExecutors.directExecutor());
      }
  
+     @SuppressWarnings("checkstyle:IllegalCatch")
      public void handle(final Object message, final ActorRef sender, final ActorContext context, final ActorRef self) {
-         if (message instanceof MergeRequest) {
-             final MergeRequest mergeRequest = (MergeRequest) message;
-             final NormalizedNodeMessage data = mergeRequest.getNormalizedNodeMessage();
-             tx.merge(mergeRequest.getStore(), data.getIdentifier(), data.getNode());
-         } else if (message instanceof PutRequest) {
-             final PutRequest putRequest = (PutRequest) message;
-             final NormalizedNodeMessage data = putRequest.getNormalizedNodeMessage();
-             tx.put(putRequest.getStore(), data.getIdentifier(), data.getNode());
-         } else if (message instanceof DeleteRequest) {
-             final DeleteRequest deleteRequest = (DeleteRequest) message;
-             tx.delete(deleteRequest.getStore(), deleteRequest.getPath());
-         } else if (message instanceof CancelRequest) {
-             cancel(context, sender, self);
-         } else if (message instanceof SubmitRequest) {
-             submit(sender, self, context);
+         // we need to catch everything, since an unchecked exception can be thrown from the underlying parse.
+         // TODO Maybe we should store it and fail the submit immediately?.
+         try {
+             if (message instanceof MergeRequest) {
+                 final MergeRequest mergeRequest = (MergeRequest) message;
+                 final NormalizedNodeMessage data = mergeRequest.getNormalizedNodeMessage();
+                 tx.merge(mergeRequest.getStore(), data.getIdentifier(), data.getNode());
+             } else if (message instanceof PutRequest) {
+                 final PutRequest putRequest = (PutRequest) message;
+                 final NormalizedNodeMessage data = putRequest.getNormalizedNodeMessage();
+                 tx.put(putRequest.getStore(), data.getIdentifier(), data.getNode());
+             } else if (message instanceof DeleteRequest) {
+                 final DeleteRequest deleteRequest = (DeleteRequest) message;
+                 tx.delete(deleteRequest.getStore(), deleteRequest.getPath());
+             } else if (message instanceof CancelRequest) {
+                 cancel(context, sender, self);
+             } else if (message instanceof SubmitRequest) {
+                 submit(sender, self, context);
+             }
+         } catch (final RuntimeException exception) {
+             LOG.error("Write command has failed.", exception);
          }
      }
  }