X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShard.java;h=7073ea758b2b751d93708914bfc3935779076908;hp=4b130950f27d9f40585cc432eedf4b31e71e3a9b;hb=a469dbcec569cc972df0cd57cf725a2173d2604a;hpb=dd32d3d246ebad8b7c76afb93239a4462f329a6b diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java index 4b130950f2..7073ea758b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java @@ -65,6 +65,7 @@ import org.opendaylight.controller.cluster.datastore.messages.UpdateSchemaContex import org.opendaylight.controller.cluster.datastore.modification.Modification; import org.opendaylight.controller.cluster.datastore.modification.MutableCompositeModification; import org.opendaylight.controller.cluster.datastore.node.NormalizedNodeToNodeCodec; +import org.opendaylight.controller.cluster.notifications.RoleChangeNotifier; import org.opendaylight.controller.cluster.raft.RaftActor; import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry; import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply; @@ -131,6 +132,8 @@ public class Shard extends RaftActor { private Cancellable txCommitTimeoutCheckSchedule; + private Optional roleChangeNotifier; + /** * Coordinates persistence recovery on startup. */ @@ -139,8 +142,8 @@ public class Shard extends RaftActor { private final Map transactionChains = new HashMap<>(); - protected Shard(ShardIdentifier name, Map peerAddresses, - DatastoreContext datastoreContext, SchemaContext schemaContext) { + protected Shard(final ShardIdentifier name, final Map peerAddresses, + final DatastoreContext datastoreContext, final SchemaContext schemaContext) { super(name.toString(), mapPeerAddresses(peerAddresses), Optional.of(datastoreContext.getShardRaftConfig())); @@ -160,7 +163,6 @@ public class Shard extends RaftActor { shardMBean = ShardMBeanFactory.getShardStatsMBean(name.toString(), datastoreContext.getDataStoreMXBeanType()); - shardMBean.setDataStoreExecutor(store.getDomStoreExecutor()); shardMBean.setNotificationManager(store.getDataChangeListenerNotificationManager()); if (isMetricsCaptureEnabled()) { @@ -172,10 +174,13 @@ public class Shard extends RaftActor { transactionCommitTimeout = TimeUnit.MILLISECONDS.convert( datastoreContext.getShardTransactionCommitTimeoutInSeconds(), TimeUnit.SECONDS); + + // create a notifier actor for each cluster member + roleChangeNotifier = createRoleChangeNotifier(name.toString()); } private static Map mapPeerAddresses( - Map peerAddresses) { + final Map peerAddresses) { Map map = new HashMap<>(); for (Map.Entry entry : peerAddresses @@ -188,7 +193,7 @@ public class Shard extends RaftActor { public static Props props(final ShardIdentifier name, final Map peerAddresses, - DatastoreContext datastoreContext, SchemaContext schemaContext) { + final DatastoreContext datastoreContext, final SchemaContext schemaContext) { Preconditions.checkNotNull(name, "name should not be null"); Preconditions.checkNotNull(peerAddresses, "peerAddresses should not be null"); Preconditions.checkNotNull(datastoreContext, "dataStoreContext should not be null"); @@ -197,6 +202,12 @@ public class Shard extends RaftActor { return Props.create(new ShardCreator(name, peerAddresses, datastoreContext, schemaContext)); } + private Optional createRoleChangeNotifier(String shardId) { + ActorRef shardRoleChangeNotifier = this.getContext().actorOf( + RoleChangeNotifier.getProps(shardId), shardId + "-notifier"); + return Optional.of(shardRoleChangeNotifier); + } + @Override public void postStop() { super.postStop(); @@ -207,7 +218,7 @@ public class Shard extends RaftActor { } @Override - public void onReceiveRecover(Object message) throws Exception { + public void onReceiveRecover(final Object message) throws Exception { if(LOG.isDebugEnabled()) { LOG.debug("onReceiveRecover: Received message {} from {}", message.getClass().toString(), @@ -226,7 +237,7 @@ public class Shard extends RaftActor { } @Override - public void onReceiveCommand(Object message) throws Exception { + public void onReceiveCommand(final Object message) throws Exception { if(LOG.isDebugEnabled()) { LOG.debug("onReceiveCommand: Received message {} from {}", message, getSender()); } @@ -260,6 +271,11 @@ public class Shard extends RaftActor { } } + @Override + protected Optional getRoleChangeNotifier() { + return roleChangeNotifier; + } + private void handleTransactionCommitTimeoutCheck() { CohortEntry cohortEntry = commitCoordinator.getCurrentCohortEntry(); if(cohortEntry != null) { @@ -273,7 +289,7 @@ public class Shard extends RaftActor { } } - private void handleCommitTransaction(CommitTransaction commit) { + private void handleCommitTransaction(final CommitTransaction commit) { final String transactionID = commit.getTransactionID(); LOG.debug("Committing transaction {}", transactionID); @@ -368,7 +384,7 @@ public class Shard extends RaftActor { commitCoordinator.currentTransactionComplete(transactionID, true); } - private void handleCanCommitTransaction(CanCommitTransaction canCommit) { + private void handleCanCommitTransaction(final CanCommitTransaction canCommit) { LOG.debug("Can committing transaction {}", canCommit.getTransactionID()); commitCoordinator.handleCanCommit(canCommit, getSender(), self()); } @@ -401,11 +417,11 @@ public class Shard extends RaftActor { readyTransactionReply, getSelf()); } - private void handleAbortTransaction(AbortTransaction abort) { + private void handleAbortTransaction(final AbortTransaction abort) { doAbortTransaction(abort.getTransactionID(), getSender()); } - private void doAbortTransaction(String transactionID, final ActorRef sender) { + private void doAbortTransaction(final String transactionID, final ActorRef sender) { final CohortEntry cohortEntry = commitCoordinator.getCohortEntryIfCurrent(transactionID); if(cohortEntry != null) { LOG.debug("Aborting transaction {}", transactionID); @@ -420,7 +436,7 @@ public class Shard extends RaftActor { Futures.addCallback(future, new FutureCallback() { @Override - public void onSuccess(Void v) { + public void onSuccess(final Void v) { shardMBean.incrementAbortTransactionsCount(); if(sender != null) { @@ -429,7 +445,7 @@ public class Shard extends RaftActor { } @Override - public void onFailure(Throwable t) { + public void onFailure(final Throwable t) { LOG.error(t, "An exception happened during abort"); if(sender != null) { @@ -440,7 +456,7 @@ public class Shard extends RaftActor { } } - private void handleCreateTransaction(Object message) { + private void handleCreateTransaction(final Object message) { if (isLeader()) { createTransaction(CreateTransaction.fromSerializable(message)); } else if (getLeader() != null) { @@ -453,7 +469,7 @@ public class Shard extends RaftActor { } } - private void handleReadDataReply(Object message) { + private void handleReadDataReply(final Object message) { // This must be for install snapshot. Don't want to open this up and trigger // deSerialization @@ -467,7 +483,7 @@ public class Shard extends RaftActor { getSender().tell(PoisonPill.getInstance(), self()); } - private void closeTransactionChain(CloseTransactionChain closeTransactionChain) { + private void closeTransactionChain(final CloseTransactionChain closeTransactionChain) { DOMStoreTransactionChain chain = transactionChains.remove(closeTransactionChain.getTransactionChainId()); @@ -562,14 +578,14 @@ public class Shard extends RaftActor { return transactionActor; } - private void syncCommitTransaction(DOMStoreWriteTransaction transaction) + private void syncCommitTransaction(final DOMStoreWriteTransaction transaction) throws ExecutionException, InterruptedException { DOMStoreThreePhaseCommitCohort commitCohort = transaction.ready(); commitCohort.preCommit().get(); commitCohort.commit().get(); } - private void commitWithNewTransaction(Modification modification) { + private void commitWithNewTransaction(final Modification modification) { DOMStoreWriteTransaction tx = store.newWriteOnlyTransaction(); modification.apply(tx); try { @@ -582,18 +598,18 @@ public class Shard extends RaftActor { } } - private void updateSchemaContext(UpdateSchemaContext message) { + private void updateSchemaContext(final UpdateSchemaContext message) { this.schemaContext = message.getSchemaContext(); updateSchemaContext(message.getSchemaContext()); store.onGlobalContextUpdated(message.getSchemaContext()); } @VisibleForTesting - void updateSchemaContext(SchemaContext schemaContext) { + void updateSchemaContext(final SchemaContext schemaContext) { store.onGlobalContextUpdated(schemaContext); } - private void registerChangeListener(RegisterChangeListener registerChangeListener) { + private void registerChangeListener(final RegisterChangeListener registerChangeListener) { LOG.debug("registerDataChangeListener for {}", registerChangeListener.getPath()); @@ -621,7 +637,7 @@ public class Shard extends RaftActor { private ListenerRegistration>> doChangeListenerRegistration( - RegisterChangeListener registerChangeListener) { + final RegisterChangeListener registerChangeListener) { ActorSelection dataChangeListenerPath = getContext().system().actorSelection( registerChangeListener.getDataChangeListenerPath()); @@ -651,7 +667,7 @@ public class Shard extends RaftActor { @Override protected - void startLogRecoveryBatch(int maxBatchSize) { + void startLogRecoveryBatch(final int maxBatchSize) { currentLogRecoveryBatch = Lists.newArrayListWithCapacity(maxBatchSize); if(LOG.isDebugEnabled()) { @@ -660,7 +676,7 @@ public class Shard extends RaftActor { } @Override - protected void appendRecoveredLogEntry(Payload data) { + protected void appendRecoveredLogEntry(final Payload data) { if (data instanceof CompositeModificationPayload) { currentLogRecoveryBatch.add(((CompositeModificationPayload) data).getModification()); } else { @@ -669,7 +685,7 @@ public class Shard extends RaftActor { } @Override - protected void applyRecoverySnapshot(ByteString snapshot) { + protected void applyRecoverySnapshot(final ByteString snapshot) { if(recoveryCoordinator == null) { recoveryCoordinator = new ShardRecoveryCoordinator(persistenceId(), schemaContext); } @@ -734,7 +750,7 @@ public class Shard extends RaftActor { } @Override - protected void applyState(ActorRef clientActor, String identifier, Object data) { + protected void applyState(final ActorRef clientActor, final String identifier, final Object data) { if (data instanceof CompositeModificationPayload) { Object modification = ((CompositeModificationPayload) data).getModification(); @@ -793,7 +809,7 @@ public class Shard extends RaftActor { @VisibleForTesting @Override - protected void applySnapshot(ByteString snapshot) { + protected void applySnapshot(final ByteString snapshot) { // Since this will be done only on Recovery or when this actor is a Follower // we can safely commit everything in here. We not need to worry about event notifications // as they would have already been disabled on the follower @@ -858,7 +874,7 @@ public class Shard extends RaftActor { return dataPersistenceProvider; } - @Override protected void onLeaderChanged(String oldLeader, String newLeader) { + @Override protected void onLeaderChanged(final String oldLeader, final String newLeader) { shardMBean.setLeader(newLeader); } @@ -880,8 +896,8 @@ public class Shard extends RaftActor { final DatastoreContext datastoreContext; final SchemaContext schemaContext; - ShardCreator(ShardIdentifier name, Map peerAddresses, - DatastoreContext datastoreContext, SchemaContext schemaContext) { + ShardCreator(final ShardIdentifier name, final Map peerAddresses, + final DatastoreContext datastoreContext, final SchemaContext schemaContext) { this.name = name; this.peerAddresses = peerAddresses; this.datastoreContext = datastoreContext; @@ -914,11 +930,11 @@ public class Shard extends RaftActor { private volatile ListenerRegistration>> delegate; - DelayedListenerRegistration(RegisterChangeListener registerChangeListener) { + DelayedListenerRegistration(final RegisterChangeListener registerChangeListener) { this.registerChangeListener = registerChangeListener; } - void setDelegate( ListenerRegistration>> registration) { this.delegate = registration; }