You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2015/04/29 16:51:39 UTC

[1/6] git commit: updated refs/heads/4.5 to 031d7a9

Repository: cloudstack
Updated Branches:
  refs/heads/4.5 f8b7251b8 -> 031d7a9c4


CLOUDSTACK-8402: Depend on openjdk 1.7 for both CentOS 6 and 7

This commit forces rpms to depend on java-1.7.0-openjdk which is available
on both CentOS 6 and CentOS 7, also the version that ACS 4.5 supports.

Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/031d7a9c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/031d7a9c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/031d7a9c

Branch: refs/heads/4.5
Commit: 031d7a9c43c5082913064a39829ecefb2239c5ab
Parents: 795f381
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Wed Apr 29 16:09:48 2015 +0200
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Wed Apr 29 16:50:40 2015 +0200

----------------------------------------------------------------------
 packaging/centos63/default/macros.spec | 2 +-
 packaging/centos63/rhel7/macros.spec   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/031d7a9c/packaging/centos63/default/macros.spec
----------------------------------------------------------------------
diff --git a/packaging/centos63/default/macros.spec b/packaging/centos63/default/macros.spec
index 638b07b..f20bde0 100644
--- a/packaging/centos63/default/macros.spec
+++ b/packaging/centos63/default/macros.spec
@@ -16,7 +16,7 @@
 # under the License.
 
 %define _pythonparamiko Requires: python-paramiko
-%define _javaversion java => 1.7.0
+%define _javaversion java-1.7.0-openjdk
 %define _tomcatversion tomcat6
 %define _vlanconfigtool vconfig
 %define _tomcatpathname tomcat6

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/031d7a9c/packaging/centos63/rhel7/macros.spec
----------------------------------------------------------------------
diff --git a/packaging/centos63/rhel7/macros.spec b/packaging/centos63/rhel7/macros.spec
index 13eaf8e..7d7ee61 100644
--- a/packaging/centos63/rhel7/macros.spec
+++ b/packaging/centos63/rhel7/macros.spec
@@ -16,7 +16,7 @@
 # under the License.
 
 %define _pythonparamiko %{nil}
-%define _javaversion java => 1.7.0
+%define _javaversion java-1.7.0-openjdk
 %define _tomcatversion tomcat => 7.0
 %define _vlanconfigtool iproute
 %define _tomcatpathname tomcat


[3/6] git commit: updated refs/heads/4.5 to 031d7a9

Posted by bh...@apache.org.
CLOUDSTACK-8410. ESXi host stuck disconnects frequently.
During ping task, while scanning and updating status of all VMs on the host that are stuck in a transitional state
and are missing from the power report, do so only for VMs that are not removed.

(cherry picked from commit de7173a0ed6434d1809d0471fe8f28bd339f208e)
Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e1db982d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e1db982d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e1db982d

Branch: refs/heads/4.5
Commit: e1db982d6b46f81240ef47ed2f6604e38d69c17a
Parents: f8b7251
Author: Likitha Shetty <li...@citrix.com>
Authored: Fri Mar 13 15:14:25 2015 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Wed Apr 29 16:50:40 2015 +0200

----------------------------------------------------------------------
 .../src/com/cloud/vm/VirtualMachineManagerImpl.java         | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e1db982d/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 3cf8c2d..36c5c44 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -3817,7 +3817,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         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 w.vm_instance_id FROM vm_work_job AS w JOIN async_job AS j ON w.id = j.id WHERE j.job_status = ?)";
+                "AND i.id NOT IN (SELECT w.vm_instance_id FROM vm_work_job AS w JOIN async_job AS j ON w.id = j.id WHERE j.job_status = ?)" +
+                "AND i.removed IS NULL";
 
         List<Long> l = new ArrayList<Long>();
         TransactionLegacy txn = null;
