mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge pull request #1209 from ustcweizhou/free-deviceid
CLOUDSTACK-9134: set device_id as the first device_id not in use instead of nic count when we restart vpc tiers, the old nics will be removed, and create a new nic. however, the device_id was set to the nic count, which may be already used. this commit get the first device_id not in use as the device_id of new nic. This issue also happen when we add multiple networks to a vm and remove them. * pr/1209: CLOUDSTACK-9134: set device_id as the first device_id not in use instead of nic count Signed-off-by: Daan Hoogland <daan@onecht.net>
This commit is contained in:
commit
5774b965f3
@ -3150,7 +3150,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
|||||||
|
|
||||||
//1) allocate nic (if needed) Always allocate if it is a user vm
|
//1) allocate nic (if needed) Always allocate if it is a user vm
|
||||||
if (nic == null || (vmProfile.getType() == VirtualMachine.Type.User)) {
|
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();
|
nic = allocateNic(requested, network, false, deviceId, vmProfile).first();
|
||||||
|
|
||||||
|
|||||||
@ -55,7 +55,7 @@ public interface NicDao extends GenericDao<NicVO, Long> {
|
|||||||
|
|
||||||
String getIpAddress(long networkId, long instanceId);
|
String getIpAddress(long networkId, long instanceId);
|
||||||
|
|
||||||
int countNics(long instanceId);
|
int getFreeDeviceId(long instanceId);
|
||||||
|
|
||||||
NicVO findByNetworkIdInstanceIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri);
|
NicVO findByNetworkIdInstanceIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri);
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import javax.inject.Inject;
|
|||||||
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.cloud.utils.db.Filter;
|
||||||
import com.cloud.utils.db.GenericDaoBase;
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
import com.cloud.utils.db.GenericSearchBuilder;
|
import com.cloud.utils.db.GenericSearchBuilder;
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
import com.cloud.utils.db.JoinBuilder;
|
||||||
@ -44,7 +45,7 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
|
|||||||
private SearchBuilder<NicVO> AllFieldsSearch;
|
private SearchBuilder<NicVO> AllFieldsSearch;
|
||||||
private GenericSearchBuilder<NicVO, String> IpSearch;
|
private GenericSearchBuilder<NicVO, String> IpSearch;
|
||||||
private SearchBuilder<NicVO> NonReleasedSearch;
|
private SearchBuilder<NicVO> NonReleasedSearch;
|
||||||
private GenericSearchBuilder<NicVO, Integer> CountBy;
|
private GenericSearchBuilder<NicVO, Integer> deviceIdSearch;
|
||||||
private GenericSearchBuilder<NicVO, Integer> CountByForStartingVms;
|
private GenericSearchBuilder<NicVO, Integer> CountByForStartingVms;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@ -81,11 +82,10 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
|
|||||||
NonReleasedSearch.and("state", NonReleasedSearch.entity().getState(), Op.NOTIN);
|
NonReleasedSearch.and("state", NonReleasedSearch.entity().getState(), Op.NOTIN);
|
||||||
NonReleasedSearch.done();
|
NonReleasedSearch.done();
|
||||||
|
|
||||||
CountBy = createSearchBuilder(Integer.class);
|
deviceIdSearch = createSearchBuilder(Integer.class);
|
||||||
CountBy.select(null, Func.COUNT, CountBy.entity().getId());
|
deviceIdSearch.select(null, Func.DISTINCT, deviceIdSearch.entity().getDeviceId());
|
||||||
CountBy.and("vmId", CountBy.entity().getInstanceId(), Op.EQ);
|
deviceIdSearch.and("instance", deviceIdSearch.entity().getInstanceId(), Op.EQ);
|
||||||
CountBy.and("removed", CountBy.entity().getRemoved(), Op.NULL);
|
deviceIdSearch.done();
|
||||||
CountBy.done();
|
|
||||||
|
|
||||||
CountByForStartingVms = createSearchBuilder(Integer.class);
|
CountByForStartingVms = createSearchBuilder(Integer.class);
|
||||||
CountByForStartingVms.select(null, Func.COUNT, CountByForStartingVms.entity().getId());
|
CountByForStartingVms.select(null, Func.COUNT, CountByForStartingVms.entity().getId());
|
||||||
@ -222,11 +222,20 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int countNics(long instanceId) {
|
public int getFreeDeviceId(long instanceId) {
|
||||||
SearchCriteria<Integer> sc = CountBy.create();
|
Filter searchFilter = new Filter(NicVO.class, "deviceId", true, null, null);
|
||||||
sc.setParameters("vmId", instanceId);
|
SearchCriteria<Integer> sc = deviceIdSearch.create();
|
||||||
List<Integer> results = customSearch(sc, null);
|
sc.setParameters("instance", instanceId);
|
||||||
return results.get(0);
|
List<Integer> deviceIds = customSearch(sc, searchFilter);
|
||||||
|
|
||||||
|
int freeDeviceId = 0;
|
||||||
|
for (int deviceId : deviceIds) {
|
||||||
|
if (deviceId > freeDeviceId)
|
||||||
|
break;
|
||||||
|
freeDeviceId ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return freeDeviceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user