Bug 4627: Fix premature RO tx cleanup 57/34757/1
authorTom Pantelis <tpanteli@brocade.com>
Tue, 16 Feb 2016 04:45:36 +0000 (23:45 -0500)
committerTom Pantelis <tpanteli@brocade.com>
Tue, 16 Feb 2016 04:45:36 +0000 (23:45 -0500)
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>
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 e160367a1e5faf7fdd5a86435c6eca4f916dfb1e..4a031fa9160d55ae341e2ea50a4539513dc7be96 100644 (file)
@@ -253,7 +253,7 @@ final class RemoteTransactionContextSupport {
                 transactionActor, getActorContext(), remoteTransactionVersion, transactionContextWrapper.getLimiter());
 
         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