mirror of https://github.com/apache/cloudstack.git
Using different MAC for a pair of redundant routers
In the past, we use same MAC address therefore once MASTER is down, the packet to the same MAC would go to BACKUP ASAP. But now we also have arping after BACKUP become MASTER, which should update the ARP cache of public gateway router quickly. Though it would be a little delay(likely less than 1 second), it's still fine for different MAC. And it would solve some cache issue for same mac on vSwitch different ports.
This commit is contained in:
parent
7926e66afa
commit
9f257aa60b
|
|
@ -1409,15 +1409,31 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
|
|||
offeringId = _offering.getId();
|
||||
}
|
||||
|
||||
PublicIp sourceNatIp = null;
|
||||
if (publicNetwork) {
|
||||
sourceNatIp = _networkMgr.assignSourceNatIpAddressToGuestNetwork(owner, guestNetwork);
|
||||
}
|
||||
|
||||
// 3) deploy virtual router(s)
|
||||
int count = routerCount - routers.size();
|
||||
DeploymentPlan plan = planAndRouters.first();
|
||||
for (int i = 0; i < count; i++) {
|
||||
PublicIp sourceNatIp = null;
|
||||
if (publicNetwork) {
|
||||
int failCount = 0;
|
||||
// Generate different MAC for VR
|
||||
while (sourceNatIp == null) {
|
||||
sourceNatIp = _networkMgr.assignSourceNatIpAddressToGuestNetwork(owner, guestNetwork);
|
||||
NicVO nic = _nicDao.findByMacAddress(sourceNatIp.getMacAddress());
|
||||
// We got duplicate MAC here, so regenerate the mac
|
||||
if (nic != null) {
|
||||
s_logger.debug("Failed to find a different mac for redundant router. Try again. The current mac is " + sourceNatIp.getMacAddress());
|
||||
sourceNatIp = null;
|
||||
failCount ++;
|
||||
}
|
||||
//Prevent infinite loop
|
||||
if (failCount > 3) {
|
||||
s_logger.error("Failed to find a different mac for redundant router! Abort operation!");
|
||||
throw new InsufficientAddressCapacityException("Failed to find a different mac for redundant router", null, offeringId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<Pair<NetworkVO, NicProfile>> networks = createRouterNetworks(owner, isRedundant, plan, guestNetwork,
|
||||
new Pair<Boolean, PublicIp>(publicNetwork, sourceNatIp));
|
||||
//don't start the router as we are holding the network lock that needs to be released at the end of router allocation
|
||||
|
|
|
|||
|
|
@ -58,4 +58,6 @@ public interface NicDao extends GenericDao<NicVO, Long> {
|
|||
NicVO findByNetworkIdInstanceIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri);
|
||||
|
||||
NicVO findByIp4AddressAndNetworkIdAndInstanceId(long networkId, long instanceId, String ip4Address);
|
||||
|
||||
NicVO findByMacAddress(String macAddress);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
|
|||
AllFieldsSearch.and("address", AllFieldsSearch.entity().getIp4Address(), Op.EQ);
|
||||
AllFieldsSearch.and("isDefault", AllFieldsSearch.entity().isDefaultNic(), Op.EQ);
|
||||
AllFieldsSearch.and("broadcastUri", AllFieldsSearch.entity().getBroadcastUri(), Op.EQ);
|
||||
AllFieldsSearch.and("macAddress", AllFieldsSearch.entity().getMacAddress(), Op.EQ);
|
||||
AllFieldsSearch.done();
|
||||
|
||||
IpSearch = createSearchBuilder(String.class);
|
||||
|
|
@ -199,4 +200,11 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
|
|||
sc.setParameters("address", ip4Address);
|
||||
return findOneBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NicVO findByMacAddress(String macAddress) {
|
||||
SearchCriteria<NicVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("macAddress", macAddress);
|
||||
return findOneBy(sc);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue