Make DataModification closeable 97/8297/2
authorMaros Marsalek <maros.mars@gmail.com>
Mon, 4 Sep 2017 12:37:57 +0000 (14:37 +0200)
committerMaroš Maršalek <maros.mars@gmail.com>
Tue, 5 Sep 2017 11:18:28 +0000 (11:18 +0000)
and close the modification from transactions.

This enables cleanup of underlay resources per transaction.
It is not needed when managing VPP, but might be useful for
other use-cases where underlay transactions are involved.

Change-Id: If14197052172be0158fd7efb5ee1794935d576bc
Signed-off-by: Maros Marsalek <maros.mars@gmail.com>
infra/data-api/src/main/java/io/fd/honeycomb/data/DataModification.java
infra/data-impl/src/main/java/io/fd/honeycomb/data/impl/ReadOnlyTransaction.java
infra/data-impl/src/main/java/io/fd/honeycomb/data/impl/WriteTransaction.java

index 6e903a4..22fba0f 100644 (file)
@@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailed
  * Modification of a {@link ModifiableDataManager}.
  */
 @Beta
-public interface DataModification extends ReadableDataManager {
+public interface DataModification extends ReadableDataManager, AutoCloseable {
 
     /**
      * Delete the node at specified path.
@@ -67,4 +67,12 @@ public interface DataModification extends ReadableDataManager {
      * @throws DataValidationFailedException if modification data is not valid
      */
     void validate() throws DataValidationFailedException;
+
+    /**
+     * Perform cleanup if necessary.
+     */
+    @Override
+    default void close() {
+        // by default, no cleanup is required
+    }
 }
index e21098a..dcd456a 100644 (file)
@@ -25,6 +25,7 @@ import com.google.common.base.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+import io.fd.honeycomb.data.DataModification;
 import io.fd.honeycomb.data.ReadableDataManager;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -43,7 +44,7 @@ final class ReadOnlyTransaction implements DOMDataReadOnlyTransaction {
     @Nullable
     private ReadableDataManager operationalData;
     @Nullable
-    private ReadableDataManager configSnapshot;
+    private DataModification configSnapshot;
 
     private boolean closed = false;
 
@@ -51,7 +52,7 @@ final class ReadOnlyTransaction implements DOMDataReadOnlyTransaction {
      * @param configData config data tree manager. Null if config reads are not to be supported
      * @param operationalData operational data tree manager. Null if operational reads are not to be supported
      */
-    private ReadOnlyTransaction(@Nullable final ReadableDataManager configData,
+    private ReadOnlyTransaction(@Nullable final DataModification configData,
                                 @Nullable final ReadableDataManager operationalData) {
         this.configSnapshot = configData;
         this.operationalData = operationalData;
@@ -59,6 +60,10 @@ final class ReadOnlyTransaction implements DOMDataReadOnlyTransaction {
 
     @Override
     public synchronized void close() {
+        if(configSnapshot != null) {
+            configSnapshot.close();
+        }
+
         closed = true;
         configSnapshot = null;
         operationalData = null;
@@ -101,12 +106,12 @@ final class ReadOnlyTransaction implements DOMDataReadOnlyTransaction {
     }
 
     @Nonnull
-    static ReadOnlyTransaction createConfigOnly(@Nonnull final ReadableDataManager configData) {
+    static ReadOnlyTransaction createConfigOnly(@Nonnull final DataModification configData) {
         return new ReadOnlyTransaction(requireNonNull(configData), null);
     }
 
     @Nonnull
-    static ReadOnlyTransaction create(@Nonnull final ReadableDataManager configData,
+    static ReadOnlyTransaction create(@Nonnull final DataModification configData,
                                       @Nonnull final ReadableDataManager operationalData) {
         return new ReadOnlyTransaction(requireNonNull(configData), requireNonNull(operationalData));
     }
index 93043ce..ce0e3c6 100644 (file)
@@ -104,6 +104,9 @@ final class WriteTransaction implements DOMDataWriteTransaction {
             // only NEW transactions can be cancelled
             return false;
         } else {
+            if (configModification != null) {
+                configModification.close();
+            }
             status = CANCELED;
             return true;
         }