@@ -3851,7 +3852,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         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 w.vm_instance_id FROM vm_work_job AS w JOIN async_job AS j ON w.id = j.id WHERE j.job_status = ?)";
+                "AND i.id NOT IN (SELECT w.vm_instance_id FROM vm_work_job AS w JOIN async_job AS j ON w.id = j.id WHERE j.job_status = ?)" +
+                "AND i.removed IS NULL";
 
         List<Long> l = new ArrayList<Long>();
         TransactionLegacy txn = null;
@@ -3882,7 +3884,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         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 w.vm_instance_id FROM vm_work_job AS w JOIN async_job AS j ON w.id = j.id WHERE j.job_status = ?)";
+                "AND i.id NOT IN (SELECT w.vm_instance_id FROM vm_work_job AS w JOIN async_job AS j ON w.id = j.id WHERE j.job_status = ?)" +
+                "AND i.removed IS NULL";
 
         List<Long> l = new ArrayList<Long>();
         TransactionLegacy txn = null;


[5/6] git commit: updated refs/heads/4.5 to 031d7a9

Posted by bh...@apache.org.
CLOUDSTACK-8426: Use a separate thread pool for VR reboot in case of out-of-band movement
Using a cached thread pool for VR reboot task

(cherry picked from commit 1a719afb516164915b973f548c37814b448f0349)
Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/795f3814
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/795f3814
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/795f3814

Branch: refs/heads/4.5
Commit: 795f3814f69f341df107678ab45fc29297932aa1
Parents: 6378d37
Author: Koushik Das <ko...@apache.org>
Authored: Wed Apr 29 12:29:21 2015 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Wed Apr 29 16:50:40 2015 +0200

----------------------------------------------------------------------
 .../cloud/network/router/VirtualNetworkApplianceManagerImpl.java | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/795f3814/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 65a4a34..add6aa0 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -435,6 +435,7 @@ VirtualMachineGuru, Listener, Configurable, StateListener<State, VirtualMachine.
     ScheduledExecutorService _checkExecutor;
     ScheduledExecutorService _networkStatsUpdateExecutor;
     ExecutorService _rvrStatusUpdateExecutor;
+    ExecutorService _rebootRouterExecutor;
 
     Account _systemAcct;
 
@@ -688,6 +689,7 @@ VirtualMachineGuru, Listener, Configurable, StateListener<State, VirtualMachine.
         _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor"));
         _checkExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterStatusMonitor"));
         _networkStatsUpdateExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("NetworkStatsUpdater"));
+        _rebootRouterExecutor = Executors.newCachedThreadPool(new NamedThreadFactory("RebootRouterTask"));
 
         VirtualMachine.State.getStateMachine().registerListener(this);
 
@@ -4494,7 +4496,7 @@ VirtualMachineGuru, Listener, Configurable, StateListener<State, VirtualMachine.
                         // 2. If VM is in running state in CS and there is a 'PowerOn' report from new host
                         if (hostId == null || (hostId.longValue() != powerHostId.longValue())) {
                             s_logger.info("Schedule a router reboot task as router " + vo.getId() + " is powered-on out-of-band, need to reboot to refresh network rules");
-                            _executor.schedule(new RebootTask(vo.getId()), 1000, TimeUnit.MICROSECONDS);
+                            _rebootRouterExecutor.execute(new RebootTask(vo.getId()));
                         }
                     }
                 }


[2/6] git commit: updated refs/heads/4.5 to 031d7a9

Posted by bh...@apache.org.
CLOUDSTACK-8425: Job framework: Same internal job can execute simultaneously
The same internal job was simultaneously getting executed by 2 worked threads.
The fix is to ensure that job gets scheduled for execution from a single place.

(cherry picked from commit 6dfb8ab03ed05747941a89b4079ff23d25f4d8fd)
Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6378d37c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6378d37c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6378d37c

Branch: refs/heads/4.5
Commit: 6378d37c5efdf7c4f761b3ae741ffa9032358b5d
Parents: 27b7e49
Author: Koushik Das <ko...@apache.org>
Authored: Wed Apr 29 11:10:48 2015 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Wed Apr 29 16:50:40 2015 +0200

