You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ml...@apache.org on 2013/01/16 21:59:57 UTC
[37/50] git commit: CLOUDSTACK-985: Revert "Using different MAC for a
pair of redundant routers"
CLOUDSTACK-985: Revert "Using different MAC for a pair of redundant routers"
The different MAC address for a pair of redundant router have issues when short
time network outrage happened. When this happened:
1. BACKUP(r-2) cannot receive the broadcast from MASTER(r-1).
2. Then r-2 would announce it's MASTER after 3 seconds, and send gratuitous ARP
to the gateway of public ip(usually a rack router).
3. The gateway of public ip would update it's ARP cache to associate the public
ip of the network to the MAC of r-2.
4. In the meantime, r-1 still sending out VRRP broadcast(due to network issue,
the broadcast never arrived at r-2), and acting as MASTER.
5. After network outrage, r-2 would receive the higher priority VRRP broadcast
from MASTER again, then receded as BACKUP.
6. But the public gateway would still associate public ip with MAC of r-2, thus
caused the issue. r-1 would no longer able to receive any packets from public
network.
And there is no way for r-1 to send gratuitous ARP again, because it's always
consider itself as MASTER, no state changed, and no hook existed for receiving
lower priority broadcast.
So I would revert this change, and introduce another commit to ensure the newly
create redundant router would share the same MAC as the first one.
This reverts commit 9f257aa60b62f24193bba3f7c902e7779632e01e.
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/c32dbec4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/c32dbec4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/c32dbec4
Branch: refs/heads/resizevolume
Commit: c32dbec468b176d4a6019d9e642eb9adc593bf36
Parents: 47251b5
Author: Sheng Yang <sh...@citrix.com>
Authored: Tue Jan 15 14:51:59 2013 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Tue Jan 15 15:02:21 2013 -0800
----------------------------------------------------------------------
.../router/VirtualNetworkApplianceManagerImpl.java | 26 +++------------
server/src/com/cloud/vm/dao/NicDao.java | 2 -
server/src/com/cloud/vm/dao/NicDaoImpl.java | 8 ----
3 files changed, 5 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c32dbec4/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 492e1dc..c8fd86e 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -1469,31 +1469,15 @@ 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
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c32dbec4/server/src/com/cloud/vm/dao/NicDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/server/src/com/cloud/vm/dao/NicDao.java
index af3c7b3..762048b 100644
--- a/server/src/com/cloud/vm/dao/NicDao.java
+++ b/server/src/com/cloud/vm/dao/NicDao.java
@@ -58,6 +58,4 @@ 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);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c32dbec4/server/src/com/cloud/vm/dao/NicDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/server/src/com/cloud/vm/dao/NicDaoImpl.java
index 00da2eb..3cd7fa6 100644
--- a/server/src/com/cloud/vm/dao/NicDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java
@@ -50,7 +50,6 @@ 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);
@@ -200,11 +199,4 @@ 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);
- }
}