/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.geo.vdccontroller.impl;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.coordinator.common.Service;
import com.emc.storageos.db.client.impl.GlobalLockImpl;
import com.emc.storageos.db.client.model.GlobalLock;
import com.emc.storageos.db.common.VdcUtil;
import com.emc.storageos.security.geo.exceptions.GeoException;
import com.emc.storageos.security.geo.GeoServiceClient;
/**
* @author cgarber
*
*/
public class VdcOperationLockHelper {
private final static Logger log = LoggerFactory.getLogger(VdcOperationLockHelper.class);
private final static String GLOBAL_LOCK = GeoServiceClient.VDCOP_LOCK_NAME;
private final static long GLOBAL_LOCK_TIMEOUT = GeoServiceClient.VDCOP_LOCK_TIMEOUT;
private InternalDbClient dbClient;
private Service serviceInfo;
public VdcOperationLockHelper() {
}
public void setDbClient(InternalDbClient _dbClient) {
this.dbClient = _dbClient;
}
public void setService(Service serviceInfo) {
this.serviceInfo = serviceInfo;
}
public void acquire(String vdcShortId) {
boolean lockAcquired = false;
String lockErrMsg = null;
GlobalLockImpl glock = null;
try {
log.info("try to acquire lock for vdc operation {}", vdcShortId);
glock = new GlobalLockImpl(dbClient, GLOBAL_LOCK,
GlobalLock.GL_Mode.GL_NodeSvcShared_MODE, GLOBAL_LOCK_TIMEOUT,
VdcUtil.getLocalShortVdcId());
if (glock.acquire(serviceInfo.getId())) {
lockAcquired = true;
} else {
lockErrMsg = glock.getErrorMessage();
if (StringUtils.isEmpty(lockErrMsg)) {
lockErrMsg = "Could not acquire global lock for vdc operation";
}
}
} catch (Exception e) {
if (glock == null || StringUtils.isEmpty(glock.getErrorMessage())) {
lockErrMsg = "Could not acquire global lock for vdc operation";
}
else {
lockErrMsg = glock.getErrorMessage();
}
log.error(e.getMessage(), e);
}
if (!lockAcquired) {
throw GeoException.fatals.acquireLockFail(vdcShortId, lockErrMsg);
}
}
public void release(String vdcShortId) {
try {
log.info("try to release lock for vdc operation {}", vdcShortId);
GlobalLockImpl glock = new GlobalLockImpl(dbClient, GLOBAL_LOCK,
GlobalLock.GL_Mode.GL_NodeSvcShared_MODE, GLOBAL_LOCK_TIMEOUT,
VdcUtil.getLocalShortVdcId());
glock.release(serviceInfo.getId(), true);
} catch (Exception e) {
// don't fail if we can't release the lock; it'll eventually time out
log.error(e.getMessage(), e);
}
}
}