----------------------------------------------------------------------
 .../cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java      | 4 ++--
 .../cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java      | 1 -
 .../cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java     | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6378d37c/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
index 167d9f5..29c3f1b 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
@@ -116,9 +116,9 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
                 l.add(item);
             }
         } catch (SQLException e) {
-            s_logger.error("Unexpected sql excetpion, ", e);
+            s_logger.error("Unexpected sql exception, ", e);
         } catch (Throwable e) {
-            s_logger.error("Unexpected excetpion, ", e);
+            s_logger.error("Unexpected exception, ", e);
         }
         return l;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6378d37c/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index c3c79c9..1ea3c78 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -554,7 +554,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
                         if (job.getSyncSource() != null) {
                             // here check queue item one more time to double make sure that queue item is removed in case of any uncaught exception
                             _queueMgr.purgeItem(job.getSyncSource().getId());
-                            checkQueue(job.getSyncSource().getQueueId());
                         }
 
                         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6378d37c/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
index 6535163..c17c581 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
@@ -160,7 +160,7 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
                                 itemVO.setLastProcessTime(dt);
                                 _syncQueueItemDao.update(item.getId(), itemVO);
 
-                                resultList.add(item);
+                                resultList.add(itemVO);
                             }
                         }
                     }


[4/6] git commit: updated refs/heads/4.5 to 031d7a9

Posted by bh...@apache.org.
CLOUDSTACK-8411. Unable to delete an uploaded volume after CCP fails to attach the volume to a VM.
Correctly update the status of an uploaded volume upon failure to attach it to a VM.

(cherry picked from commit 10a106f5d86a7f6786b94a7298a5c63c32eab66b)
Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6c649ce3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6c649ce3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6c649ce3

Branch: refs/heads/4.5
Commit: 6c649ce3ae3e4b3c785e98ef0da8da4410c7dad5
Parents: e1db982
Author: Likitha Shetty <li...@citrix.com>
Authored: Thu Mar 26 17:25:12 2015 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Wed Apr 29 16:50:40 2015 +0200

