use of com.hazelcast.internal.partition.impl.InternalPartitionImpl in project hazelcast by hazelcast.
the class ReplicaSyncResponse method run.
@Override
public void run() throws Exception {
NodeEngine nodeEngine = getNodeEngine();
InternalPartitionServiceImpl partitionService = getService();
int partitionId = getPartitionId();
int replicaIndex = getReplicaIndex();
PartitionStateManager partitionStateManager = partitionService.getPartitionStateManager();
InternalPartitionImpl partition = partitionStateManager.getPartitionImpl(partitionId);
Address thisAddress = nodeEngine.getThisAddress();
int currentReplicaIndex = partition.getReplicaIndex(thisAddress);
try {
if (replicaIndex == currentReplicaIndex) {
executeTasks();
} else {
nodeNotOwnsBackup(partition);
}
if (tasks != null) {
tasks.clear();
}
} finally {
postProcessReplicaSync(partitionService, currentReplicaIndex);
}
}
use of com.hazelcast.internal.partition.impl.InternalPartitionImpl in project hazelcast by hazelcast.
the class ReplicaSyncRetryResponse method run.
@Override
public void run() throws Exception {
final InternalPartitionServiceImpl partitionService = getService();
final int partitionId = getPartitionId();
final int replicaIndex = getReplicaIndex();
partitionService.getReplicaManager().clearReplicaSyncRequest(partitionId, replicaIndex);
PartitionStateManager partitionStateManager = partitionService.getPartitionStateManager();
InternalPartitionImpl partition = partitionStateManager.getPartitionImpl(partitionId);
Address thisAddress = getNodeEngine().getThisAddress();
ILogger logger = getLogger();
int currentReplicaIndex = partition.getReplicaIndex(thisAddress);
if (currentReplicaIndex > 0) {
if (logger.isFinestEnabled()) {
logger.finest("Retrying replica sync request for partitionId=" + partitionId + ", initial-replicaIndex=" + replicaIndex + ", current-replicaIndex=" + currentReplicaIndex);
}
partitionService.getReplicaManager().triggerPartitionReplicaSync(partitionId, currentReplicaIndex, InternalPartitionService.REPLICA_SYNC_RETRY_DELAY);
} else if (logger.isFinestEnabled()) {
logger.finest("No need to retry replica sync request for partitionId=" + partitionId + ", initial-replicaIndex=" + replicaIndex + ", current-replicaIndex=" + currentReplicaIndex);
}
}
use of com.hazelcast.internal.partition.impl.InternalPartitionImpl in project hazelcast by hazelcast.
the class ReplicaSyncRequest method preCheckReplicaSync.
/** Checks if we can continue with the replication or not. Can send a retry or empty response to the replica in some cases */
private boolean preCheckReplicaSync(NodeEngineImpl nodeEngine, int partitionId, int replicaIndex) throws IOException {
InternalPartitionServiceImpl partitionService = (InternalPartitionServiceImpl) nodeEngine.getPartitionService();
PartitionStateManager partitionStateManager = partitionService.getPartitionStateManager();
InternalPartitionImpl partition = partitionStateManager.getPartitionImpl(partitionId);
Address owner = partition.getOwnerOrNull();
long[] replicaVersions = partitionService.getPartitionReplicaVersions(partitionId);
long currentVersion = replicaVersions[replicaIndex - 1];
ILogger logger = getLogger();
if (!nodeEngine.getThisAddress().equals(owner)) {
if (logger.isFinestEnabled()) {
logger.finest("Wrong target! " + toString() + " cannot be processed! Target should be: " + owner);
}
sendRetryResponse();
return false;
}
if (currentVersion == 0) {
if (logger.isFinestEnabled()) {
logger.finest("Current replicaVersion=0, sending empty response for partitionId=" + getPartitionId() + ", replicaIndex=" + getReplicaIndex() + ", replicaVersions=" + Arrays.toString(replicaVersions));
}
sendEmptyResponse();
return false;
}
if (!partitionService.getReplicaManager().tryToAcquireReplicaSyncPermit()) {
if (logger.isFinestEnabled()) {
logger.finest("Max parallel replication process limit exceeded! Could not run replica sync -> " + toString());
}
sendRetryResponse();
return false;
}
return true;
}
use of com.hazelcast.internal.partition.impl.InternalPartitionImpl in project hazelcast by hazelcast.
the class PromotionCommitOperation method filterAlreadyAppliedPromotions.
private void filterAlreadyAppliedPromotions() {
if (getNodeEngine().getClusterService().getClusterVersion().isUnknownOrLessOrEqual(Versions.V4_0)) {
return;
}
ILogger logger = getLogger();
InternalPartitionServiceImpl partitionService = getService();
PartitionStateManager stateManager = partitionService.getPartitionStateManager();
Iterator<MigrationInfo> iter = promotions.iterator();
while (iter.hasNext()) {
MigrationInfo promotion = iter.next();
InternalPartitionImpl partition = stateManager.getPartitionImpl(promotion.getPartitionId());
if (partition.version() >= promotion.getFinalPartitionVersion()) {
logger.fine("Already applied promotion commit. -> " + promotion);
iter.remove();
}
}
}
use of com.hazelcast.internal.partition.impl.InternalPartitionImpl in project hazelcast by hazelcast.
the class PartitionRuntimeState method getPartitions.
public InternalPartition[] getPartitions() {
int length = encodedPartitionTable.length;
InternalPartition[] result = new InternalPartition[length];
for (int partitionId = 0; partitionId < length; partitionId++) {
int[] addressIndexes = encodedPartitionTable[partitionId];
PartitionReplica[] replicas = new PartitionReplica[MAX_REPLICA_COUNT];
for (int replicaIndex = 0; replicaIndex < addressIndexes.length; replicaIndex++) {
int index = addressIndexes[replicaIndex];
if (index != -1) {
PartitionReplica replica = allReplicas[index];
assert replica != null;
replicas[replicaIndex] = replica;
}
}
result[partitionId] = new InternalPartitionImpl(partitionId, null, replicas, versions[partitionId], null);
}
return result;
}
Aggregations