Updated Branches:
  refs/heads/master-6-17-stable 74c168757 -> 53b40d233


Cloudstack-2150 DB table entries of phisical network is not proper.Shows 
Duplicate entries Cloudstack-2980 Adding a VLAN range that overlaps with two 
existing ranges results in inconsistent DB entries

Signed-off-by: Abhinandan Prateek <aprat...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/53b40d23
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/53b40d23
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/53b40d23

Branch: refs/heads/master-6-17-stable
Commit: 53b40d2337fe3f1ecfee982ecd99896118448fb0
Parents: 74c1687
Author: Bharat Kumar <bharat.ku...@citrix.com>
Authored: Wed Jun 26 20:55:30 2013 +0530
Committer: Abhinandan Prateek <aprat...@apache.org>
Committed: Fri Jun 28 14:52:54 2013 +0530

----------------------------------------------------------------------
 .../com/cloud/dc/dao/DataCenterVnetDaoImpl.java |  2 +-
 .../com/cloud/network/NetworkServiceImpl.java   | 85 ++++++++------------
 2 files changed, 34 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/53b40d23/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java 
b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
index e97f2c6..a2f7cde 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
@@ -113,7 +113,7 @@ public class DataCenterVnetDaoImpl extends 
GenericDaoBase<DataCenterVnetVO, Long
     
     @DB
     public void add(long dcId, long physicalNetworkId, int start, int end) {
-        String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, 
data_center_id, physical_network_id) VALUES ( ?, ?, ?)";
+        String insertVnet = "INSERT IGNORE INTO `cloud`.`op_dc_vnet_alloc` 
(vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)";
         
         Transaction txn = Transaction.currentTxn();
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/53b40d23/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java 
b/server/src/com/cloud/network/NetworkServiceImpl.java
index f88f600..04815ff 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -2561,7 +2561,7 @@ public class NetworkServiceImpl extends ManagerBase 
implements  NetworkService {
 
         if (removeVlan != null){
             List<Integer> tokens = processVlanRange(network,removeVlan);
-            boolean result = removeVlanRange(network, tokens.get(0), 
tokens.get(1));
+            removeVlanRange(network, tokens.get(0), tokens.get(1));
         }
 
         if (tags != null && tags.size() > 1) {
@@ -2589,7 +2589,6 @@ public class NetworkServiceImpl extends ManagerBase 
implements  NetworkService {
             network.setSpeed(networkSpeed);
         }
 
-        // Vnet range can be extended only
         boolean AddVnet = true;
         List<Pair<Integer, Integer>> vnetsToAdd = new ArrayList<Pair<Integer, 
Integer>>();
 
@@ -2606,7 +2605,6 @@ public class NetworkServiceImpl extends ManagerBase 
implements  NetworkService {
                     int existingStartVnet = existingRanges.get(j).first();
                     int existingEndVnet = existingRanges.get(j).second();
 
-                    // check if vnet is being extended
                     if (newStartVnet.intValue() >= existingStartVnet & 
newEndVnet.intValue() <= existingEndVnet) {
                         throw new InvalidParameterValueException("The vlan 
range you trying to add already exists.");
                     }
@@ -2630,80 +2628,63 @@ public class NetworkServiceImpl extends ManagerBase 
implements  NetworkService {
                         vnetsToAdd.add(new Pair<Integer, 
Integer>(existingEndVnet+1,newEndVnet));
                         existingRanges.get(j).first(newStartVnet);
                         existingRanges.get(j).second(newEndVnet);
+                        AddVnet = false;
                         break;
                     }
                 }
 
             }
             if (AddVnet){
-                    vnetsToAdd.add(new Pair<Integer, Integer>(newStartVnet, 
newEndVnet));
-                    existingRanges.add(new Pair<Integer, 
Integer>(newStartVnet,newEndVnet));
-            }
-
-            Map <Integer,Integer> vnetMap = new HashMap<Integer, 
Integer>(existingRanges.size());
-            Map <Integer, Integer> IndexMap = new HashMap<Integer, 
Integer>(existingRanges.size());
-            for (int i=0; i< existingRanges.size(); i++){
-                 
vnetMap.put(existingRanges.get(i).first(),existingRanges.get(i).second());
-                 IndexMap.put(existingRanges.get(i).first(),i);
+                vnetsToAdd.add(new Pair<Integer, Integer>(newStartVnet, 
newEndVnet));
+                existingRanges.add(new Pair<Integer, 
Integer>(newStartVnet,newEndVnet));
+                j= existingRanges.size()-1;
             }
-
             Integer value;
-            Integer index;
             String vnetString = "";
+
+            Integer changed_entry_start = existingRanges.get(j).first();
+            Integer changed_entry_end = existingRanges.get(j).second();
             for (int i=0; i < existingRanges.size(); i++){
-                 value = vnetMap.get((existingRanges.get(i).second()+1));
-                 if (value != null) {
-                     vnetMap.remove((existingRanges.get(i).second()+1));
-                     vnetMap.remove(existingRanges.get(i).first());
-                     vnetMap.put(existingRanges.get(i).first(),value);
-                     existingRanges.add(new 
Pair<Integer,Integer>(existingRanges.get(i).first(),value));
-                     index = IndexMap.get(existingRanges.get(i).second()+1);
-                     existingRanges.get(index).first(-1);
-                     existingRanges.get(index).second(-1);
-                     existingRanges.get(i).first(-1);
-                     existingRanges.get(i).second(-1);
-                 }
-                value = vnetMap.get((existingRanges.get(i).second()));
-                if (value != null && ( (existingRanges.get(i).second()) != 
(existingRanges.get(i).first()) )) {
-                    vnetMap.remove((existingRanges.get(i).second()));
-                    vnetMap.remove(existingRanges.get(i).first());
-                    vnetMap.put(existingRanges.get(i).first(),value);
-                    existingRanges.add(new 
Pair<Integer,Integer>(existingRanges.get(i).first(),value));
-                    index = IndexMap.get(existingRanges.get(i).second());
-                    existingRanges.get(index).first(-1);
-                    existingRanges.get(index).second(-1);
+                if (i !=j  && existingRanges.get(i).first()<=changed_entry_end 
&& existingRanges.get(i).second() >= changed_entry_end) {
+                    
existingRanges.get(j).second(existingRanges.get(i).second());
                     existingRanges.get(i).first(-1);
                     existingRanges.get(i).second(-1);
+                } else if ((i !=j  && changed_entry_end > 
existingRanges.get(i).second()) && changed_entry_start <= 
existingRanges.get(i).first()) {
+                    existingRanges.get(i).first(-1);
+                    existingRanges.get(i).second(-1);
+                }else if ((i != j ) &&  changed_entry_end > 
existingRanges.get(i).second() && changed_entry_start <= 
existingRanges.get(i).second() &&  existingRanges.get(i).first() <= 
changed_entry_start) {
+                    existingRanges.get(j).first(existingRanges.get(i).first());
+                    existingRanges.get(i).first(-1);
+                    existingRanges.get(i).first(-1);
                 }
             }
 
 
-
-            if (newVnetRangeString != null) {
-               for (Pair<Integer,Integer> vnetRange : existingRanges ){
-                    value=vnetMap.get(vnetRange.first());
-                    if (value != null){
-                        vnetString = 
vnetString+vnetRange.first().toString()+"-"+value.toString()+";";
-                    }
-               }
-               if (vnetString.length() > 0 && 
vnetString.charAt(vnetString.length()-1)==';') {
-                   vnetString = vnetString.substring(0, vnetString.length()-1);
-               }
-               network.setVnet(vnetString);
+            for (Pair<Integer,Integer> vnetRange : existingRanges ){
+                value=vnetRange.first();
+                if (value != -1){
+                    vnetString = 
vnetString+vnetRange.first().toString()+"-"+vnetRange.second().toString()+";";
+                }
             }
-
+            if (vnetString.length() > 0 && 
vnetString.charAt(vnetString.length()-1)==';') {
+                vnetString = vnetString.substring(0, vnetString.length()-1);
+            }
+            network.setVnet(vnetString);
+            Transaction txn = Transaction.currentTxn();
+            txn.start();
             for (Pair<Integer, Integer> vnetToAdd : vnetsToAdd) {
                 s_logger.debug("Adding vnet range " + vnetToAdd.first() + "-" 
+ vnetToAdd.second() + " for the physicalNetwork id= " + id + " and zone id=" + 
network.getDataCenterId()
-                    + " as a part of updatePhysicalNetwork call");
+                        + " as a part of updatePhysicalNetwork call");
                 _dcDao.addVnet(network.getDataCenterId(), network.getId(), 
vnetToAdd.first(), vnetToAdd.second());
             }
+            _physicalNetworkDao.update(id, network);
+            txn.commit();
         }
 
-        _physicalNetworkDao.update(id, network);
-
-        return network;
+        return  network;
     }
 
+
     private List<Integer> processVlanRange(PhysicalNetworkVO network, String 
removeVlan) {
         Integer StartVnet;
         Integer EndVnet;

Reply via email to