From 7cfbd5b7e07e22deff0c51a0bf6074637e64f03d Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 10 Dec 2010 17:20:13 -0800 Subject: [PATCH] missing mac fields --- .../src/com/cloud/configuration/Config.java | 31 ++++++++++--------- .../com/cloud/dc/DataCenterIpAddressVO.java | 7 +++++ .../com/cloud/network/NetworkManagerImpl.java | 11 ++++--- .../src/com/cloud/network/dao/NetworkDao.java | 2 ++ .../com/cloud/network/dao/NetworkDaoImpl.java | 10 ++++++ .../cloud/network/dao/NetworkOpDaoImpl.java | 9 ++++++ .../com/cloud/network/dao/NetworkOpVO.java | 12 +++++++ setup/db/create-schema.sql | 3 +- 8 files changed, 65 insertions(+), 20 deletions(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 2d131f98999..d9dba788bab 100644 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -156,6 +156,7 @@ public enum Config { DirectAttachNetworkExternalAPIURL("Advanced", ManagementServer.class, String.class, "direct.attach.network.externalIpAllocator.url", null, "Direct-attach VMs using external DHCP server (API url)", null), CheckPodCIDRs("Advanced", ManagementServer.class, String.class, "check.pod.cidrs", "true", "If true, different pods must belong to different CIDR subnets.", "true,false"), MD5Hashed("Advanced", ManagementServer.class, Boolean.class, "security.password.md5hashed", "true", "If set to false password is sent in clear text or else md5hashed", null), + NetworkGcWait("Advanced", ManagementServer.class, Integer.class, "network.gc.wait", "600", "Seconds to wait before shutting down a network that's not in used", null), ControlCidr("Advanced", ManagementServer.class, String.class, "control.cidr", "169.254.0.0/16", "Changes the cidr for the control network traffic. Defaults to using link local. Must be unique within pods", null), ControlGateway("Advanced", ManagementServer.class, String.class, "control.gateway", "169.254.0.1", "gateway for the control network traffic", null), @@ -270,18 +271,19 @@ public enum Config { } public String getComponent() { - if (_componentClass == ManagementServer.class) - return "management-server"; - else if (_componentClass == AgentManager.class) - return "AgentManager"; - else if (_componentClass == UserVmManager.class) - return "UserVmManager"; - else if (_componentClass == HighAvailabilityManager.class) - return "HighAvailabilityManager"; - else if (_componentClass == StoragePoolAllocator.class) - return "StorageAllocator"; - else - return "none"; + if (_componentClass == ManagementServer.class) { + return "management-server"; + } else if (_componentClass == AgentManager.class) { + return "AgentManager"; + } else if (_componentClass == UserVmManager.class) { + return "UserVmManager"; + } else if (_componentClass == HighAvailabilityManager.class) { + return "HighAvailabilityManager"; + } else if (_componentClass == StoragePoolAllocator.class) { + return "StorageAllocator"; + } else { + return "none"; + } } public String getRange() { @@ -302,8 +304,9 @@ public enum Config { for (String category : categories) { List currentList = getConfigs(category); for (Config c : currentList) { - if (c.key().equals(name)) - return c; + if (c.key().equals(name)) { + return c; + } } } diff --git a/server/src/com/cloud/dc/DataCenterIpAddressVO.java b/server/src/com/cloud/dc/DataCenterIpAddressVO.java index 1a1ec159407..9ae0c9cbd63 100755 --- a/server/src/com/cloud/dc/DataCenterIpAddressVO.java +++ b/server/src/com/cloud/dc/DataCenterIpAddressVO.java @@ -56,6 +56,9 @@ public class DataCenterIpAddressVO { @Column(name="instance_id") private Long instanceId; + @Column(name="mac_address") + long macAddress; + protected DataCenterIpAddressVO() { } @@ -104,4 +107,8 @@ public class DataCenterIpAddressVO { public Date getTakenAt() { return takenAt; } + + public long getMacAddress() { + return macAddress; + } } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 8b9a852f0ca..cef7b221ea9 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -26,7 +26,6 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Random; import java.util.concurrent.ScheduledExecutorService; import javax.ejb.Local; @@ -116,6 +115,7 @@ import com.cloud.user.UserStatisticsVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.uservm.UserVm; +import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.Adapters; import com.cloud.utils.component.Inject; @@ -184,13 +184,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Adapters _networkElements; private HashMap _systemNetworks = new HashMap(5); - Random _rand = new Random(System.currentTimeMillis()); ScheduledExecutorService _executor; SearchBuilder AccountsUsingNetworkSearch; SearchBuilder AssignIpAddressSearch; SearchBuilder IpAddressSearch; + int _networkGcWait; private Map _configs; @@ -305,7 +305,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } assert(sourceNat != null) : "How do we get a bunch of ip addresses but none of them are source nat? account=" + ownerId + "; dc=" + dcId; - ip = new PublicIp(sourceNat, _vlanDao.findById(sourceNat.getVlanId()), sourceNat.getMacAddress() | 0x060000000000l | (((long)_rand.nextInt(32768) << 25) & 0x00fffe000000l)); + ip = new PublicIp(sourceNat, _vlanDao.findById(sourceNat.getVlanId()), NetUtils.createSequenceBasedMacAddress(sourceNat.getMacAddress())); } UserStatisticsVO stats = _userStatsDao.findBy(ownerId, dcId); @@ -747,6 +747,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag validateRemoteAccessVpnConfiguration(); Integer rateMbps = getIntegerConfigValue(Config.NetworkThrottlingRate.key(), null); Integer multicastRateMbps = getIntegerConfigValue(Config.MulticastThrottlingRate.key(), null); + _networkGcWait = NumbersUtil.parseInt(_configs.get(Config.NetworkGcWait.key()), 600); NetworkOfferingVO publicNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmPublicNetwork, TrafficType.Public, null); publicNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(publicNetworkOffering); @@ -2047,7 +2048,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag long currentTime = System.currentTimeMillis() >> 10; HashMap stillFree = new HashMap(); - List networkIds = _nicDao.listNetworksWithNoActiveNics(); + List networkIds = _networksDao.findNetworksToGarbageCollect(); for (Long networkId : networkIds) { Long time = _lastNetworkIdsToFree.remove(networkId); if (time == null) { @@ -2055,7 +2056,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag s_logger.debug("We found network " + networkId + " to be free for the first time. Adding it to the list: " + currentTime); } stillFree.put(networkId, currentTime); - } else if (time < (currentTime + 600)) { + } else if (time < (currentTime + _networkGcWait)) { if (s_logger.isDebugEnabled()) { s_logger.debug("Network " + networkId + " is still free but it's not time to shutdown yet: " + time); } diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index 370ebb18be6..2ebd8ad170d 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -52,4 +52,6 @@ public interface NetworkDao extends GenericDao { void changeActiveNicsBy(long networkId, int nicsCount); int getActiveNicsIn(long networkId); + List findNetworksToGarbageCollect(); + void clearCheckForGc(long networkId); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index bb988ac07b7..ddbb1514bd3 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -219,4 +219,14 @@ public class NetworkDaoImpl extends GenericDaoBase implements N public int getActiveNicsIn(long networkId) { return _opDao.getActiveNics(networkId); } + + @Override + public List findNetworksToGarbageCollect() { + return _opDao.getNetworksToGarbageCollect(); + } + + @Override + public void clearCheckForGc(long networkId) { + _opDao.clearCheckForGc(networkId); + } } diff --git a/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java b/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java index bb99fe965de..b6626c64942 100644 --- a/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java @@ -51,6 +51,7 @@ public class NetworkOpDaoImpl extends GenericDaoBase implemen GarbageCollectSearch.selectField(GarbageCollectSearch.entity().getId()); GarbageCollectSearch.and("activenics", GarbageCollectSearch.entity().getActiveNicsCount(), Op.EQ); GarbageCollectSearch.and("gc", GarbageCollectSearch.entity().isGarbageCollected(), Op.EQ); + GarbageCollectSearch.and("check", GarbageCollectSearch.entity().isCheckForGc(), Op.EQ); GarbageCollectSearch.done(); _activeNicsAttribute = _allAttributes.get("activeNicsCount"); @@ -61,6 +62,7 @@ public class NetworkOpDaoImpl extends GenericDaoBase implemen SearchCriteria sc = GarbageCollectSearch.create(); sc.setParameters("activenics", 0); sc.setParameters("gc", true); + sc.setParameters("check", true); return customSearch(sc, null); } @@ -77,9 +79,16 @@ public class NetworkOpDaoImpl extends GenericDaoBase implemen sc.setParameters("network", networkId); NetworkOpVO vo = createForUpdate(); + vo.setCheckForGc(true); UpdateBuilder builder = getUpdateBuilder(vo); builder.incr(_activeNicsAttribute, count); update(builder, sc, null); } + + public void clearCheckForGc(long networkId) { + NetworkOpVO vo = createForUpdate(); + vo.setCheckForGc(false); + update(networkId, vo); + } } diff --git a/server/src/com/cloud/network/dao/NetworkOpVO.java b/server/src/com/cloud/network/dao/NetworkOpVO.java index 6f314c83ac2..85d11e1dbdb 100644 --- a/server/src/com/cloud/network/dao/NetworkOpVO.java +++ b/server/src/com/cloud/network/dao/NetworkOpVO.java @@ -35,6 +35,9 @@ public class NetworkOpVO { @Column(name="gc") boolean garbageCollected; + + @Column(name="check_for_gc") + boolean checkForGc; protected NetworkOpVO() { } @@ -42,6 +45,7 @@ public class NetworkOpVO { public NetworkOpVO(long id, boolean gc) { this.id = id; this.garbageCollected = gc; + this.checkForGc = gc; this.activeNicsCount = 0; } @@ -60,4 +64,12 @@ public class NetworkOpVO { public boolean isGarbageCollected() { return garbageCollected; } + + public boolean isCheckForGc() { + return checkForGc; + } + + public void setCheckForGc(boolean check) { + checkForGc = check; + } } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 7e928f36d04..9744b9fe5aa 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -115,6 +115,7 @@ CREATE TABLE `cloud`.`op_networks`( `mac_address_seq` bigint unsigned NOT NULL DEFAULT 1 COMMENT 'mac address', `nics_count` int unsigned NOT NULL DEFAULT 0 COMMENT '# of nics', `gc` tinyint unsigned NOT NULL DEFAULT 1 COMMENT 'gc this network or not', + `check_for_gc` tinyint unsigned NOT NULL DEFAULT 1 COMMENT 'check this network for gc or not', PRIMARY KEY(`id`), CONSTRAINT `fk_op_networks__id` FOREIGN KEY (`id`) REFERENCES `networks`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -485,7 +486,7 @@ CREATE TABLE `cloud`.`load_balancer_vm_map` ( `id` bigint unsigned NOT NULL auto_increment, `load_balancer_id` bigint unsigned NOT NULL, `instance_id` bigint unsigned NOT NULL, - `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 when vm is set for revoke from load balancer', + `pending` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'whether the vm is being applied to the load balancer (pending=1) or has already been applied (pending=0)', PRIMARY KEY (`id`), UNIQUE KEY (`load_balancer_id`, `instance_id`), CONSTRAINT `fk_load_balancer_vm_map__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE,