mirror of https://github.com/apache/cloudstack.git
bug 11561: Added new Dao RandomlyIncreasing, which will increase the Vm Id by 1-10 randomly
status 11561: resolved fixed
This commit is contained in:
parent
976b5aa48d
commit
7de5153d74
|
|
@ -236,5 +236,7 @@ public interface GenericDao<T, ID extends Serializable> {
|
|||
boolean lockInLockTable(String id, int seconds);
|
||||
|
||||
boolean unlockFromLockTable(String id);
|
||||
|
||||
public <K> K getRandomlyIncreasingNextInSequence(Class<K> clazz, String name);
|
||||
|
||||
}
|
||||
|
|
@ -182,9 +182,11 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
Type t = getClass().getGenericSuperclass();
|
||||
if (t instanceof ParameterizedType) {
|
||||
_entityBeanType = (Class<T>)((ParameterizedType)t).getActualTypeArguments()[0];
|
||||
} else {
|
||||
} else if (((Class<?>)t).getGenericSuperclass() instanceof ParameterizedType) {
|
||||
_entityBeanType = (Class<T>)((ParameterizedType)((Class<?>)t).getGenericSuperclass()).getActualTypeArguments()[0];
|
||||
|
||||
} else {
|
||||
_entityBeanType = (Class<T>)((ParameterizedType)
|
||||
( (Class<?>)((Class<?>)t).getGenericSuperclass()).getGenericSuperclass()).getActualTypeArguments()[0];
|
||||
}
|
||||
|
||||
s_daoMaps.put(_entityBeanType, this);
|
||||
|
|
@ -291,6 +293,14 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
return s_seqFetcher.getNextSequence(clazz, tg);
|
||||
}
|
||||
|
||||
@Override @DB(txn=false)
|
||||
public <K> K getRandomlyIncreasingNextInSequence(final Class<K> 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<T> lockRows(final SearchCriteria<T> sc, final Filter filter, final boolean exclusive) {
|
||||
return search(sc, filter, exclusive, false);
|
||||
|
|
|
|||
|
|
@ -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> T getNextSequence(Class<T> clazz, TableGenerator tg) {
|
||||
return getNextSequence(clazz, tg, null);
|
||||
return getNextSequence(clazz, tg, null, false);
|
||||
}
|
||||
|
||||
public <T> T getNextSequence(Class<T> clazz, TableGenerator tg, Object key) {
|
||||
Future<T> future = _executors.submit(new Fetcher<T>(clazz, tg, key));
|
||||
return getNextSequence(clazz, tg, key, false);
|
||||
}
|
||||
|
||||
public <T> T getRandomNextSequence(Class<T> clazz, TableGenerator tg) {
|
||||
return getNextSequence(clazz, tg, null, true);
|
||||
}
|
||||
|
||||
public <T> T getNextSequence(Class<T> clazz, TableGenerator tg, Object key, boolean isRandom) {
|
||||
Future<T> future = _executors.submit(new Fetcher<T>(clazz, tg, key, isRandom));
|
||||
try {
|
||||
return future.get();
|
||||
} catch (Exception e) {
|
||||
|
|
@ -74,11 +83,13 @@ public class SequenceFetcher {
|
|||
TableGenerator _tg;
|
||||
Class<T> _clazz;
|
||||
Object _key;
|
||||
boolean isRandom = false;
|
||||
|
||||
protected Fetcher(Class<T> clazz, TableGenerator tg, Object key) {
|
||||
protected Fetcher(Class<T> 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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue