
com.hazelcast.internal.partition.impl.AbstractPartitionPrimaryReplicaAntiEntropyTask Maven / Gradle / Ivy
The newest version!
/*
* Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hazelcast.internal.partition.impl;
import com.hazelcast.internal.cluster.ClusterService;
import com.hazelcast.internal.partition.FragmentedMigrationAwareService;
import com.hazelcast.internal.partition.NonFragmentedServiceNamespace;
import com.hazelcast.internal.partition.PartitionReplica;
import com.hazelcast.internal.partition.PartitionReplicationEvent;
import com.hazelcast.internal.partition.operation.PartitionBackupReplicaAntiEntropyOperation;
import com.hazelcast.internal.services.ServiceNamespace;
import com.hazelcast.logging.ILogger;
import com.hazelcast.spi.impl.NodeEngine;
import com.hazelcast.spi.impl.PartitionSpecificRunnable;
import com.hazelcast.spi.impl.executionservice.ExecutionService;
import com.hazelcast.spi.impl.operationservice.Operation;
import com.hazelcast.spi.impl.operationservice.OperationService;
import com.hazelcast.spi.impl.operationservice.UrgentSystemOperation;
import java.util.Collection;
import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.function.BiConsumer;
import static com.hazelcast.internal.partition.IPartitionService.SERVICE_NAME;
public abstract class AbstractPartitionPrimaryReplicaAntiEntropyTask
implements PartitionSpecificRunnable, UrgentSystemOperation {
private static final int OPERATION_TRY_COUNT = 10;
private static final int OPERATION_TRY_PAUSE_MILLIS = 250;
protected final NodeEngine nodeEngine;
protected final InternalPartitionServiceImpl partitionService;
protected final int partitionId;
public AbstractPartitionPrimaryReplicaAntiEntropyTask(NodeEngine nodeEngine, int partitionId) {
this.nodeEngine = nodeEngine;
this.partitionService = (InternalPartitionServiceImpl) nodeEngine.getPartitionService();
this.partitionId = partitionId;
}
@Override
public int getPartitionId() {
return partitionId;
}
// works only on primary. backups are retained
// in PartitionBackupReplicaAntiEntropyTask
final Collection retainAndGetNamespaces() {
PartitionReplicationEvent event = new PartitionReplicationEvent(null, partitionId, 0);
Collection services
= nodeEngine.getServices(FragmentedMigrationAwareService.class);
Collection namespaces = new HashSet<>();
for (FragmentedMigrationAwareService service : services) {
Collection serviceNamespaces = service.getAllServiceNamespaces(event);
if (serviceNamespaces != null) {
namespaces.addAll(serviceNamespaces);
}
}
namespaces.add(NonFragmentedServiceNamespace.INSTANCE);
PartitionReplicaManager replicaManager = partitionService.getReplicaManager();
replicaManager.retainNamespaces(partitionId, namespaces);
ILogger logger = nodeEngine.getLogger(getClass());
if (logger.isFinestEnabled()) {
logger.finest("Retained namespaces for partitionId=" + partitionId + ". Service namespaces="
+ namespaces + ", retained namespaces=" + replicaManager.getNamespaces(partitionId));
}
return replicaManager.getNamespaces(partitionId);
}
final void invokePartitionBackupReplicaAntiEntropyOp(int replicaIndex, PartitionReplica target,
Collection namespaces,
BiConsumer
© 2015 - 2025 Weber Informatics LLC | Privacy Policy