use of com.hazelcast.internal.partition.PartitionRuntimeState in project hazelcast by hazelcast.
the class PartitionDataSerializerHook method createFactory.
@Override
public DataSerializableFactory createFactory() {
ConstructorFunction<Integer, IdentifiedDataSerializable>[] constructors = new ConstructorFunction[LEN];
constructors[PARTITION_RUNTIME_STATE] = arg -> new PartitionRuntimeState();
constructors[ASSIGN_PARTITIONS] = arg -> new AssignPartitions();
constructors[PARTITION_BACKUP_REPLICA_ANTI_ENTROPY] = arg -> new PartitionBackupReplicaAntiEntropyOperation();
constructors[FETCH_PARTITION_STATE] = arg -> new FetchPartitionStateOperation();
constructors[HAS_ONGOING_MIGRATION] = arg -> new HasOngoingMigration();
constructors[MIGRATION_COMMIT] = arg -> new MigrationCommitOperation();
constructors[PARTITION_STATE_OP] = arg -> new PartitionStateOperation();
constructors[PROMOTION_COMMIT] = arg -> new PromotionCommitOperation();
constructors[REPLICA_SYNC_REQUEST] = arg -> new PartitionReplicaSyncRequest();
constructors[REPLICA_SYNC_RESPONSE] = arg -> new PartitionReplicaSyncResponse();
constructors[REPLICA_SYNC_RETRY_RESPONSE] = arg -> new PartitionReplicaSyncRetryResponse();
constructors[SAFE_STATE_CHECK] = arg -> new SafeStateCheckOperation();
constructors[SHUTDOWN_REQUEST] = arg -> new ShutdownRequestOperation();
constructors[SHUTDOWN_RESPONSE] = arg -> new ShutdownResponseOperation();
constructors[REPLICA_FRAGMENT_MIGRATION_STATE] = arg -> new ReplicaFragmentMigrationState();
constructors[MIGRATION] = arg -> new MigrationOperation();
constructors[MIGRATION_REQUEST] = arg -> new MigrationRequestOperation();
constructors[NON_FRAGMENTED_SERVICE_NAMESPACE] = arg -> NonFragmentedServiceNamespace.INSTANCE;
constructors[PARTITION_REPLICA] = arg -> new PartitionReplica();
constructors[PUBLISH_COMPLETED_MIGRATIONS] = arg -> new PublishCompletedMigrationsOperation();
constructors[PARTITION_STATE_CHECK_OP] = arg -> new PartitionStateCheckOperation();
constructors[REPLICA_MIGRATION_EVENT] = arg -> new ReplicaMigrationEventImpl();
constructors[MIGRATION_EVENT] = arg -> new MigrationStateImpl();
constructors[PARTITION_LOST_EVENT] = arg -> new PartitionLostEventImpl();
constructors[REPLICA_SYNC_REQUEST_OFFLOADABLE] = arg -> new PartitionReplicaSyncRequestOffloadable();
return new ArrayDataSerializableFactory(constructors);
}
use of com.hazelcast.internal.partition.PartitionRuntimeState in project hazelcast by hazelcast.
the class InternalPartitionServiceImpl method sendPartitionRuntimeState.
void sendPartitionRuntimeState(Address target) {
if (!isLocalMemberMaster()) {
return;
}
assert partitionStateManager.isInitialized();
PartitionRuntimeState partitionState = createPartitionStateInternal();
assert partitionState != null;
if (logger.isFineEnabled()) {
logger.fine("Sending partition state, stamp: " + partitionState.getStamp() + ", to " + target);
}
OperationService operationService = nodeEngine.getOperationService();
PartitionStateOperation op = new PartitionStateOperation(partitionState, true);
operationService.invokeOnTarget(SERVICE_NAME, op, target);
}
use of com.hazelcast.internal.partition.PartitionRuntimeState in project hazelcast by hazelcast.
the class InternalPartitionServiceImpl method triggerMasterToAssignPartitions.
/**
* Sends a {@link AssignPartitions} to the master to assign partitions.
*/
private void triggerMasterToAssignPartitions() {
if (!shouldTriggerMasterToAssignPartitions()) {
return;
}
ClusterServiceImpl clusterService = node.getClusterService();
ClusterState clusterState = clusterService.getClusterState();
if (!clusterState.isMigrationAllowed()) {
logger.warning("Partitions can't be assigned since cluster-state=" + clusterState);
return;
}
final Address masterAddress = latestMaster;
if (masterAddress == null || masterAddress.equals(node.getThisAddress())) {
return;
}
if (masterTriggered.compareAndSet(false, true)) {
OperationServiceImpl operationService = nodeEngine.getOperationService();
InvocationFuture<PartitionRuntimeState> future = operationService.invokeOnTarget(SERVICE_NAME, new AssignPartitions(), masterAddress);
future.whenCompleteAsync((partitionState, throwable) -> {
if (throwable == null) {
resetMasterTriggeredFlag();
if (partitionState != null) {
partitionState.setMaster(masterAddress);
processPartitionRuntimeState(partitionState);
}
} else {
resetMasterTriggeredFlag();
logger.severe(throwable);
}
});
masterTrigger.executeWithDelay();
}
}
use of com.hazelcast.internal.partition.PartitionRuntimeState in project hazelcast by hazelcast.
the class InternalPartitionServiceImpl method createPartitionStateInternal.
/**
* Returns a copy of the partition table or {@code null} if not initialized. This method will acquire the partition service
* lock.
*/
public PartitionRuntimeState createPartitionStateInternal() {
lock.lock();
try {
if (!partitionStateManager.isInitialized()) {
return null;
}
List<MigrationInfo> completedMigrations = migrationManager.getCompletedMigrationsCopy();
InternalPartition[] partitions = partitionStateManager.getPartitions();
PartitionRuntimeState state;
long stamp = partitionStateManager.getStamp();
assert calculateStamp(partitions) == stamp : "Invalid partition stamp! Expected: " + calculateStamp(partitions) + ", Actual: " + stamp;
state = new PartitionRuntimeState(partitions, completedMigrations, stamp);
// Create copy of active migrations set.
// Because original set can be updated concurrently behind the scenes.
Collection<MigrationInfo> activeMigrations = new ArrayList<>(migrationManager.getActiveMigrations());
state.setActiveMigrations(activeMigrations);
return state;
} finally {
lock.unlock();
}
}
use of com.hazelcast.internal.partition.PartitionRuntimeState in project hazelcast by hazelcast.
the class InternalPartitionServiceImpl method syncPartitionRuntimeState.
@SuppressWarnings("checkstyle:npathcomplexity")
boolean syncPartitionRuntimeState() {
if (!partitionStateManager.isInitialized()) {
// do not send partition state until initialized!
return false;
}
if (!node.isMaster()) {
return false;
}
PartitionRuntimeState partitionState = createPartitionStateInternal();
if (partitionState == null) {
return false;
}
if (logger.isFineEnabled()) {
logger.fine("Sync'ing partition state, version: " + partitionState.getVersion());
}
OperationService operationService = nodeEngine.getOperationService();
Collection<MemberImpl> members = node.clusterService.getMemberImpls();
List<Future<Boolean>> calls = firePartitionStateOperation(members, partitionState, operationService);
Collection<Boolean> results = returnWithDeadline(calls, PTABLE_SYNC_TIMEOUT_SECONDS, TimeUnit.SECONDS, partitionStateSyncTimeoutHandler);
if (calls.size() != results.size()) {
return false;
}
for (Boolean result : results) {
if (!result) {
if (logger.isFineEnabled()) {
logger.fine("Partition state, version: " + partitionState.getVersion() + " sync failed to one of the members!");
}
return false;
}
}
return true;
}
Aggregations