You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ra...@apache.org on 2014/10/21 07:35:24 UTC

git commit: PHOENIX-1238 Rollback index region split on any split failure(Rajeshbabu)

Repository: phoenix
Updated Branches:
  refs/heads/master 1816f6e81 -> 677e34cae


PHOENIX-1238 Rollback index region split on any split failure(Rajeshbabu)


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/677e34ca
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/677e34ca
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/677e34ca

Branch: refs/heads/master
Commit: 677e34cae36c57912b7ee1dd3173d0975c3bd25a
Parents: 1816f6e
Author: Rajeshbabu Chintaguntla <ra...@apache.org>
Authored: Tue Oct 21 05:35:06 2014 +0000
Committer: Rajeshbabu Chintaguntla <ra...@apache.org>
Committed: Tue Oct 21 05:35:06 2014 +0000

----------------------------------------------------------------------
 .../regionserver/IndexSplitTransaction.java     |  4 ++
 .../hbase/regionserver/LocalIndexSplitter.java  | 74 ++++++++++++++------
 2 files changed, 56 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/677e34ca/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexSplitTransaction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexSplitTransaction.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexSplitTransaction.java
index 87e7d81..18f1b0b 100644
--- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexSplitTransaction.java
+++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexSplitTransaction.java
@@ -971,4 +971,8 @@ public class IndexSplitTransaction {
     return ZKAssign.transitionNode(zkw, parent, serverName,
       beginState, endState, znodeVersion, payload);
   }
+  
+  public HRegion getParent() {
+    return this.parent;
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/677e34ca/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java
index 1afe6c7..acdb353 100644
--- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java
+++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java
@@ -62,31 +62,40 @@ public class LocalIndexSplitter extends BaseRegionObserver {
                         .getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_BYTES)))) {
             HRegion indexRegion = IndexUtil.getIndexRegion(environment);
             if (indexRegion == null) return;
-            st = new IndexSplitTransaction(indexRegion, splitKey);
-            if (!st.prepare()) {
-                LOG.error("Prepare for the table " + indexRegion.getTableDesc().getNameAsString()
+            try {
+                st = new IndexSplitTransaction(indexRegion, splitKey);
+                if (!st.prepare()) {
+                    LOG.error("Prepare for the table " + indexRegion.getTableDesc().getNameAsString()
                         + " failed. So returning null. ");
+                    ctx.bypass();
+                    return;
+                }
+                indexRegion.forceSplit(splitKey);
+                daughterRegions = st.stepsBeforePONR(rss, rss, false);
+                HRegionInfo copyOfParent = new HRegionInfo(indexRegion.getRegionInfo());
+                copyOfParent.setOffline(true);
+                copyOfParent.setSplit(true);
+                // Put for parent
+                Put putParent = MetaEditor.makePutFromRegionInfo(copyOfParent);
+                MetaEditor.addDaughtersToPut(putParent, daughterRegions.getFirst().getRegionInfo(),
+                    daughterRegions.getSecond().getRegionInfo());
+                metaEntries.add(putParent);
+                // Puts for daughters
+                Put putA = MetaEditor.makePutFromRegionInfo(daughterRegions.getFirst().getRegionInfo());
+                Put putB =
+                    MetaEditor.makePutFromRegionInfo(daughterRegions.getSecond().getRegionInfo());
+                st.addLocation(putA, rss.getServerName(), 1);
+                st.addLocation(putB, rss.getServerName(), 1);
+                metaEntries.add(putA);
+                metaEntries.add(putB);
+            } catch (Exception e) {
                 ctx.bypass();
-                return;
+                if (st != null){
+                    st.rollback(rss, rss);
+                    st = null;
+                    daughterRegions = null;
+                }
             }
-            indexRegion.forceSplit(splitKey);
-            daughterRegions = st.stepsBeforePONR(rss, rss, false);
-            HRegionInfo copyOfParent = new HRegionInfo(indexRegion.getRegionInfo());
-            copyOfParent.setOffline(true);
-            copyOfParent.setSplit(true);
-            // Put for parent
-            Put putParent = MetaEditor.makePutFromRegionInfo(copyOfParent);
-            MetaEditor.addDaughtersToPut(putParent, daughterRegions.getFirst().getRegionInfo(),
-                daughterRegions.getSecond().getRegionInfo());
-            metaEntries.add(putParent);
-            // Puts for daughters
-            Put putA = MetaEditor.makePutFromRegionInfo(daughterRegions.getFirst().getRegionInfo());
-            Put putB =
-                    MetaEditor.makePutFromRegionInfo(daughterRegions.getSecond().getRegionInfo());
-            st.addLocation(putA, rss.getServerName(), 1);
-            st.addLocation(putB, rss.getServerName(), 1);
-            metaEntries.add(putA);
-            metaEntries.add(putB);
         }
     }
 
@@ -98,4 +107,25 @@ public class LocalIndexSplitter extends BaseRegionObserver {
         HRegionServer rs = (HRegionServer) environment.getRegionServerServices();
         st.stepsAfterPONR(rs, rs, daughterRegions);
     }
+    
+    @Override
+    public void preRollBackSplit(ObserverContext<RegionCoprocessorEnvironment> ctx)
+            throws IOException {
+        RegionCoprocessorEnvironment environment = ctx.getEnvironment();
+        HRegionServer rs = (HRegionServer) environment.getRegionServerServices();
+        try {
+            if (st != null) {
+                st.rollback(rs, rs);
+                st = null;
+                daughterRegions = null;
+            }
+        } catch (Exception e) {
+            if (st != null) {
+                LOG.error("Error while rolling back the split failure for index region "
+                    + st.getParent(), e);
+            }
+            rs.abort("Abort; we got an error during rollback of index");
+        }
+    }
+
 }