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 {