Bug 4627: Fix premature RO tx cleanup 63/34763/3
authorTom Pantelis <tpanteli@brocade.com>
Tue, 16 Feb 2016 04:45:36 +0000 (23:45 -0500)
committerGerrit Code Review <gerrit@opendaylight.org>
Sat, 20 Feb 2016 00:07:32 +0000 (00:07 +0000)
For the RO tx PhantomReference cleanup mechanism, modified
RemoteTransactionContextSupport to pass the front-end client
TransactionProxy instance as the referent to the
FinalizablePhantomReference. Previously we were passing the
RemoteTransactionContextSupport instance which is only reachable via
a hard reference until the primary shard actor is obtained and thus may
be eligible for GC while the TransactionProxy is still in use.

Change-Id: Ib2808b4ba8113a5722f9ee422434a89adaf775fe
Signed-off-by: Tom Pantelis <tpanteli@brocade.com>
(cherry picked from commit 89274c9c31212a1d0f13aeb90384442e72221029)

opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContextSupport.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionContextCleanup.java

index 88c797a99074c366b63a703cc583f64c1608d310..bc14b143256e5a5dac7cd2318818bcc59dd3886e 100644 (file)
@@ -260,7 +260,7 @@ final class RemoteTransactionContextSupport {
         }
 
         if(parent.getType() == TransactionType.READ_ONLY) {
-            TransactionContextCleanup.track(this, ret);
+            TransactionContextCleanup.track(parent, ret);
         }
 
         return ret;
index 8998f5c74c66f87c7b0b9b493cdd084a2614b67d..865cc60edb2d0f982ecfee672baa63f347b170c9 100644 (file)
@@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory;
  * to the old generation space and thus should be cleaned up in a timely manner as the GC
  * runs on the young generation (eden, swap1...) space much more frequently.
  */
-final class TransactionContextCleanup extends FinalizablePhantomReference<RemoteTransactionContextSupport> {
+final class TransactionContextCleanup extends FinalizablePhantomReference<TransactionProxy> {
     private static final Logger LOG = LoggerFactory.getLogger(TransactionContextCleanup.class);
     /**
      * Used to enqueue the PhantomReferences for read-only TransactionProxy instances. The
@@ -42,12 +42,12 @@ final class TransactionContextCleanup extends FinalizablePhantomReference<Remote
 
     private final TransactionContext cleanup;
 
-    private TransactionContextCleanup(RemoteTransactionContextSupport referent, TransactionContext cleanup) {
+    private TransactionContextCleanup(TransactionProxy referent, TransactionContext cleanup) {
         super(referent, QUEUE);
         this.cleanup = cleanup;
     }
 
-    static void track(final RemoteTransactionContextSupport referent, final TransactionContext cleanup) {
+    static void track(final TransactionProxy referent, final TransactionContext cleanup) {
         final TransactionContextCleanup ret = new TransactionContextCleanup(referent, cleanup);
         CACHE.put(cleanup, ret);
     }
@@ -61,7 +61,7 @@ final class TransactionContextCleanup extends FinalizablePhantomReference<Remote
         }
     }
 
-    static void untrack(final RemoteTransactionContext cleanup) {
+    static void untrack(final TransactionContext cleanup) {
         CACHE.remove(cleanup);
     }
 }
\ No newline at end of file