package org.ovirt.engine.core.vdsbroker.vdsbroker;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.common.vdscommands.VdsAndPoolIDVDSParametersBase;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.vdsbroker.irsbroker.IrsProperties;
import org.ovirt.engine.core.vdsbroker.irsbroker.StoragePoolInfo;
public class IsoPrefixVDSCommand<T extends VdsAndPoolIDVDSParametersBase> extends VdsBrokerCommand<T> {
private static final ConcurrentHashMap<Guid, String> storagePoolIdToIsoPrefix = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<Guid, Object> storagePoolIdToLockObj = new ConcurrentHashMap<>();
public IsoPrefixVDSCommand(T parameters) {
super(parameters);
}
@Override
protected void executeVdsBrokerCommand() {
getVDSReturnValue().setReturnValue(getIsoPrefix());
}
private String getIsoPrefix() {
Guid storagePoolId = getParameters().getStoragePoolId();
String cachedIsoPrefix = storagePoolIdToIsoPrefix.get(storagePoolId);
if (cachedIsoPrefix != null) {
return cachedIsoPrefix;
}
synchronized(getLockObjForStoragePool(storagePoolId)) {
cachedIsoPrefix = storagePoolIdToIsoPrefix.get(storagePoolId);
if (cachedIsoPrefix != null) {
return cachedIsoPrefix;
}
StoragePoolInfo retVal;
try {
retVal = getBroker().getStoragePoolInfo(storagePoolId.toString());
} catch (Exception ex) {
log.error("IsoPrefix Failed to get storage pool info (vds '{}', pool '{}').",
getParameters().getVdsId(), storagePoolId);
return StringUtils.EMPTY;
}
String isoPrefix = getIsoPrefixFromStoragePoolInfoReturnValue(retVal);
if (!isoPrefix.isEmpty()) {
storagePoolIdToIsoPrefix.put(storagePoolId, isoPrefix);
}
return isoPrefix;
}
}
private String getIsoPrefixFromStoragePoolInfoReturnValue(StoragePoolInfo retVal) {
return retVal.storagePoolInfo.containsKey(IrsProperties.isoPrefix) ?
retVal.storagePoolInfo.get(IrsProperties.isoPrefix).toString()
: StringUtils.EMPTY;
}
static void clearCachedIsoPrefix(Guid storagePoolId) {
storagePoolIdToIsoPrefix.remove(storagePoolId);
}
private static Object getLockObjForStoragePool(Guid storagePoolId) {
Object result = storagePoolIdToLockObj.get(storagePoolId);
if (result == null) {
final Object value = new Object();
result = storagePoolIdToLockObj.putIfAbsent(storagePoolId, value);
if (result == null) {
result = value;
}
}
return result;
}
}