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