use of org.ovirt.engine.core.utils.lock.EngineLock in project ovirt-engine by oVirt.
the class GlusterSyncJob method syncServers.
private void syncServers(Cluster cluster, List<VDS> existingServers, List<GlusterServerInfo> fetchedServers) {
log.debug("Existing servers list returned '{}' comparing with fetched servers '{}'", existingServers, fetchedServers);
boolean serverRemoved = false;
Network glusterNetwork = findGlusterNetwork(cluster.getId());
for (VDS server : existingServers) {
GlusterServerInfo glusterServer = findGlusterServer(server, fetchedServers);
if (isSyncableStatus(server.getStatus())) {
if (glusterServer == null) {
if (cluster.supportsVirtService()) {
// If the cluster supports virt service as well, we should not be removing any servers from it, even
// if they have been removed from the Gluster cluster using the Gluster cli, as they could
// potentially be
// used for running VMs. Will mark this server status as DISCONNECTED instead
log.debug("As cluster '{}' supports virt service as well, server '{}' detected as removed from glusterfs will not be removed from engine", cluster.getName(), server.getHostName());
setNonOperational(server);
continue;
}
log.info("Server '{}' has been removed directly using the gluster CLI. Removing it from engine as well.", server.getName());
logUtil.logServerMessage(server, AuditLogType.GLUSTER_SERVER_REMOVED_FROM_CLI);
try (EngineLock lock = glusterUtil.acquireGlusterLockWait(server.getId())) {
removeServerFromDb(server);
// if last but one server, reset alternate probed address for last server
checkAndResetKnownAddress(existingServers, server);
// remove the server from resource manager
runVdsCommand(VDSCommandType.RemoveVds, new RemoveVdsVDSCommandParameters(server.getId()));
serverRemoved = true;
} catch (Exception e) {
log.error("Error while removing server '{}' from database: {}", server.getName(), e.getMessage());
log.debug("Exception", e);
}
} else if (server.getStatus() == VDSStatus.Up && glusterServer.getStatus() == PeerStatus.DISCONNECTED) {
// check gluster is running, if down then move the host to Non-Operational
VDSReturnValue returnValue = runVdsCommand(VDSCommandType.GlusterServersList, new VdsIdVDSCommandParametersBase(server.getId()));
if (!returnValue.getSucceeded()) {
setNonOperational(server);
}
} else {
// update correct status and check if all interfaces with gluster network have been peer probed.
updateStatusAndpeerProbeOtherIface(glusterNetwork, server, glusterServer);
}
}
}
if (serverRemoved) {
log.info("Servers detached using gluster CLI is removed from engine after inspecting the Gluster servers" + " list returned '{}' - comparing with db servers '{}'", fetchedServers, existingServers);
}
}
use of org.ovirt.engine.core.utils.lock.EngineLock in project ovirt-engine by oVirt.
the class GlusterGeoRepSyncJob method refreshGeoRepSessionStatusForSessions.
private void refreshGeoRepSessionStatusForSessions(final Cluster cluster, List<GlusterGeoRepSession> geoRepSessions) {
if (CollectionUtils.isEmpty(geoRepSessions)) {
return;
}
List<Callable<GlusterGeoRepSession>> geoRepSessionCalls = new ArrayList<>();
for (final GlusterGeoRepSession geoRepSession : geoRepSessions) {
geoRepSessionCalls.add(() -> {
geoRepSession.setSessionDetails((ArrayList) getSessionDetailFromCLI(cluster, geoRepSession));
return geoRepSession;
});
}
List<GlusterGeoRepSession> updatedSessions = ThreadPoolUtil.invokeAll(geoRepSessionCalls);
for (GlusterGeoRepSession updatedSession : updatedSessions) {
if (updatedSession.getSessionDetails() == null) {
log.info("Geo-replication session details not updated for session '{}' as there was error returning data from VDS", updatedSession.getSessionKey());
continue;
}
try (EngineLock lock = acquireGeoRepSessionLock(updatedSession.getId())) {
GlusterVolumeEntity masterVolume = volumeDao.getById(updatedSession.getMasterVolumeId());
updateGeoRepStatus(masterVolume, updatedSession);
geoRepDao.updateSession(updatedSession);
updateSessionDetailsInDB(updatedSession);
} catch (Exception e) {
log.error("Error updating session details '{}' : '{}'", updatedSession.getSessionKey(), e.getMessage());
log.debug("Exception", e);
}
}
}
use of org.ovirt.engine.core.utils.lock.EngineLock in project ovirt-engine by oVirt.
the class GlusterJob method acquireGeoRepSessionLock.
protected EngineLock acquireGeoRepSessionLock(Guid id) {
EngineLock lock = new EngineLock(Collections.singletonMap(id.toString(), LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER_GEOREP, EngineMessage.ACTION_TYPE_FAILED_GEOREP_SESSION_LOCKED)), null);
lockManager.acquireLockWait(lock);
return lock;
}
use of org.ovirt.engine.core.utils.lock.EngineLock in project ovirt-engine by oVirt.
the class GlusterUtil method acquireGlusterLockWait.
public EngineLock acquireGlusterLockWait(Guid clusterId) {
Map<String, Pair<String, String>> exclusiveLocks = new HashMap<>();
exclusiveLocks.put(clusterId.toString(), LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER, EngineMessage.ACTION_TYPE_FAILED_GLUSTER_OPERATION_INPROGRESS));
EngineLock lock = new EngineLock(exclusiveLocks, null);
Injector.get(LockManager.class).acquireLockWait(lock);
return lock;
}
Aggregations