You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by sa...@apache.org on 2016/11/22 02:54:25 UTC

[21/36] phoenix git commit: PHOENIX-3497 Provide a work around for HBASE-17122

PHOENIX-3497 Provide a work around for HBASE-17122


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

Branch: refs/heads/encodecolumns2
Commit: f4f2e949d0dd7e553e97df53b59d207bade774c2
Parents: 6e514f8
Author: Samarth <sa...@salesforce.com>
Authored: Thu Nov 17 23:37:14 2016 -0800
Committer: Samarth <sa...@salesforce.com>
Committed: Thu Nov 17 23:37:14 2016 -0800

----------------------------------------------------------------------
 .../apache/phoenix/end2end/AlterTableIT.java    | 24 ++++++++++++++++++++
 .../phoenix/iterate/BaseResultIterators.java    | 16 +++++++++++++
 .../org/apache/phoenix/util/ServerUtil.java     |  5 ++++
 3 files changed, 45 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/f4f2e949/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
index 48f4217..5da0ee7 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
@@ -40,12 +40,14 @@ import java.util.Properties;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeepDeletedCells;
+import org.apache.hadoop.hbase.TableNotEnabledException;
 import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.client.HTable;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.exception.PhoenixIOException;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
@@ -2207,5 +2209,27 @@ public class AlterTableIT extends ParallelStatsDisabledIT {
 		}
 	}
 	
+	@Test
+    public void testQueryingDisabledTable() throws Exception {
+        try (Connection conn = DriverManager.getConnection(getUrl())) {
+            String tableName = generateUniqueName();
+            conn.createStatement().execute(
+                    "CREATE TABLE " + tableName
+                    + " (k1 VARCHAR NOT NULL, k2 VARCHAR, CONSTRAINT PK PRIMARY KEY(K1,K2)) ");
+            try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) {
+                admin.disableTable(Bytes.toBytes(tableName));
+            }
+            String query = "SELECT * FROM " + tableName + " WHERE 1=1";
+            try (Connection conn2 = DriverManager.getConnection(getUrl())) {
+                try (ResultSet rs = conn2.createStatement().executeQuery(query)) {
+                    assertFalse(rs.next());
+                    fail();
+                } catch (PhoenixIOException ioe) {
+                    assertTrue(ioe.getCause() instanceof TableNotEnabledException);
+                }
+            }
+        }
+    }
+	
 }
  

http://git-wip-us.apache.org/repos/asf/phoenix/blob/f4f2e949/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
index 25f3bec..940dc56 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
@@ -52,6 +52,8 @@ import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.TableNotEnabledException;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
 import org.apache.hadoop.hbase.filter.PageFilter;
@@ -751,6 +753,20 @@ public abstract class BaseResultIterators extends ExplainTable implements Result
                         try { // Rethrow as SQLException
                             throw ServerUtil.parseServerException(e);
                         } catch (StaleRegionBoundaryCacheException e2) {
+                           /*
+                            * Note that a StaleRegionBoundaryCacheException could be thrown in multiple scenarios including splits, region
+                            * moves, table disabled, etc. See ServerUtil.parseServerException() for details. 
+                            * Because of HBASE-17122 we need to explicitly check whether this exception is being
+                            * thrown because the table was disabled or because a split happened. This obviously is a HACK.
+                            * With older versions of HBase we were correctly thrown a TableNotEnabledException so this 
+                            * kind of hackery wasn't needed.
+                            * TODO: remove this once HBASE-17122 is fixed.
+                            */
+                            try (HBaseAdmin admin = context.getConnection().getQueryServices().getAdmin()) {
+                                if (admin.isTableDisabled(physicalTableName)) {
+                                    throw new TableNotEnabledException(physicalTableName);
+                                }
+                            }
                             scanPairItr.remove();
                             // Catch only to try to recover from region boundary cache being out of date
                             if (!clearedCache) { // Clear cache once so that we rejigger job based on new boundaries

http://git-wip-us.apache.org/repos/asf/phoenix/blob/f4f2e949/phoenix-core/src/main/java/org/apache/phoenix/util/ServerUtil.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/ServerUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/ServerUtil.java
index 6e2bbba..aee1c2e 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/ServerUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/ServerUtil.java
@@ -115,6 +115,11 @@ public class ServerUtil {
     
     public static SQLException parseServerExceptionOrNull(Throwable t) {
         while (t.getCause() != null) {
+            /*
+             * Note that a NotServingRegionException could be thrown in multiple scenarios including splits, region
+             * move, table disabled, etc. This is a hack and is meant to address the buggy behavior introduced in HBase
+             * 0.98.21 and beyond. See HBASE-17122 for details.
+             */
             if (t instanceof NotServingRegionException) {
                 return parseRemoteException(new StaleRegionBoundaryCacheException());
             }