@Override public void run() throws Exception { if (validationFailure != null) { onExecutionFailure(validationFailure); return; } ensureBackupOperationInitialized(); backupOp.beforeRun(); backupOp.run(); backupOp.afterRun(); NodeEngineImpl nodeEngine = (NodeEngineImpl) getNodeEngine(); PartitionReplicaVersionManager versionManager = nodeEngine.getPartitionService().getPartitionReplicaVersionManager(); versionManager.updatePartitionReplicaVersions(getPartitionId(), namespace, replicaVersions, getReplicaIndex()); }
public static String toOperationDesc(Operation op) { Class<? extends Operation> operationClass = op.getClass(); if (PartitionIteratingOperation.class.isAssignableFrom(operationClass)) { PartitionIteratingOperation partitionIteratingOperation = (PartitionIteratingOperation) op; OperationFactory operationFactory = partitionIteratingOperation.getOperationFactory(); String desc = DESCRIPTORS.get(operationFactory.getClass().getName()); if (desc == null) { desc = PartitionIteratingOperation.class.getSimpleName() + "(" + operationFactory.getClass().getName() + ")"; DESCRIPTORS.put(operationFactory.getClass().getName(), desc); } return desc; } else if (Backup.class.isAssignableFrom(operationClass)) { Backup backup = (Backup) op; Operation backupOperation = backup.getBackupOp(); String desc = DESCRIPTORS.get(backupOperation.getClass().getName()); if (desc == null) { desc = Backup.class.getSimpleName() + "(" + backup.getBackupOp().getClass().getName() + ")"; DESCRIPTORS.put(backupOperation.getClass().getName(), desc); } return desc; } else { return operationClass.getName(); } } }
private void ensureBackupOperationInitialized() { if (!backupOperationInitialized) { backupOperationInitialized = true; backupOp.setNodeEngine(getNodeEngine()); backupOp.setPartitionId(getPartitionId()); backupOp.setReplicaIndex(getReplicaIndex()); backupOp.setCallerUuid(getCallerUuid()); OperationAccessor.setCallerAddress(backupOp, getCallerAddress()); OperationAccessor.setInvocationTime(backupOp, Clock.currentTimeMillis()); backupOp.setOperationResponseHandler(createEmptyResponseHandler()); } }
@Override public void logError(Throwable e) { if (backupOp != null) { // Ensure that backup operation is initialized. // If there is an exception before `run` (for example caller is not valid anymore), // backup operation will not be initialized. ensureBackupOperationInitialized(); backupOp.logError(e); } else { ReplicaErrorLogger.log(e, getLogger()); } }
@Override public void beforeRun() { NodeEngineImpl nodeEngine = (NodeEngineImpl) getNodeEngine(); int partitionId = getPartitionId(); InternalPartitionService partitionService = nodeEngine.getPartitionService(); ILogger logger = getLogger(); ensureBackupOperationInitialized(); PartitionReplicaVersionManager versionManager = partitionService.getPartitionReplicaVersionManager(); namespace = versionManager.getServiceNamespace(backupOp); PartitionReplica owner = partition.getReplica(getReplicaIndex()); if (owner == null || !owner.isIdentical(nodeEngine.getLocalMember())) { validationFailure = new IllegalStateException("Wrong target! " + toString() + " cannot be processed! Target should be: " + owner); if (logger.isFinestEnabled()) { if (versionManager.isPartitionReplicaVersionStale(getPartitionId(), namespace, replicaVersions, getReplicaIndex())) { validationFailure = new IllegalStateException("Ignoring stale backup with namespace: " + namespace + ", versions: " + Arrays.toString(replicaVersions));
@Override public void afterRun() throws Exception { if (validationFailure != null || !sync || getCallId() == 0 || originalCaller == null) { return; } NodeEngineImpl nodeEngine = (NodeEngineImpl) getNodeEngine(); long callId = getCallId(); OperationServiceImpl operationService = (OperationServiceImpl) nodeEngine.getOperationService(); if (nodeEngine.getThisAddress().equals(originalCaller)) { operationService.getBackupHandler().notifyBackupComplete(callId); } else { operationService.getOutboundResponseHandler().sendBackupAck(originalCaller, callId, backupOp.isUrgent()); } }
private static Backup newBackup(BackupAwareOperation backupAwareOp, Object backupOp, long[] replicaVersions, int replicaIndex, boolean respondBack) { Operation op = (Operation) backupAwareOp; Backup backup; if (backupOp instanceof Operation) { backup = new Backup((Operation) backupOp, op.getCallerAddress(), replicaVersions, respondBack); } else if (backupOp instanceof Data) { backup = new Backup((Data) backupOp, op.getCallerAddress(), replicaVersions, respondBack); } else { throw new IllegalArgumentException("Only 'Data' or 'Operation' typed backup operation is supported!"); } backup.setPartitionId(op.getPartitionId()).setReplicaIndex(replicaIndex); if (hasActiveInvocation(op)) { setCallId(backup, op.getCallId()); } return backup; }
return new NormalResponse(); case BACKUP: return new Backup(); case BACKUP_ACK_RESPONSE: return new BackupAckResponse();
@Override public void beforeRun() throws Exception { NodeEngineImpl nodeEngine = (NodeEngineImpl) getNodeEngine(); int partitionId = getPartitionId(); InternalPartitionService partitionService = nodeEngine.getPartitionService(); ILogger logger = getLogger(); Address owner = partition.getReplicaAddress(getReplicaIndex()); ensureBackupOperationInitialized(); PartitionReplicaVersionManager versionManager = partitionService.getPartitionReplicaVersionManager(); namespace = versionManager.getServiceNamespace(backupOp); validationFailure = new IllegalStateException("Wrong target! " + toString() + " cannot be processed! Target should be: " + owner); if (logger.isFinestEnabled()) { if (versionManager.isPartitionReplicaVersionStale(getPartitionId(), namespace, replicaVersions, getReplicaIndex())) { validationFailure = new IllegalStateException("Ignoring stale backup with namespace: " + namespace + ", versions: " + Arrays.toString(replicaVersions));
@Override public void logError(Throwable e) { if (backupOp != null) { // Ensure that backup operation is initialized. // If there is an exception before `run` (for example caller is not valid anymore), // backup operation will not be initialized. ensureBackupOperationInitialized(); backupOp.logError(e); } else { ReplicaErrorLogger.log(e, getLogger()); } }
@Override public void afterRun() throws Exception { if (validationFailure != null || !sync || getCallId() == 0 || originalCaller == null) { return; } NodeEngineImpl nodeEngine = (NodeEngineImpl) getNodeEngine(); long callId = getCallId(); OperationServiceImpl operationService = (OperationServiceImpl) nodeEngine.getOperationService(); if (nodeEngine.getThisAddress().equals(originalCaller)) { operationService.getBackupHandler().notifyBackupComplete(callId); } else { operationService.getOutboundResponseHandler().sendBackupAck(originalCaller, callId, backupOp.isUrgent()); } }
private static Backup newBackup(BackupAwareOperation backupAwareOp, Object backupOp, long[] replicaVersions, int replicaIndex, boolean respondBack) { Operation op = (Operation) backupAwareOp; Backup backup; if (backupOp instanceof Operation) { backup = new Backup((Operation) backupOp, op.getCallerAddress(), replicaVersions, respondBack); } else if (backupOp instanceof Data) { backup = new Backup((Data) backupOp, op.getCallerAddress(), replicaVersions, respondBack); } else { throw new IllegalArgumentException("Only 'Data' or 'Operation' typed backup operation is supported!"); } backup.setPartitionId(op.getPartitionId()).setReplicaIndex(replicaIndex); if (hasActiveInvocation(op)) { setCallId(backup, op.getCallId()); } return backup; }
return new NormalResponse(); case BACKUP: return new Backup(); case BACKUP_ACK_RESPONSE: return new BackupAckResponse();
private void ensureBackupOperationInitialized() { if (!backupOperationInitialized) { backupOperationInitialized = true; backupOp.setNodeEngine(getNodeEngine()); backupOp.setPartitionId(getPartitionId()); backupOp.setReplicaIndex(getReplicaIndex()); backupOp.setCallerUuid(getCallerUuid()); OperationAccessor.setCallerAddress(backupOp, getCallerAddress()); OperationAccessor.setInvocationTime(backupOp, Clock.currentTimeMillis()); backupOp.setOperationResponseHandler(createEmptyResponseHandler()); } }
@Override public void run() throws Exception { if (validationFailure != null) { onExecutionFailure(validationFailure); return; } ensureBackupOperationInitialized(); backupOp.beforeRun(); backupOp.run(); backupOp.afterRun(); NodeEngineImpl nodeEngine = (NodeEngineImpl) getNodeEngine(); PartitionReplicaVersionManager versionManager = nodeEngine.getPartitionService().getPartitionReplicaVersionManager(); versionManager.updatePartitionReplicaVersions(getPartitionId(), namespace, replicaVersions, getReplicaIndex()); }
@Override public void onExecutionFailure(Throwable e) { if (backupOp != null) { try { // Ensure that backup operation is initialized. // If there is an exception before `run` (for example caller is not valid anymore), // backup operation will not be initialized. ensureBackupOperationInitialized(); backupOp.onExecutionFailure(e); } catch (Throwable t) { getLogger().warning("While calling operation.onFailure(). op: " + backupOp, t); } } }
public static String toOperationDesc(Operation op) { Class<? extends Operation> operationClass = op.getClass(); if (PartitionIteratingOperation.class.isAssignableFrom(operationClass)) { PartitionIteratingOperation partitionIteratingOperation = (PartitionIteratingOperation) op; OperationFactory operationFactory = partitionIteratingOperation.getOperationFactory(); String desc = DESCRIPTORS.get(operationFactory.getClass().getName()); if (desc == null) { desc = PartitionIteratingOperation.class.getSimpleName() + "(" + operationFactory.getClass().getName() + ")"; DESCRIPTORS.put(operationFactory.getClass().getName(), desc); } return desc; } else if (Backup.class.isAssignableFrom(operationClass)) { Backup backup = (Backup) op; Operation backupOperation = backup.getBackupOp(); String desc = DESCRIPTORS.get(backupOperation.getClass().getName()); if (desc == null) { desc = Backup.class.getSimpleName() + "(" + backup.getBackupOp().getClass().getName() + ")"; DESCRIPTORS.put(backupOperation.getClass().getName(), desc); } return desc; } else { return operationClass.getName(); } } }
@Override public void onExecutionFailure(Throwable e) { if (backupOp != null) { try { // Ensure that backup operation is initialized. // If there is an exception before `run` (for example caller is not valid anymore), // backup operation will not be initialized. ensureBackupOperationInitialized(); backupOp.onExecutionFailure(e); } catch (Throwable t) { getLogger().warning("While calling operation.onFailure(). op: " + backupOp, t); } } }