You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/06/14 20:02:03 UTC
git commit: updated refs/heads/vmsync to 39337ad
Updated Branches:
refs/heads/vmsync aff0220d4 -> 39337adcf
VM transitional state handling
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/39337adc
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/39337adc
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/39337adc
Branch: refs/heads/vmsync
Commit: 39337adcf47f1f6485e98e5cc804f9656c2d39b1
Parents: aff0220
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Jun 14 11:01:43 2013 -0700
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Jun 14 11:01:43 2013 -0700
----------------------------------------------------------------------
.../com/cloud/vm/VirtualMachineManagerImpl.java | 72 ++++++++++++++++++--
.../vm/VirtualMachinePowerStateSyncImpl.java | 6 --
2 files changed, 65 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/39337adc/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index a7e34f9..2d82814 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -18,12 +18,16 @@
package com.cloud.vm;
import java.net.URI;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.TimeZone;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -3412,11 +3416,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
if(vm != null) {
switch(vm.getPowerState()) {
case PowerOn :
- HandlePowerOnReportWithNoPendingJobsOnVM(vm);
+ handlePowerOnReportWithNoPendingJobsOnVM(vm);
break;
case PowerOff :
- HandlePowerOffReportWithNoPendingJobsOnVM(vm);
+ handlePowerOffReportWithNoPendingJobsOnVM(vm);
break;
// PowerUnknown shouldn't be reported, it is a derived
@@ -3434,7 +3438,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
}
- private void HandlePowerOnReportWithNoPendingJobsOnVM(VMInstanceVO vm) {
+ private void handlePowerOnReportWithNoPendingJobsOnVM(VMInstanceVO vm) {
//
// 1) handle left-over transitional VM states
// 2) handle out of band VM live migration
@@ -3493,7 +3497,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
}
- private void HandlePowerOffReportWithNoPendingJobsOnVM(VMInstanceVO vm) {
+ private void handlePowerOffReportWithNoPendingJobsOnVM(VMInstanceVO vm) {
// TODO :
// 1) handle left-over transitional VM states
@@ -3527,15 +3531,69 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
private void scanStalledVMInTransitionState(long hostId) {
//
- // TODO check VM that is stuck in Starting, Stopping, Migrating states, we won't check
+ // Check VM that is stuck in Starting, Stopping, Migrating states, we won't check
// VMs in expunging state (this need to be handled specially)
//
// checking condition
// 1) no pending VmWork job
- // 2) no power state update for some time
- // 3) on hostId host
+ // 2) on hostId host and host is UP
+ //
+ // When host is UP, soon or later we will get a report from the host about the VM,
+ // however, if VM is missing from the host report (it may happen in out of band changes
+ // or from designed behave of XS/KVM)
+ //
+ }
+
+ // TODO, use sql query directly for quick prototype, need to refactor to use joins and search builders
+ // if it supports
+ @DB
+ private List<Long> listStalledVMInTransitionStateOnUpHost(long hostId, Date cutTime) {
+ String sql = "SELECT i.* FROM vm_instance as i, host as h WHERE h.status = 'UP' " +
+ "AND h.id = ? AND i.power_state_update_time < ? AND i.host_id = h.id " +
+ "AND (i.state ='Starting' OR i.state='Stopping' OR i.state='Migrating') " +
+ "AND i.id NOT IN (SELECT vm_instance_id FROM vm_work_job)";
+ List<Long> l = new ArrayList<Long>();
+ Transaction txn = Transaction.currentTxn();;
+ PreparedStatement pstmt = null;
+ try {
+ pstmt = txn.prepareAutoCloseStatement(sql);
+
+ pstmt.setLong(1, hostId);
+ pstmt.setString(2, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutTime));
+ ResultSet rs = pstmt.executeQuery();
+ while(rs.next()) {
+ l.add(rs.getLong(1));
+ }
+ } catch (SQLException e) {
+ } catch (Throwable e) {
+ }
+ return l;
+ }
+
+ @DB
+ private List<Long> listStalledVMInTransitionStateOnDisconnectedHosts(Date cutTime) {
+ String sql = "SELECT i.* FROM vm_instance as i, host as h WHERE h.status != 'UP' " +
+ "AND i.power_state_update_time < ? AND i.host_id = h.id " +
+ "AND (i.state ='Starting' OR i.state='Stopping' OR i.state='Migrating') " +
+ "AND i.id NOT IN (SELECT vm_instance_id FROM vm_work_job)";
+
+ List<Long> l = new ArrayList<Long>();
+ Transaction txn = Transaction.currentTxn();;
+ PreparedStatement pstmt = null;
+ try {
+ pstmt = txn.prepareAutoCloseStatement(sql);
+
+ pstmt.setString(1, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutTime));
+ ResultSet rs = pstmt.executeQuery();
+ while(rs.next()) {
+ l.add(rs.getLong(1));
+ }
+ } catch (SQLException e) {
+ } catch (Throwable e) {
+ }
+ return l;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/39337adc/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
index e76781c..9c47727 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
@@ -66,7 +66,6 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
private void processReport(long hostId, Map<Long, VirtualMachine.PowerState> translatedInfo) {
-
for(Map.Entry<Long, VirtualMachine.PowerState> entry : translatedInfo.entrySet()) {
if(s_logger.isDebugEnabled())
@@ -80,11 +79,6 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
_messageBus.publish(null, VirtualMachineManager.Topics.VM_POWER_STATE, PublishScope.GLOBAL, entry.getKey());
}
}
-
- //
- // TODO
- // 1) publish missing report (if VM is missing from host report) for KVM/XenServer
- //
}
private Map<Long, VirtualMachine.PowerState> convertHostPingInfos(Map<String, PowerState> states) {