use of com.emc.storageos.volumecontroller.impl.smis.srdf.collectors.ErrorOnEmptyFilter in project coprhd-controller by CoprHD.
the class SRDFOperations method performSwap.
public void performSwap(StorageSystem targetSystem, Volume target, TaskCompleter completer) {
log.info("START performSwap");
checkTargetHasParentOrFail(target);
ServiceError error = null;
try {
Volume sourceVolume = getSourceVolume(target);
StorageSystem activeSystem = findProviderWithGroup(target);
Collection<CIMObjectPath> syncPaths = utils.getSynchronizations(activeSystem, sourceVolume, target, false);
CIMInstance firstSync = getInstance(syncPaths.iterator().next(), activeSystem);
AbstractSRDFOperationContextFactory ctxFactory = getContextFactory(activeSystem);
SRDFOperationContext ctx = null;
if (!isFailedOver(firstSync)) {
log.info("Failing over link");
ctx = ctxFactory.build(SRDFOperation.FAIL_OVER, target);
ctx.perform();
}
ctx = ctxFactory.build(SRDFOperation.SWAP, target);
ctx.perform();
log.info("Swapping Volume Pair {} succeeded ", sourceVolume.getId());
log.info("Changing R1 and R2 characteristics after swap");
LinkStatus successLinkStatus = LinkStatus.SWAPPED;
if (LinkStatus.SWAPPED.name().equalsIgnoreCase(target.getLinkStatus())) {
// Already swapped. Move back to CONSISTENT or IN_SYNC.
if (Mode.ASYNCHRONOUS.name().equalsIgnoreCase(target.getSrdfCopyMode())) {
successLinkStatus = LinkStatus.CONSISTENT;
} else {
successLinkStatus = LinkStatus.IN_SYNC;
}
}
changeSRDFVolumeBehaviors(sourceVolume, target, dbClient, successLinkStatus.toString());
log.info("Updating RemoteDirectorGroup after swap");
changeRemoteDirectorGroup(target.getSrdfGroup());
StorageSystem sourceSystemAfterSwap = dbClient.queryObject(StorageSystem.class, target.getStorageController());
// we run all SRDF operations using RDF group's source provider.
// target provider needs to be refreshed to perform any snap/clone operations following swap.
callEMCRefresh(helper, sourceSystemAfterSwap);
// Refresh our view of the target, since it is now the source volume.
target = dbClient.queryObject(Volume.class, sourceVolume.getId());
boolean success = false;
int attempts = 1;
while (!success && attempts <= RESUME_AFTER_SWAP_MAX_ATTEMPTS) {
try {
// Use new context to perform resume operation.
AbstractSRDFOperationContextFactory establishFactory = getContextFactory(activeSystem);
ctx = establishFactory.build(SRDFOperation.ESTABLISH, target);
ctx.appendFilters(new ErrorOnEmptyFilter());
ctx.perform();
success = true;
} catch (WBEMException | NoSynchronizationsFoundException e) {
log.warn(format(RESUME_AFTER_SWAP_EXCEPTION_MSG, attempts, RESUME_AFTER_SWAP_MAX_ATTEMPTS), e);
attempts++;
Thread.sleep(RESUME_AFTER_SWAP_SLEEP);
}
}
if (!success) {
URI sourceId = target.getSrdfParent().getURI();
String msg = format("Failed to resume SRDF link after swap for source: %s", sourceId);
log.error(msg);
error = SmisException.errors.establishAfterSwapFailure(sourceId.toString(), target.getId().toString());
}
} catch (RemoteGroupAssociationNotFoundException e) {
log.warn("No remote group association found for {}. It may have already been removed.", target.getId());
} catch (Exception e) {
log.error("Failed to swap srdf link {}", target.getSrdfParent().getURI(), e);
error = getServiceError(e);
} finally {
if (error == null) {
completer.ready(dbClient);
} else {
completer.error(dbClient, error);
}
}
}
Aggregations