diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index 7f8acff91c3..eacedc159fc 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -843,12 +843,18 @@ public class ApiResponseHelper implements ResponseGenerator {
Long instanceId = volume.getInstanceId();
if (instanceId != null && volume.getState() != Volume.State.Destroy) {
VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId);
- volResponse.setVirtualMachineId(vm.getId());
- volResponse.setVirtualMachineName(vm.getHostName());
- UserVm userVm = ApiDBUtils.findUserVmById(vm.getId());
- if (userVm != null) {
- volResponse.setVirtualMachineDisplayName(userVm.getDisplayName());
- volResponse.setVirtualMachineState(vm.getState().toString());
+ if(vm != null){
+ volResponse.setVirtualMachineId(vm.getId());
+ volResponse.setVirtualMachineName(vm.getHostName());
+ UserVm userVm = ApiDBUtils.findUserVmById(vm.getId());
+ if (userVm != null) {
+ volResponse.setVirtualMachineDisplayName(userVm.getDisplayName());
+ volResponse.setVirtualMachineState(vm.getState().toString());
+ } else {
+ s_logger.error("User Vm with Id: "+instanceId+" does not exist for volume "+volume.getId());
+ }
+ } else {
+ s_logger.error("Vm with Id: "+instanceId+" does not exist for volume "+volume.getId());
}
}
diff --git a/server/src/com/cloud/vm/dao/RandomlyIncreasingVMInstanceDaoImpl.java b/server/src/com/cloud/vm/dao/RandomlyIncreasingVMInstanceDaoImpl.java
new file mode 100644
index 00000000000..a7015606b4c
--- /dev/null
+++ b/server/src/com/cloud/vm/dao/RandomlyIncreasingVMInstanceDaoImpl.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (C) 2011 Cloud.com, Inc. All rights reserved.
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+package com.cloud.vm.dao;
+
+
+import javax.ejb.Local;
+
+import org.apache.log4j.Logger;
+
+@Local(value = { UserVmDao.class })
+public class RandomlyIncreasingVMInstanceDaoImpl extends UserVmDaoImpl {
+
+ public static final Logger s_logger = Logger.getLogger(RandomlyIncreasingVMInstanceDaoImpl.class);
+
+ @Override
+ public K getNextInSequence(final Class clazz, final String name) {
+ return getRandomlyIncreasingNextInSequence(clazz, name);
+ }
+
+}
diff --git a/utils/src/com/cloud/utils/db/GenericDao.java b/utils/src/com/cloud/utils/db/GenericDao.java
index 274288c21bd..392fbe418de 100755
--- a/utils/src/com/cloud/utils/db/GenericDao.java
+++ b/utils/src/com/cloud/utils/db/GenericDao.java
@@ -236,5 +236,7 @@ public interface GenericDao {
boolean lockInLockTable(String id, int seconds);
boolean unlockFromLockTable(String id);
+
+ public K getRandomlyIncreasingNextInSequence(Class clazz, String name);
}
\ No newline at end of file
diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java
index 6302c6bd817..44bc699a7d6 100755
--- a/utils/src/com/cloud/utils/db/GenericDaoBase.java
+++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java
@@ -182,9 +182,11 @@ public abstract class GenericDaoBase implements Gene
Type t = getClass().getGenericSuperclass();
if (t instanceof ParameterizedType) {
_entityBeanType = (Class)((ParameterizedType)t).getActualTypeArguments()[0];
- } else {
+ } else if (((Class>)t).getGenericSuperclass() instanceof ParameterizedType) {
_entityBeanType = (Class)((ParameterizedType)((Class>)t).getGenericSuperclass()).getActualTypeArguments()[0];
-
+ } else {
+ _entityBeanType = (Class)((ParameterizedType)
+ ( (Class>)((Class>)t).getGenericSuperclass()).getGenericSuperclass()).getActualTypeArguments()[0];
}
s_daoMaps.put(_entityBeanType, this);
@@ -291,6 +293,14 @@ public abstract class GenericDaoBase implements Gene
return s_seqFetcher.getNextSequence(clazz, tg);
}
+ @Override @DB(txn=false)
+ public K getRandomlyIncreasingNextInSequence(final Class clazz, final String name) {
+ final TableGenerator tg = _tgs.get(name);
+ assert (tg != null) : "Couldn't find Table generator using " + name;
+
+ return s_seqFetcher.getRandomNextSequence(clazz, tg);
+ }
+
@Override @DB(txn=false)
public List lockRows(final SearchCriteria sc, final Filter filter, final boolean exclusive) {
return search(sc, filter, exclusive, false);
diff --git a/utils/src/com/cloud/utils/db/SequenceFetcher.java b/utils/src/com/cloud/utils/db/SequenceFetcher.java
index d562cc0056e..33449bcb4ad 100644
--- a/utils/src/com/cloud/utils/db/SequenceFetcher.java
+++ b/utils/src/com/cloud/utils/db/SequenceFetcher.java
@@ -20,6 +20,7 @@ package com.cloud.utils.db;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
@@ -46,13 +47,22 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
public class SequenceFetcher {
private final static Logger s_logger = Logger.getLogger(SequenceFetcher.class);
ExecutorService _executors;
+ private final static Random random = new Random();
public T getNextSequence(Class clazz, TableGenerator tg) {
- return getNextSequence(clazz, tg, null);
+ return getNextSequence(clazz, tg, null, false);
}
public T getNextSequence(Class clazz, TableGenerator tg, Object key) {
- Future future = _executors.submit(new Fetcher(clazz, tg, key));
+ return getNextSequence(clazz, tg, key, false);
+ }
+
+ public T getRandomNextSequence(Class clazz, TableGenerator tg) {
+ return getNextSequence(clazz, tg, null, true);
+ }
+
+ public T getNextSequence(Class clazz, TableGenerator tg, Object key, boolean isRandom) {
+ Future future = _executors.submit(new Fetcher(clazz, tg, key, isRandom));
try {
return future.get();
} catch (Exception e) {
@@ -74,11 +84,13 @@ public class SequenceFetcher {
TableGenerator _tg;
Class _clazz;
Object _key;
+ boolean isRandom = false;
- protected Fetcher(Class clazz, TableGenerator tg, Object key) {
+ protected Fetcher(Class clazz, TableGenerator tg, Object key, boolean isRandom) {
_tg = tg;
_clazz = clazz;
_key = key;
+ this.isRandom = isRandom;
}
@Override @SuppressWarnings("unchecked")
@@ -103,7 +115,11 @@ public class SequenceFetcher {
sql.append(" WHERE ").append(_tg.pkColumnName()).append("=?");
PreparedStatement updateStmt = txn.prepareStatement(sql.toString());
- updateStmt.setInt(2, _tg.allocationSize());
+ if(isRandom){
+ updateStmt.setInt(2, random.nextInt(10) + 1);
+ } else {
+ updateStmt.setInt(2, _tg.allocationSize());
+ }
if (_key == null) {
updateStmt.setString(3, _tg.pkColumnValue());
} else {