----------------------------------------------------------------------
 .../org/apache/cloudstack/storage/volume/VolumeServiceImpl.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c649ce3/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index b0555e2..3483544 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -889,7 +889,7 @@ public class VolumeServiceImpl implements VolumeService {
         AsyncCallFuture<VolumeApiResult> future = context.future;
         VolumeApiResult res = new VolumeApiResult(destVolume);
         try {
-            if (res.isFailed()) {
+            if (result.isFailed()) {
                 destVolume.processEvent(Event.OperationFailed);
                 srcVolume.processEvent(Event.OperationFailed);
                 res.setResult(result.getResult());


[6/6] git commit: updated refs/heads/4.5 to 031d7a9

Posted by bh...@apache.org.
CLOUDSTACK-8412. VM migration with storage fails.
Update MigrateWithStorageCommand to avoid JSON deserialization error.

(cherry picked from commit 04365601dac6d4dfa396e5c86ab7e698906dfb44)
Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/27b7e49b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/27b7e49b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/27b7e49b

Branch: refs/heads/4.5
Commit: 27b7e49b395d089ff45037faa51e73d979ceb62b
Parents: 6c649ce
Author: Likitha Shetty <li...@citrix.com>
Authored: Fri Apr 3 15:47:07 2015 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Wed Apr 29 16:50:40 2015 +0200

----------------------------------------------------------------------
 .../hypervisor/vmware/resource/VmwareResource.java      | 12 ++++++------
 .../storage/motion/VmwareStorageMotionStrategy.java     | 11 ++++++-----
 2 files changed, 12 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/27b7e49b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 9f90901..9e7db37 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -3036,7 +3036,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
         List<VolumeObjectTO> volumeToList =  new ArrayList<VolumeObjectTO>();
         Map<Long, Integer> volumeDeviceKey = new HashMap<Long, Integer>();
 
-        Map<VolumeTO, StorageFilerTO> volToFiler = cmd.getVolumeToFiler();
+        List<Pair<VolumeTO, StorageFilerTO>> volToFiler = cmd.getVolumeToFilerAsList();
         String tgtHost = cmd.getTargetHost();
         String tgtHostMorInfo = tgtHost.split("@")[0];
         morTgtHost.setType(tgtHostMorInfo.split(":")[0]);
@@ -3064,9 +3064,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
             vmName = vmMo.getName();
 
             // Specify destination datastore location for each volume
-            for (Entry<VolumeTO, StorageFilerTO> entry : volToFiler.entrySet()) {
-                volume = entry.getKey();
-                filerTo = entry.getValue();
+            for (Pair<VolumeTO, StorageFilerTO> entry : volToFiler) {
+                volume = entry.first();
+                filerTo = entry.second();
 
                 s_logger.debug("Preparing spec for volume : " + volume.getName());
                 morDsAtTarget = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(tgtHyperHost, filerTo.getUuid());
@@ -3195,8 +3195,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
             }
 
             // Update and return volume path for every disk because that could have changed after migration
-            for (Entry<VolumeTO, StorageFilerTO> entry : volToFiler.entrySet()) {
-                volume = entry.getKey();
+            for (Pair<VolumeTO, StorageFilerTO> entry : volToFiler) {
+                volume = entry.first();
                 long volumeId = volume.getId();
                 VirtualDisk[] disks = vmMo.getAllDiskDevice();
                 for (VirtualDisk disk : disks) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/27b7e49b/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java b/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
index 24efde7..da9764d 100644
--- a/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
+++ b/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
@@ -19,7 +19,7 @@
 
 package org.apache.cloudstack.storage.motion;
 
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -53,6 +53,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VolumeDao;
+import com.cloud.utils.Pair;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.dao.VMInstanceDao;
@@ -130,12 +131,12 @@ public class VmwareStorageMotionStrategy implements DataMotionStrategy {
 
         // Initiate migration of a virtual machine with it's volumes.
         try {
-            Map<VolumeTO, StorageFilerTO> volumeToFilerto = new HashMap<VolumeTO, StorageFilerTO>();
+            List<Pair<VolumeTO, StorageFilerTO>> volumeToFilerto = new ArrayList<Pair<VolumeTO, StorageFilerTO>>();
             for (Map.Entry<VolumeInfo, DataStore> entry : volumeToPool.entrySet()) {
                 VolumeInfo volume = entry.getKey();
                 VolumeTO volumeTo = new VolumeTO(volume, storagePoolDao.findById(volume.getPoolId()));
                 StorageFilerTO filerTo = new StorageFilerTO((StoragePool)entry.getValue());
-                volumeToFilerto.put(volumeTo, filerTo);
+                volumeToFilerto.add(new Pair<VolumeTO, StorageFilerTO>(volumeTo, filerTo));
             }
 
             // Migration across cluster needs to be done in three phases.
@@ -168,12 +169,12 @@ public class VmwareStorageMotionStrategy implements DataMotionStrategy {
 
         // Initiate migration of a virtual machine with it's volumes.
         try {
-            Map<VolumeTO, StorageFilerTO> volumeToFilerto = new HashMap<VolumeTO, StorageFilerTO>();
+            List<Pair<VolumeTO, StorageFilerTO>> volumeToFilerto = new ArrayList<Pair<VolumeTO, StorageFilerTO>>();
             for (Map.Entry<VolumeInfo, DataStore> entry : volumeToPool.entrySet()) {
                 VolumeInfo volume = entry.getKey();
                 VolumeTO volumeTo = new VolumeTO(volume, storagePoolDao.findById(volume.getPoolId()));
                 StorageFilerTO filerTo = new StorageFilerTO((StoragePool)entry.getValue());
-                volumeToFilerto.put(volumeTo, filerTo);
+                volumeToFilerto.add(new Pair<VolumeTO, StorageFilerTO>(volumeTo, filerTo));
             }
 
             MigrateWithStorageCommand command = new MigrateWithStorageCommand(to, volumeToFilerto, destHost.getGuid());