void changeClusterState(ClusterStateChange stateChange, MemberMap memberMap, int partitionStateVersion, boolean isTransient) { changeClusterState(stateChange, memberMap, DEFAULT_TX_OPTIONS, partitionStateVersion, isTransient); }
private void doSetClusterState(ClusterState newState, boolean isTransient) { this.state = newState; stateLockRef.set(LockGuard.NOT_LOCKED); changeNodeState(newState); node.getNodeExtension().onClusterStateChange(newState, isTransient); }
@Override public void run() throws Exception { ClusterServiceImpl service = getService(); ClusterStateManager clusterStateManager = service.getClusterStateManager(); getLogger().info(format("Changing cluster state from %s to %s, initiator: %s, transient: %s", clusterStateManager.stateToString(), stateChange, initiator, isTransient)); clusterStateManager.commitClusterState(stateChange, initiator, txnId, isTransient); }
int partitionStateVersion, boolean isTransient ) { checkParameters(stateChange, options); if (isCurrentStateEqualToRequestedOne(stateChange)) { return; ClusterState oldState = getState(); ClusterState requestedState = stateChange.getClusterStateOrNull(); NodeEngineImpl nodeEngine = node.getNodeEngine(); = (TransactionManagerServiceImpl) nodeEngine.getTransactionManagerService(); Transaction tx = txManagerService.newAllowedDuringPassiveStateTransaction(options); notifyBeforeStateChange(oldState, requestedState, isTransient); tx.begin(); try { addTransactionRecords(stateChange, tx, members, memberListVersion, partitionStateVersion, isTransient); lockClusterStateOnAllMembers(stateChange, nodeEngine, options.getTimeoutMillis(), txnId, members, memberListVersion, partitionStateVersion); checkMemberListChange(memberListVersion); notifyAfterStateChange(oldState, requestedState, isTransient); if (e instanceof TargetNotMemberException || e.getCause() instanceof MemberLeftException) { throw new IllegalStateException("Cluster members changed during state change!", e); notifyAfterStateChange(oldState, requestedState, isTransient);
validateNodeCompatibleWith((Version) stateChange.getNewState()); validateClusterVersionChange((Version) stateChange.getNewState()); checkMemberListVersion(memberListVersion); checkMigrationsAndPartitionStateVersion(stateChange, partitionStateVersion); lockOrExtendClusterState(initiator, txnId, leaseTime); checkMigrationsAndPartitionStateVersion(stateChange, partitionStateVersion); } catch (IllegalStateException e) { stateLockRef.set(LockGuard.NOT_LOCKED);
public void commitClusterState(ClusterStateChange stateChange, Address initiator, String txnId, boolean isTransient) { Preconditions.checkNotNull(stateChange); stateChange.validate(); clusterServiceLock.lock(); try { final LockGuard stateLock = getStateLock(); if (!stateLock.allowsUnlock(txnId)) { throw new TransactionException( "Cluster state change [" + state + " -> " + stateChange + "] failed for " + initiator + ", current state: " + stateToString()); } if (stateChange.isOfType(ClusterState.class)) { ClusterState newState = (ClusterState) stateChange.getNewState(); doSetClusterState(newState, isTransient); // if state is changed to allow joins, then remove all members which left while not active. if (newState.isJoinAllowed()) { node.getClusterService().getMembershipManager().removeMembersDeadInNotJoinableState(); } } else if (stateChange.isOfType(Version.class)) { // version is validated on cluster-state-lock, thus we can commit without checking compatibility Version newVersion = (Version) stateChange.getNewState(); logger.info("Cluster version set to " + newVersion); doSetClusterVersion(newVersion); } else { throw new IllegalArgumentException("Illegal ClusterStateChange of type " + stateChange.getType() + "."); } } finally { clusterServiceLock.unlock(); } }
void setClusterState(ClusterState newState, boolean isTransient) { clusterServiceLock.lock(); try { doSetClusterState(newState, isTransient); } finally { clusterServiceLock.unlock(); } }
void commitClusterState(ClusterStateChange newState, Address initiator, String txnId) { commitClusterState(newState, initiator, txnId, false); }
public ClusterServiceImpl(Node node, MemberImpl localMember) { this.node = node; this.localMember = localMember; nodeEngine = node.nodeEngine; logger = node.getLogger(ClusterService.class.getName()); clusterClock = new ClusterClockImpl(logger); useLegacyMemberListFormat = node.getProperties().getBoolean(GroupProperty.USE_LEGACY_MEMBER_LIST_FORMAT); membershipManager = new MembershipManager(node, this, lock); clusterStateManager = new ClusterStateManager(node, lock); clusterJoinManager = new ClusterJoinManager(node, this, lock); clusterHeartbeatManager = new ClusterHeartbeatManager(node, this, lock); node.connectionManager.addConnectionListener(this); //MEMBERSHIP_EVENT_EXECUTOR is a single threaded executor to ensure that events are executed in correct order. nodeEngine.getExecutionService().register(MEMBERSHIP_EVENT_EXECUTOR_NAME, 1, Integer.MAX_VALUE, ExecutorType.CACHED); registerMetrics(); }
void changeClusterState(ClusterStateChange stateChange, MemberMap memberMap, TransactionOptions options, int partitionStateVersion, boolean isTransient) { checkParameters(stateChange, options); if (isCurrentStateEqualToRequestedOne(stateChange)) { return; ClusterState oldState = getState(); ClusterState requestedState = stateChange.getClusterStateOrNull(); NodeEngineImpl nodeEngine = node.getNodeEngine(); = (TransactionManagerServiceImpl) nodeEngine.getTransactionManagerService(); Transaction tx = txManagerService.newAllowedDuringPassiveStateTransaction(options); notifyBeforeStateChange(oldState, requestedState, isTransient); tx.begin(); try { addTransactionRecords(stateChange, tx, members, memberListVersion, partitionStateVersion, isTransient); lockClusterStateOnAllMembers(stateChange, nodeEngine, options.getTimeoutMillis(), txnId, members, memberListVersion, partitionStateVersion); checkMemberListChange(memberListVersion); notifyAfterStateChange(oldState, requestedState, isTransient); if (e instanceof TargetNotMemberException || e.getCause() instanceof MemberLeftException) { throw new IllegalStateException("Cluster members changed during state change!", e); notifyAfterStateChange(oldState, requestedState, isTransient);
validateNodeCompatibleWith((Version) stateChange.getNewState()); validateClusterVersionChange((Version) stateChange.getNewState()); checkMemberListVersion(memberListVersion); checkMigrationsAndPartitionStateVersion(stateChange, partitionStateVersion); lockOrExtendClusterState(initiator, txnId, leaseTime); checkMigrationsAndPartitionStateVersion(stateChange, partitionStateVersion); } catch (IllegalStateException e) { stateLockRef.set(LockGuard.NOT_LOCKED);
public void commitClusterState(ClusterStateChange stateChange, Address initiator, String txnId, boolean isTransient) { Preconditions.checkNotNull(stateChange); stateChange.validate(); clusterServiceLock.lock(); try { final LockGuard stateLock = getStateLock(); if (!stateLock.allowsUnlock(txnId)) { throw new TransactionException( "Cluster state change [" + state + " -> " + stateChange + "] failed for " + initiator + ", current state: " + stateToString()); } if (stateChange.isOfType(ClusterState.class)) { ClusterState newState = (ClusterState) stateChange.getNewState(); doSetClusterState(newState, isTransient); // if state is changed to allow joins, then remove all members which left while not active. if (newState.isJoinAllowed()) { node.getClusterService().getMembershipManager().removeAllMissingMembers(); } } else if (stateChange.isOfType(Version.class)) { // version is validated on cluster-state-lock, thus we can commit without checking compatibility Version newVersion = (Version) stateChange.getNewState(); logger.info("Cluster version set to " + newVersion); doSetClusterVersion(newVersion); } else { throw new IllegalArgumentException("Illegal ClusterStateChange of type " + stateChange.getType() + "."); } } finally { clusterServiceLock.unlock(); } }
void setClusterState(ClusterState newState, boolean isTransient) { clusterServiceLock.lock(); try { doSetClusterState(newState, isTransient); } finally { clusterServiceLock.unlock(); } }
void commitClusterState(ClusterStateChange newState, Address initiator, String txnId) { commitClusterState(newState, initiator, txnId, false); }
public ClusterServiceImpl(Node node, MemberImpl localMember) { this.node = node; this.localMember = localMember; nodeEngine = node.nodeEngine; logger = node.getLogger(ClusterService.class.getName()); clusterClock = new ClusterClockImpl(logger); useLegacyMemberListFormat = node.getProperties().getBoolean(GroupProperty.USE_LEGACY_MEMBER_LIST_FORMAT); membershipManager = new MembershipManager(node, this, lock); clusterStateManager = new ClusterStateManager(node, lock); clusterJoinManager = new ClusterJoinManager(node, this, lock); clusterHeartbeatManager = new ClusterHeartbeatManager(node, this, lock); node.connectionManager.addConnectionListener(this); //MEMBERSHIP_EVENT_EXECUTOR is a single threaded executor to ensure that events are executed in correct order. nodeEngine.getExecutionService().register(MEMBERSHIP_EVENT_EXECUTOR_NAME, 1, Integer.MAX_VALUE, ExecutorType.CACHED); nodeEngine.getExecutionService().register(VERSION_AUTO_UPGRADE_EXECUTOR_NAME, 1, Integer.MAX_VALUE, ExecutorType.CACHED); registerMetrics(); }
public void changeClusterVersion(Version version, MemberMap memberMap) { int partitionStateVersion = node.getPartitionService().getPartitionStateVersion(); clusterStateManager.changeClusterState(ClusterStateChange.from(version), memberMap, partitionStateVersion, false); }
@Override public void run() throws Exception { ClusterServiceImpl service = getService(); ClusterStateManager clusterStateManager = service.getClusterStateManager(); getLogger().info(format("Changing cluster state from %s to %s, initiator: %s, transient: %s", clusterStateManager.stateToString(), stateChange, initiator, isTransient)); clusterStateManager.commitClusterState(stateChange, initiator, txnId, isTransient); }
private void doSetClusterState(ClusterState newState, boolean isTransient) { this.state = newState; stateLockRef.set(LockGuard.NOT_LOCKED); changeNodeState(newState); node.getNodeExtension().onClusterStateChange(newState, isTransient); }
private void changeClusterState(ClusterState newState, TransactionOptions options, boolean isTransient) { int partitionStateVersion = node.getPartitionService().getPartitionStateVersion(); clusterStateManager.changeClusterState(ClusterStateChange.from(newState), membershipManager.getMemberMap(), options, partitionStateVersion, isTransient); }
private void setClusterStateAndVersion(ClusterState newState, Version newVersion, boolean isTransient) { this.state = newState; this.clusterVersion = newVersion; stateLockRef.set(LockGuard.NOT_LOCKED); changeNodeState(newState); node.getNodeExtension().onClusterStateChange(newState, isTransient); node.getNodeExtension().onClusterVersionChange(newVersion); }