Merge release branch 4.6 to master

* 4.6:
  CLOUDSTACK-9134: set device_id as the first device_id not in use instead of nic count
This commit is contained in:
Daan Hoogland 2015-12-13 19:04:22 +01:00
commit 50c20dab17
3 changed files with 22 additions and 13 deletions

View File

@ -3147,7 +3147,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
//1) allocate nic (if needed) Always allocate if it is a user vm
if (nic == null || (vmProfile.getType() == VirtualMachine.Type.User)) {
int deviceId = _nicDao.countNics(vm.getId());
int deviceId = _nicDao.getFreeDeviceId(vm.getId());
nic = allocateNic(requested, network, false, deviceId, vmProfile).first();

View File

@ -55,7 +55,7 @@ public interface NicDao extends GenericDao<NicVO, Long> {
String getIpAddress(long networkId, long instanceId);
int countNics(long instanceId);
int getFreeDeviceId(long instanceId);
NicVO findByNetworkIdInstanceIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri);

View File

@ -24,6 +24,7 @@ import javax.inject.Inject;
import org.springframework.stereotype.Component;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.JoinBuilder;
@ -42,7 +43,7 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
private SearchBuilder<NicVO> AllFieldsSearch;
private GenericSearchBuilder<NicVO, String> IpSearch;
private SearchBuilder<NicVO> NonReleasedSearch;
private GenericSearchBuilder<NicVO, Integer> CountBy;
private GenericSearchBuilder<NicVO, Integer> deviceIdSearch;
private GenericSearchBuilder<NicVO, Integer> CountByForStartingVms;
@Inject
@ -79,11 +80,10 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
NonReleasedSearch.and("state", NonReleasedSearch.entity().getState(), Op.NOTIN);
NonReleasedSearch.done();
CountBy = createSearchBuilder(Integer.class);
CountBy.select(null, Func.COUNT, CountBy.entity().getId());
CountBy.and("vmId", CountBy.entity().getInstanceId(), Op.EQ);
CountBy.and("removed", CountBy.entity().getRemoved(), Op.NULL);
CountBy.done();
deviceIdSearch = createSearchBuilder(Integer.class);
deviceIdSearch.select(null, Func.DISTINCT, deviceIdSearch.entity().getDeviceId());
deviceIdSearch.and("instance", deviceIdSearch.entity().getInstanceId(), Op.EQ);
deviceIdSearch.done();
CountByForStartingVms = createSearchBuilder(Integer.class);
CountByForStartingVms.select(null, Func.COUNT, CountByForStartingVms.entity().getId());
@ -220,11 +220,20 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
}
@Override
public int countNics(long instanceId) {
SearchCriteria<Integer> sc = CountBy.create();
sc.setParameters("vmId", instanceId);
List<Integer> results = customSearch(sc, null);
return results.get(0);
public int getFreeDeviceId(long instanceId) {
Filter searchFilter = new Filter(NicVO.class, "deviceId", true, null, null);
SearchCriteria<Integer> sc = deviceIdSearch.create();
sc.setParameters("instance", instanceId);
List<Integer> deviceIds = customSearch(sc, searchFilter);
int freeDeviceId = 0;
for (int deviceId : deviceIds) {
if (deviceId > freeDeviceId)
break;
freeDeviceId ++;
}
return freeDeviceId;
}
@Override