clarax commented on a change in pull request #3575:
URL: https://github.com/apache/hbase/pull/3575#discussion_r686549709



##########
File path: 
hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/BalancerClusterState.java
##########
@@ -699,102 +684,57 @@ void regionMoved(int region, int oldServer, int 
newServer) {
     // update for servers
     int primary = regionIndexToPrimaryIndex[region];
     if (oldServer >= 0) {
-      primariesOfRegionsPerServer[oldServer] =
-        removeRegion(primariesOfRegionsPerServer[oldServer], primary);
+      removeElement(primariesOfRegionsPerServer.get(oldServer), primary, 
region);
     }
-    primariesOfRegionsPerServer[newServer] =
-      addRegionSorted(primariesOfRegionsPerServer[newServer], primary);
+    addElement(primariesOfRegionsPerServer.get(newServer), primary, region);
 
     // update for hosts
     if (multiServersPerHost) {
-      int oldHost = oldServer >= 0 ? serverIndexToHostIndex[oldServer] : -1;
-      int newHost = serverIndexToHostIndex[newServer];
-      if (newHost != oldHost) {
-        regionsPerHost[newHost] = addRegion(regionsPerHost[newHost], region);
-        primariesOfRegionsPerHost[newHost] =
-          addRegionSorted(primariesOfRegionsPerHost[newHost], primary);
-        if (oldHost >= 0) {
-          regionsPerHost[oldHost] = removeRegion(regionsPerHost[oldHost], 
region);
-          primariesOfRegionsPerHost[oldHost] =
-            removeRegion(primariesOfRegionsPerHost[oldHost], primary); // will 
still be sorted
-        }
-      }
+      updateForLocation(serverIndexToHostIndex, regionsPerHost, 
primariesOfRegionsPerHost,
+        oldServer, newServer, primary, region);
     }
 
     // update for racks
     if (numRacks > 1) {
-      int oldRack = oldServer >= 0 ? serverIndexToRackIndex[oldServer] : -1;
-      int newRack = serverIndexToRackIndex[newServer];
-      if (newRack != oldRack) {
-        regionsPerRack[newRack] = addRegion(regionsPerRack[newRack], region);
-        primariesOfRegionsPerRack[newRack] =
-          addRegionSorted(primariesOfRegionsPerRack[newRack], primary);
-        if (oldRack >= 0) {
-          regionsPerRack[oldRack] = removeRegion(regionsPerRack[oldRack], 
region);
-          primariesOfRegionsPerRack[oldRack] =
-            removeRegion(primariesOfRegionsPerRack[oldRack], primary); // will 
still be sorted
-        }
-      }
-    }
-  }
-
-  int[] removeRegion(int[] regions, int regionIndex) {
-    // TODO: this maybe costly. Consider using linked lists
-    int[] newRegions = new int[regions.length - 1];
-    int i = 0;
-    for (i = 0; i < regions.length; i++) {
-      if (regions[i] == regionIndex) {
-        break;
-      }
-      newRegions[i] = regions[i];
+      updateForLocation(serverIndexToRackIndex, regionsPerRack, 
primariesOfRegionsPerRack,
+        oldServer, newServer, primary, region);
     }
-    System.arraycopy(regions, i + 1, newRegions, i, newRegions.length - i);
-    return newRegions;
-  }
-
-  int[] addRegion(int[] regions, int regionIndex) {
-    int[] newRegions = new int[regions.length + 1];
-    System.arraycopy(regions, 0, newRegions, 0, regions.length);
-    newRegions[newRegions.length - 1] = regionIndex;
-    return newRegions;
   }
 
-  int[] addRegionSorted(int[] regions, int regionIndex) {
-    int[] newRegions = new int[regions.length + 1];
-    int i = 0;
-    for (i = 0; i < regions.length; i++) { // find the index to insert
-      if (regions[i] > regionIndex) {
-        break;
+  /**
+   * Common method for per host and per rack region index updates when a 
region is moved.
+   * @param serverIndexToLocation serverIndexToHostIndex or 
serverIndexToRackIndex
+   * @param regionsPerLocation regionsPerHost or regionsPerRack
+   * @param primariesOfRegionsPerLocation primariesOfRegionsPerHost or 
primariesOfRegionsPerRack
+   */
+  private void updateForLocation(int[] serverIndexToLocation,
+    ArrayList<HashSet<Integer>> regionsPerLocation,
+    ArrayList<HashMap<Integer, ArrayList<Integer>>> 
primariesOfRegionsPerLocation,
+    int oldServer, int newServer, int primary, int region) {
+    int oldLocation = oldServer >= 0 ? serverIndexToLocation[oldServer] : -1;
+    int newLocation = serverIndexToLocation[newServer];
+    if (newLocation != oldLocation) {
+      regionsPerLocation.get(newLocation).add(region);
+      addElement(primariesOfRegionsPerLocation.get(newLocation), primary, 
region);

Review comment:
       O(n)->O(1) for adding an element. old methods needs array copy.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@hbase.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to