Search in sources :

Example 6 with ChunkSupplier

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);
    }
}
Also used : ChunkSupplier(com.hazelcast.internal.partition.ChunkSupplier) InternalPartitionServiceImpl(com.hazelcast.internal.partition.impl.InternalPartitionServiceImpl) NonFragmentedServiceNamespace(com.hazelcast.internal.partition.NonFragmentedServiceNamespace) ServiceNamespace(com.hazelcast.internal.services.ServiceNamespace) Operation(com.hazelcast.spi.impl.operationservice.Operation) PartitionReplicationEvent(com.hazelcast.internal.partition.PartitionReplicationEvent)

Example 7 with ChunkSupplier

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);
}
Also used : ChunkSupplier(com.hazelcast.internal.partition.ChunkSupplier) NonFragmentedServiceNamespace(com.hazelcast.internal.partition.NonFragmentedServiceNamespace) ServiceNamespace(com.hazelcast.internal.services.ServiceNamespace) Nullable(javax.annotation.Nullable)

Aggregations

ChunkSupplier (com.hazelcast.internal.partition.ChunkSupplier)7 NonFragmentedServiceNamespace (com.hazelcast.internal.partition.NonFragmentedServiceNamespace)4 ServiceNamespace (com.hazelcast.internal.services.ServiceNamespace)3 ChunkedMigrationAwareService (com.hazelcast.internal.partition.ChunkedMigrationAwareService)2 PartitionReplicationEvent (com.hazelcast.internal.partition.PartitionReplicationEvent)2 InternalPartitionServiceImpl (com.hazelcast.internal.partition.impl.InternalPartitionServiceImpl)2 ILogger (com.hazelcast.logging.ILogger)2 NodeEngine (com.hazelcast.spi.impl.NodeEngine)2 Operation (com.hazelcast.spi.impl.operationservice.Operation)2 Nonnull (javax.annotation.Nonnull)2 MigrationCycleOperation (com.hazelcast.internal.partition.MigrationCycleOperation)1 OffloadedReplicationPreparation (com.hazelcast.internal.partition.OffloadedReplicationPreparation)1 PartitionAwareOperation (com.hazelcast.spi.impl.operationservice.PartitionAwareOperation)1 CancellationException (java.util.concurrent.CancellationException)1 ExecutionException (java.util.concurrent.ExecutionException)1 Nullable (javax.annotation.Nullable)1