-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/6781/#review11288
-----------------------------------------------------------


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.

- Alena Prokharchyk


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
> 
>

Reply via email to