From 976b5aa48db9c3cc390ffb75f3b3e0cb143c1ae2 Mon Sep 17 00:00:00 2001 From: kishan Date: Tue, 11 Oct 2011 12:03:59 +0530 Subject: [PATCH 1/4] bug 11672: While listing volumes, check for null Vm instance. Log error when Vm instance is null status 11672: resolved fixed --- .../src/com/cloud/api/ApiResponseHelper.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) 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()); } } From 7de5153d74bad1a16008ab9b26d4ebf4aa1efe08 Mon Sep 17 00:00:00 2001 From: kishan Date: Wed, 5 Oct 2011 23:15:43 +0530 Subject: [PATCH 2/4] bug 11561: Added new Dao RandomlyIncreasing, which will increase the Vm Id by 1-10 randomly status 11561: resolved fixed --- utils/src/com/cloud/utils/db/GenericDao.java | 2 ++ .../com/cloud/utils/db/GenericDaoBase.java | 14 +++++++++-- .../com/cloud/utils/db/SequenceFetcher.java | 24 +++++++++++++++---- 3 files changed, 34 insertions(+), 6 deletions(-) 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..9148f372831 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; @@ -48,11 +49,19 @@ public class SequenceFetcher { ExecutorService _executors; 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 +83,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 +114,12 @@ public class SequenceFetcher { sql.append(" WHERE ").append(_tg.pkColumnName()).append("=?"); PreparedStatement updateStmt = txn.prepareStatement(sql.toString()); - updateStmt.setInt(2, _tg.allocationSize()); + if(isRandom){ + Random random = new Random(); + updateStmt.setInt(2, random.nextInt(10)); + } else { + updateStmt.setInt(2, _tg.allocationSize()); + } if (_key == null) { updateStmt.setString(3, _tg.pkColumnValue()); } else { From 334eeccd2ce60292fdf6c84461eacb2f0e3ecc1e Mon Sep 17 00:00:00 2001 From: kishan Date: Thu, 6 Oct 2011 00:35:52 +0530 Subject: [PATCH 3/4] bug 11561: Added new Dao RandomlyIncreasing, which will increase the Vm Id by 1-10 randomly status 11561: resolved fixed --- .../RandomlyIncreasingVMInstanceDaoImpl.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 server/src/com/cloud/vm/dao/RandomlyIncreasingVMInstanceDaoImpl.java 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); + } + +} From 1c023747080d0c7aed2c55737498dcee4d3ad306 Mon Sep 17 00:00:00 2001 From: alena Date: Fri, 7 Oct 2011 09:52:49 -0700 Subject: [PATCH 4/4] Fixed the bug in random seq allocator code - always do "+1" because .netxInt(10) method can return 0, and the id in this case will be equal the id already present in the DB. --- utils/src/com/cloud/utils/db/SequenceFetcher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/src/com/cloud/utils/db/SequenceFetcher.java b/utils/src/com/cloud/utils/db/SequenceFetcher.java index 9148f372831..33449bcb4ad 100644 --- a/utils/src/com/cloud/utils/db/SequenceFetcher.java +++ b/utils/src/com/cloud/utils/db/SequenceFetcher.java @@ -47,6 +47,7 @@ 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, false); @@ -115,8 +116,7 @@ public class SequenceFetcher { PreparedStatement updateStmt = txn.prepareStatement(sql.toString()); if(isRandom){ - Random random = new Random(); - updateStmt.setInt(2, random.nextInt(10)); + updateStmt.setInt(2, random.nextInt(10) + 1); } else { updateStmt.setInt(2, _tg.allocationSize()); }