use of com.hazelcast.internal.partition.ChunkSupplier 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.partition.ChunkSupplier 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);
}
Aggregations