> On Sept. 10, 2012, 9:31 p.m., Alena Prokharchyk wrote: > > 1) Have to hange the logic below; we have to reduce the number of iteration. > > > > * start with getting the PODs having user vms. > > * Only for those pods check if there are any VRs running. > > > > Now you are doing it the other way around, and it increases the number of > > iterations. Plus see all the comments that I've made, inline: > > > > > > + DataCenter dc = _dcDao.findById(network.getDataCenterId()); > > + //Pod based network restart for basic network, one VR per pod > > + if (dc.getNetworkType() == NetworkType.Basic) { > > + //Loop through all pods with running user vms and restart > > network > > + for (HostPodVO pod: > > _podDao.listByDataCenterId(dc.getId())) { > > + s_logger.debug("Trying to restart network for Pod: " + > > pod.getName() + ", id=" + pod.getId()); > > + //If cleanup is false, don't implement network on > > running VRs > > + List<DomainRouterVO> virtualRouters = > > _domainRouterDao.listByPodId(pod.getId()); > > + Boolean podHasSingleVR = (virtualRouters.size() == 1); > > > > + if (!podHasSingleVR) { - COMMENT: wrong assumptions to > > make. Pod might not have any VRs if there are no user vms exist. > > + s_logger.warn("Pod should have only one VR in > > Basic Zone, please check!"); - COMMENT: put assert statement for developers > > here > > + } > > + if (!cleanup && virtualRouters != null && > > podHasSingleVR > > + && virtualRouters.get(0).getState() == > > VirtualMachine.State.Running) { - COMMENT: check for Starting state as > > well. If the router is starting, no need to start a new one. Also remove > > (virtualRouters != null) as DAO never returns NULL, it always returns an > > empty set. > > + s_logger.debug("Cleanup=false: Found a running VR, > > skipping network implementation for the pod"); > > + continue; > > + } > > > > > > > > + //Implement network only if there are running user vms > > in 'pod' > > + List<VMInstanceVO> vms = > > _vmDao.listByPodId(pod.getId()); COMMENT: instead of pulling all vms, and > > then iterating through them one by one and checking state and type, call > > Dao method to return you only user vms, and only in Running state. > > Besides, never call list, call COUNT function inside the DAO as we just > > need to know how many vms are running, and don't need to know the details > > > > + for (VMInstanceVO vm: vms) { - COMMENT - incorrect > > kind of logic. We shouldn't call implementNetworkElementsAndResources per > > each pod as this call actually does netowrk rules implementation for the > > ENTIRE network, and you manage to call it per each Pod. And the provider > > for Basic network is not always the Virtual router, it can be Netscaler as > > well. Placing VR implementation details in Network manager, and do the > > determination based on the fact that VR is the only one provider, is > > incorrect. See my comment #2 showing how this logic needs to be changed. > > All the changes affecting Virtual Router behavior, should be placed in the > > Virtual Router manager. > > > > > > + // implement the network elements and rules again > > + if (vm.getType() == Type.User && vm.getState() == > > VirtualMachine.State.Running) { > > + DeployDestination dest = new > > DeployDestination(dc, pod, null, null); > > + implementNetworkElementsAndResources(dest, > > context, network, offering); > > + break; > > + } > > + } > > + } > > + } else { > > + // implement the network elements and rules again > > + DeployDestination dest = new DeployDestination(dc, null, > > null, null); > > + implementNetworkElementsAndResources(dest, context, > > network, offering); > > + } > > setRestartRequired(network, true); > > > > > > 2) The logic shouldn't be a part of NetworkManagerImpl. It's wrong to call > > implementNetworkElementsAndResources() per each POD as this call don't just > > triggers VR restart, but also does network rules re-implement. For each and > > every pod in the network, it's going to re-implement ALL the rules in each > > iteration. Plus network manager should never know how > > > > > > All the logic should be done in the VirtualRouterManager instead: > > > > * From the networkManagerImpl, don't distinguish what Zone the restart is > > called for. Use the same logic as we used to use before: > > > > try { > > implementNetworkElementsAndResources(dest, context, network, > > offering); > > setRestartRequired(network, true); > > } catch (Exception ex) { > > s_logger.warn("Failed to implement network " + network + " > > elements and resources as a part of network restart due to ", ex); > > return false; > > } > > > > * In the Virtual Router manager, check the zone/dest info. If the zone is > > Basic, and dest is missing pod information, restart-recreate the VR in all > > the pods that have user vms running.
> List<VMInstanceVO> vms = _vmDao.listByPodId(pod.getId()); > COMMENT: instead of pulling all vms, and then iterating through them one by > one and checking state and type, call Dao method to return you only user vms, > and only in Running state. Besides, never call list, call COUNT function > inside the DAO as we just need to know how many vms are running, and don't > need to know the details I think we should also consider the case when user vms are starting. >All the logic should be done in the VirtualRouterManager instead: No class by that name. Okay I understand the issue. Which would be a better place to implement this logic; in VirtualRouterElement::implement (Don't know the effect on VPC) or in VirtualNetworkApplianceManagerImpl::deployVirtualRouterInGuestNetwork or in VirtualNetworkApplianceManagerImpl::findOrDeployVirtualRouterInGuestNetwork Or we change the behaviour how we find and deploy the routers, the getDeploymentPlanAndRouters to return a list of pair of deployment plan, list of routers; >From Pair<DeploymentPlan, List<DomainRouterVO>> to: List<Pair<DeploymentPlan, List<DomainRouterVO>>> getDeploymentPlanAndRouters New Logic: + if (dc.getNetworkType() == NetworkType.Basic) { + for (HostPodVO pod: _podDao.listByDataCenterId(dc.getId())) { + + List<DomainRouterVO> virtualRouters = _domainRouterDao.listByPodId(pod.getId()); + assert (virtualRouters.size() <= 1) : "Pod can have utmost one VR in Basic Zone, please check!"; + + if (!cleanup && (virtualRouters.size() > 0) + && (virtualRouters.get(0).getState() == VirtualMachine.State.Running + || virtualRouters.get(0).getState() == VirtualMachine.State.Starting)) { + s_logger.debug("Cleanup=false: Found a running VR, skipping network implementation for the pod"); + continue; + } + + Long totalRunningOrStartingUserVMs = _vmDao.countByPodIdVMTypeAndState(pod.getId(), Type.User, VirtualMachine.State.Running) + + _vmDao.countByPodIdVMTypeAndState(pod.getId(), Type.User, VirtualMachine.State.Starting); + + if (totalRunningOrStartingUserVMs > 0L) { + s_logger.warn("Found total " + totalRunningOrStartingUserVMs + " running or starting User VMs"); + // implement the network elements and rules again + // PUT HERE CODE TO find or deploy router + } + } + } + else {//HANDLE OTHER CASE} - Rohit ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/6781/#review11288 ----------------------------------------------------------- On Aug. 27, 2012, 11:10 a.m., Rohit Yadav wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/6781/ > ----------------------------------------------------------- > > (Updated Aug. 27, 2012, 11:10 a.m.) > > > Review request for cloudstack, Abhinandan Prateek, Alena Prokharchyk, and > Chiradeep Vittal. > > > Description > ------- > > Patch as per discussion on ML and http://bugs.cloudstack.org/browse/CS-16104 > > For git am: > Download original patch: http://patchbin.baagi.org/p?id=yfawv5 > > > This addresses bug CS-16104. > > > Diffs > ----- > > server/src/com/cloud/network/NetworkManagerImpl.java 817075e > server/src/com/cloud/vm/dao/DomainRouterDao.java 01e3258 > server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java 175d3f2 > server/src/com/cloud/vm/dao/VMInstanceDao.java 2cf3d75 > server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java 571b5d1 > ui/scripts/network.js ec32c49 > > Diff: https://reviews.apache.org/r/6781/diff/ > > > Testing > ------- > > > Thanks, > > Rohit Yadav > >