/** * lock Vms which has db entity i.e they are managed by a VmManager * * @param pair * @return true if lock acquired */ private boolean tryLockVmForUpdate(Pair<VM, VmInternalData> pair) { Guid vmId = getVmId(pair); if (vmId != null) { VmManager vmManager = getResourceManager().getVmManager(vmId); if (vmManager.trylock()) { if (!vmManager.isLatestData(pair.getSecond(), vdsManager.getVdsId())) { log.warn( "skipping VM '{}' from this monitoring cycle" + " - newer VM data was already processed", vmId); vmManager.unlock(); } else if (vmManager.getVmDataChangedTime() != null && fetchTime - vmManager.getVmDataChangedTime() <= 0) { log.warn( "skipping VM '{}' from this monitoring cycle" + " - the VM data has changed since fetching the data", vmId); vmManager.unlock(); } else { // store the locked managers to finally release them at the end of the cycle vmManagers.put(vmId, vmManager); return true; } } else { log.debug( "skipping VM '{}' from this monitoring cycle" + " - the VM is locked by its VmManager ", getVmId(pair)); } } return false; }
/** * gets VM full information for the given list of VMs * * @param vmsToUpdate * @return */ protected Map[] getVmInfo(List<String> vmsToUpdate) { // TODO refactor commands to use vdsId only - the whole vds object here is useless VDS vds = new VDS(); vds.setId(vdsManager.getVdsId()); Map[] result = {}; VDSReturnValue vdsReturnValue = getResourceManager() .runVdsCommand( VDSCommandType.FullList, new FullListVDSCommandParameters(vds, vmsToUpdate)); if (vdsReturnValue.getSucceeded()) { result = (Map[]) (vdsReturnValue.getReturnValue()); } return result; }
private void afterVMsRefreshTreatment() { Collection<Guid> movedToDownVms = new ArrayList<>(); List<Guid> succeededToRunVms = new ArrayList<>(); // now loop over the result and act for (VmAnalyzer vmAnalyzer : vmAnalyzers) { // rerun all vms from rerun list if (vmAnalyzer.isRerun()) { log.error( "Rerun VM '{}'. Called from VDS '{}'", vmAnalyzer.getDbVm().getId(), vdsManager.getVdsName()); ResourceManager.getInstance() .rerunFailedCommand(vmAnalyzer.getDbVm().getId(), vdsManager.getVdsId()); } if (vmAnalyzer.isSuccededToRun()) { vdsManager.succeededToRunVm(vmAnalyzer.getDbVm().getId()); succeededToRunVms.add(vmAnalyzer.getDbVm().getId()); } // Refrain from auto-start HA VM during its re-run attempts. if (vmAnalyzer.isAutoVmToRun() && !vmAnalyzer.isRerun()) { autoVmsToRun.add(vmAnalyzer.getDbVm().getId()); } // process all vms that their ip changed. if (vmAnalyzer.isClientIpChanged()) { final VmDynamic vmDynamic = vmAnalyzer.getVdsmVm().getVmDynamic(); getVdsEventListener().processOnClientIpChange(vmDynamic.getId(), vmDynamic.getClientIp()); } // process all vms that powering up. if (vmAnalyzer.isPoweringUp()) { getVdsEventListener().processOnVmPoweringUp(vmAnalyzer.getVdsmVm().getVmDynamic().getId()); } if (vmAnalyzer.isMovedToDown()) { movedToDownVms.add(vmAnalyzer.getDbVm().getId()); } if (vmAnalyzer.isRemoveFromAsync()) { ResourceManager.getInstance().removeAsyncRunningVm(vmAnalyzer.getDbVm().getId()); } if (vmAnalyzer.isHostedEngineUnmanaged()) { // @since 3.6 - we take existing HE VM and reimport it importHostedEngineVM( getVmInfo( Collections.singletonList( vmAnalyzer.getVdsmVm().getVmDynamic().getId().toString()))[0]); } } getVdsEventListener().updateSlaPolicies(succeededToRunVms, vdsManager.getVdsId()); // run all vms that crashed that marked with auto startup getVdsEventListener().runFailedAutoStartVMs(autoVmsToRun); // process all vms that went down getVdsEventListener().processOnVmStop(movedToDownVms, vdsManager.getVdsId()); getVdsEventListener() .refreshHostIfAnyVmHasHostDevices(succeededToRunVms, vdsManager.getVdsId()); }