package org.ovirt.engine.core.bll;
import java.util.Collections;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.locks.LockingGroup;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.utils.lock.EngineLock;
import org.ovirt.engine.core.utils.lock.LockManager;
import org.slf4j.Logger;
@Singleton
public class HostLocking {
@Inject
private LockManager lockManager;
public EngineLock acquireMonitorLock(VDS host, String lockReleaseMessage, Logger log) {
Guid hostId = host.getId();
Map<String, Pair<String, String>> exclusiveLocks =
Collections.singletonMap(hostId.toString(), new Pair<>(LockingGroup.VDS_INIT.name(), ""));
String closingMessage = calculateClosingMessage(lockReleaseMessage, host);
EngineLock monitoringLock = new HostEngineLock(exclusiveLocks, null, closingMessage, log);
log.info("Before acquiring lock in order to prevent monitoring for host '{}' from data-center '{}'",
host.getName(),
host.getStoragePoolName());
lockManager.acquireLockWait(monitoringLock);
log.info("Lock acquired, from now a monitoring of host will be skipped for host '{}' from data-center '{}'",
host.getName(),
host.getStoragePoolName());
return monitoringLock;
}
private static String calculateClosingMessage(String commandName, VDS host) {
return String.format("%s finished. Lock released. Monitoring can run now for host '%s' from data-center '%s'",
commandName,
host.getName(),
host.getStoragePoolName());
}
public Map<String, Pair<String, String>> getSetupNetworksLock(Guid hostId) {
return Collections.singletonMap(LockingGroup.HOST_NETWORK.name() + hostId.toString(),
LockMessagesMatchUtil.makeLockingPair(LockingGroup.HOST_NETWORK,
EngineMessage.ACTION_TYPE_FAILED_SETUP_NETWORKS_OR_REFRESH_IN_PROGRESS));
}
private static class HostEngineLock extends EngineLock implements AutoCloseable {
public final String closingMessage;
private final Logger log;
public HostEngineLock(Map<String, Pair<String, String>> exclusiveLocks,
Map<String, Pair<String, String>> sharedLocks, String closingMessage, Logger log) {
super(exclusiveLocks, sharedLocks);
this.closingMessage = closingMessage;
this.log = log;
}
@Override
public void close() {
super.close();
log.info(closingMessage);
}
}
}