Bug 1598: Cleanup stale ShardReadTransactions 75/10175/10
authortpantelis <tpanteli@brocade.com>
Fri, 22 Aug 2014 01:00:50 +0000 (21:00 -0400)
committertpantelis <tpanteli@brocade.com>
Mon, 25 Aug 2014 11:37:22 +0000 (07:37 -0400)
commit758e3e3b16e73298221a78872149814baf735c7d
tree82dac73e6a943e2a41c2308b3bf321475bd2c81c
parent5c74e9b561688f9cd5cf2134fcefec727fd9c02d
Bug 1598: Cleanup stale ShardReadTransactions

For read-only Tx, a FinalizablePhantomReference is created with the
TransacionProxy instance as the referent and is added to a static
FinalizableReferenceQueue. The FinalizablePhantomReference is subclassed
to hold the TransactionProxy's remoteTransactionPaths map. When the
TransactionProxy instance in GC'ed, the FinalizablePhantomReference is
notified and calls closeTransaction on each TransactionContext to clean it up.

Also to handle potentially stale Tx's due to disconnects, nodes prematurely
shutting down etc, I set set an idle time out (default 10 min) on ShardTransaction
actors via setReceiveTimeout. If the actor is idle with no messages
after the timeout, the actor self-destructs.

I made the idle timeout configurable via the config yang file. This
setting needs to be passed down from the module, thru the ShardManager
to the Shards to the ShardTransactions. I created a ShardCOntext class
to hold the idle timeout and other data that's passed down. This will
also make it easier in the future if additonal config data needs to be
passed down.

In the config yang file, I created a data-store-properties grouping to
avoid having to duplicate the config properties for the operational and
config data stores.

Many unit tests fail when running from Eclipse due to creating anonymous inner
Creator class instances in the static props methods. The akka code doesn't like this -
if the Creator instance class is enclosed in another class it expects
the class to be static. However this runs fine when running unit tests
from mvn and when running the production controller. I suspect the
difference is b/c the JDK compiler generates the anonymous class as
static since they're enclosed in static methods but the Eclipse compiler
doesn't. Anyway, to avoid this I refactored all the anonymous inner
Creator classes to private static classes. I think this is safer and
will avoid potential future issues with different JDK compilers or JDK upgrades.

Change-Id: Ie644612cb34e7219dc089b8add6d397a11bffdda
Signed-off-by: tpantelis <tpanteli@brocade.com>
34 files changed:
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListener.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxy.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistration.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreFactory.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreProperties.java [new file with mode: 0644]
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardContext.java [new file with mode: 0644]
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardReadTransaction.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardReadWriteTransaction.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardWriteTransaction.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohort.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorContext.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/config/yang/config/distributed_datastore_provider/DistributedConfigDataStoreProviderModule.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/config/yang/config/distributed_datastore_provider/DistributedOperationalDataStoreProviderModule.java
opendaylight/md-sal/sal-distributed-datastore/src/main/yang/distributed-datastore-provider.yang
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/BasicIntegrationTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxyTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreIntegrationTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChainTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFailureTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortFailureTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxyTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java