use of com.hazelcast.internal.services.ServiceNamespace in project hazelcast by hazelcast.
the class PartitionReplicaSyncRequestOffloadable method sendOperationsForNamespaces.
/**
* Send responses for first number of {@code permits} namespaces and remove them from the list.
*/
protected void sendOperationsForNamespaces(int permits) {
InternalPartitionServiceImpl partitionService = getService();
try {
PartitionReplicationEvent event = new PartitionReplicationEvent(getCallerAddress(), partitionId, getReplicaIndex());
// It is only safe to read replica versions before
// preparing replication operations. Reasoning: even
// though partition is already marked as migrating,
// operations may be already queued in partition thread.
// If we read replica versions after replication operation
// is prepared, we may read updated replica versions
// but replication op may have stale data -> future
// backup sync checks will not detect the stale data.
readReplicaVersions();
final Iterator<ServiceNamespace> iterator = namespaces.iterator();
for (int i = 0; i < permits; i++) {
ServiceNamespace namespace = iterator.next();
Collection<Operation> operations = Collections.emptyList();
Collection<ChunkSupplier> chunkSuppliers = Collections.emptyList();
if (NonFragmentedServiceNamespace.INSTANCE.equals(namespace)) {
operations = createNonFragmentedReplicationOperations(event);
} else {
chunkSuppliers = isChunkedMigrationEnabled() ? collectChunkSuppliers(event, namespace) : chunkSuppliers;
if (isEmpty(chunkSuppliers)) {
operations = createFragmentReplicationOperationsOffload(event, namespace);
}
}
// operations failed due to interruption
if (isNotEmpty(operations) || isNotEmpty(chunkSuppliers)) {
// TODO why using new CopyOnWriteArrayList<>(chunkSuppliers)?
sendOperationsOnPartitionThread(new CopyOnWriteArrayList<>(operations), new CopyOnWriteArrayList<>(chunkSuppliers), namespace);
while (hasRemainingChunksToSend(chunkSuppliers)) {
sendOperationsOnPartitionThread(new CopyOnWriteArrayList<>(operations), new CopyOnWriteArrayList<>(chunkSuppliers), namespace);
}
iterator.remove();
}
}
} finally {
partitionService.getReplicaManager().releaseReplicaSyncPermits(permits);
}
}
use of com.hazelcast.internal.services.ServiceNamespace in project hazelcast by hazelcast.
the class MigrationRequestOperation method createNextChunkedState.
@Nullable
private ReplicaFragmentMigrationState createNextChunkedState() {
// if no current namespace exists, this is
// the start of migration process, just return
ServiceNamespace currentNS = namespacesContext.current();
if (currentNS == null) {
return null;
}
Collection<ChunkSupplier> chunkSuppliers = namespaceToSuppliers.get(currentNS);
if (chunkSuppliers == null) {
// migration, hence no chunk supplier.
return null;
}
// remove finished suppliers for currentNS
Iterator<ChunkSupplier> iterator = chunkSuppliers.iterator();
while (iterator.hasNext()) {
ChunkSupplier chunkSupplier = iterator.next();
if (!chunkSupplier.hasNext()) {
iterator.remove();
}
}
if (isEmpty(chunkSuppliers)) {
namespaceToSuppliers.remove(currentNS);
return null;
}
// we still have unfinished suppliers
return createReplicaFragmentMigrationState(singleton(currentNS), emptyList(), chunkSuppliers, maxTotalChunkedDataInBytes);
}
use of com.hazelcast.internal.services.ServiceNamespace in project hazelcast by hazelcast.
the class MigrationRequestOperation method invokeMigrationOperation.
/**
* Invokes the {@link MigrationOperation} on the migration destination.
*/
private void invokeMigrationOperation(ReplicaFragmentMigrationState migrationState, boolean firstFragment) {
assert ThreadUtil.isRunningOnPartitionThread() : "Migration operations must be invoked from a partition thread";
boolean lastFragment = !namespacesContext.hasNext();
Operation operation = new MigrationOperation(migrationInfo, firstFragment ? completedMigrations : Collections.emptyList(), partitionStateVersion, migrationState, firstFragment, lastFragment);
ILogger logger = getLogger();
if (logger.isFinestEnabled()) {
Set<ServiceNamespace> namespaces = migrationState != null ? migrationState.getNamespaceVersionMap().keySet() : emptySet();
logger.finest("Invoking MigrationOperation for namespaces " + namespaces + " and " + migrationInfo + ", firstFragment: " + firstFragment + ", lastFragment: " + lastFragment);
}
NodeEngine nodeEngine = getNodeEngine();
InternalPartitionServiceImpl partitionService = getService();
ExecutorService asyncExecutor = getNodeEngine().getExecutionService().getExecutor(ExecutionService.ASYNC_EXECUTOR);
Address target = migrationInfo.getDestinationAddress();
nodeEngine.getOperationService().createInvocationBuilder(InternalPartitionService.SERVICE_NAME, operation, target).setResultDeserialized(true).setCallTimeout(partitionService.getPartitionMigrationTimeout()).invoke().whenCompleteAsync(new MigrationCallback(), asyncExecutor);
}
use of com.hazelcast.internal.services.ServiceNamespace in project hazelcast by hazelcast.
the class MigrationRequestOperation method createReplicaFragmentMigrationState.
private ReplicaFragmentMigrationState createReplicaFragmentMigrationState(Collection<ServiceNamespace> namespaces, Collection<Operation> operations, Collection<ChunkSupplier> suppliers, int maxTotalChunkedDataInBytes) {
InternalPartitionService partitionService = getService();
PartitionReplicaVersionManager versionManager = partitionService.getPartitionReplicaVersionManager();
Map<ServiceNamespace, long[]> versions = new HashMap<>(namespaces.size());
for (ServiceNamespace namespace : namespaces) {
long[] v = versionManager.getPartitionReplicaVersions(getPartitionId(), namespace);
versions.put(namespace, v);
}
return new ReplicaFragmentMigrationState(versions, operations, suppliers, chunkedMigrationEnabled, maxTotalChunkedDataInBytes, getLogger(), getPartitionId());
}
use of com.hazelcast.internal.services.ServiceNamespace in project hazelcast by hazelcast.
the class PartitionReplicaSyncRetryResponse method run.
@Override
public void run() throws Exception {
final InternalPartitionServiceImpl partitionService = getService();
final int partitionId = getPartitionId();
final int replicaIndex = getReplicaIndex();
PartitionReplicaManager replicaManager = partitionService.getReplicaManager();
for (ServiceNamespace namespace : namespaces) {
replicaManager.clearReplicaSyncRequest(partitionId, namespace, replicaIndex);
}
}
Aggregations