You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by td...@apache.org on 2015/11/18 00:39:39 UTC

phoenix git commit: code cleanup

Repository: phoenix
Updated Branches:
  refs/heads/txn da260160b -> ba952bc7c


code cleanup


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

Branch: refs/heads/txn
Commit: ba952bc7ca5876fda69c97a9f3025e418d67c3bb
Parents: da26016
Author: Thomas D'Silva <td...@salesforce.com>
Authored: Tue Nov 17 15:39:25 2015 -0800
Committer: Thomas D'Silva <td...@salesforce.com>
Committed: Tue Nov 17 15:39:25 2015 -0800

----------------------------------------------------------------------
 .../apache/phoenix/end2end/AlterTableIT.java    |   2 +-
 .../end2end/index/MutableIndexFailureIT.java    | 555 ++++++++++---------
 .../end2end/index/txn/MutableRollbackIT.java    |  17 +
 .../phoenix/end2end/index/txn/RollbackIT.java   |  17 +
 .../end2end/index/txn/TxWriteFailureIT.java     |  17 +
 .../phoenix/compile/BaseMutationPlan.java       |   2 +-
 .../phoenix/compile/CreateFunctionCompiler.java |   2 +-
 .../phoenix/compile/CreateIndexCompiler.java    |   2 +-
 .../phoenix/compile/CreateTableCompiler.java    |   2 +-
 .../apache/phoenix/compile/DeleteCompiler.java  |   2 +-
 .../phoenix/compile/ListJarsQueryPlan.java      |   2 +-
 .../apache/phoenix/compile/MutationPlan.java    |   2 +-
 .../apache/phoenix/compile/PostDDLCompiler.java |   2 +-
 .../org/apache/phoenix/compile/QueryPlan.java   |   1 -
 .../apache/phoenix/compile/StatementPlan.java   |   2 +-
 .../apache/phoenix/compile/UpsertCompiler.java  |   2 +-
 .../apache/phoenix/execute/BaseQueryPlan.java   |   3 +-
 .../phoenix/execute/DelegateQueryPlan.java      |   2 +-
 18 files changed, 342 insertions(+), 292 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/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 fc90af0..cdf7b5d 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
@@ -2178,4 +2178,4 @@ public class AlterTableIT extends BaseOwnClusterHBaseManagedTimeIT {
     }
     
 }
- 
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java
index aee729f..9c6b161 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java
@@ -93,6 +93,7 @@ import org.junit.runners.Parameterized.Parameters;
 @RunWith(Parameterized.class)
 public class MutableIndexFailureIT extends BaseTest {
     private static final int NUM_SLAVES = 4;
+    private static String url;
     private static PhoenixTestDriver driver;
     private static HBaseTestingUtility util;
     private Timer scheduleTimer;
@@ -101,13 +102,13 @@ public class MutableIndexFailureIT extends BaseTest {
     private static final String INDEX_TABLE_NAME = "I";
     private static final String DATA_TABLE_FULL_NAME = SchemaUtil.getTableName(SCHEMA_NAME, "T");
     private static final String INDEX_TABLE_FULL_NAME = SchemaUtil.getTableName(SCHEMA_NAME, "I");
-    
-    private boolean transactional; 
-	private final String tableDDLOptions;
-    
+
+    private boolean transactional;
+    private final String tableDDLOptions;
+
     public MutableIndexFailureIT(boolean transactional) {
-		this.transactional = transactional;
-		this.tableDDLOptions = transactional ? " TRANSACTIONAL=true " : "";
+        this.transactional = transactional;
+        this.tableDDLOptions = transactional ? " TRANSACTIONAL=true " : "";
     }
     
     @Before
@@ -127,15 +128,11 @@ public class MutableIndexFailureIT extends BaseTest {
         url = JDBC_PROTOCOL + JDBC_PROTOCOL_SEPARATOR + LOCALHOST + JDBC_PROTOCOL_SEPARATOR + clientPort
                 + JDBC_PROTOCOL_TERMINATOR + PHOENIX_TEST_DRIVER_URL_PARAM;
         driver = initAndRegisterDriver(url, ReadOnlyProps.EMPTY_PROPS);
-		clusterInitialized = true;
-		setupTxManager();
     }
-	
-	@Parameters(name="transactional = {0}")
+    
+    @Parameters(name = "transactional = {0}")
     public static Collection<Boolean[]> data() {
-        return Arrays.asList(new Boolean[][] {     
-                 { false}, {true } 
-           });
+        return Arrays.asList(new Boolean[][] { { false }, { true } });
     }
 
     @After
@@ -157,278 +154,282 @@ public class MutableIndexFailureIT extends BaseTest {
     @Ignore("See PHOENIX-2331")
     @Test(timeout=300000)
     public void testWriteFailureDisablesLocalIndex() throws Exception {
-    	helpTestWriteFailureDisablesIndex(true);
+        helpTestWriteFailureDisablesIndex(true);
     }
  
     @Ignore("See PHOENIX-2332")
     @Test(timeout=300000)
-    public void testWriteFailureDisablesGlobalIndex() throws Exception {
-    	helpTestWriteFailureDisablesIndex(false);
-    }
-
-    private void helpTestWriteFailureDisablesIndex(boolean localIndex) throws Exception {
-        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
-        try (Connection conn = driver.connect(url, props);) {
-        	String query;
-        	ResultSet rs;
-	        conn.setAutoCommit(false);
-	        conn.createStatement().execute(
-	                "CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)" + tableDDLOptions);
-	        query = "SELECT * FROM " + DATA_TABLE_FULL_NAME;
-	        rs = conn.createStatement().executeQuery(query);
-	        assertFalse(rs.next());
-	
-	        if(localIndex) {
-	            conn.createStatement().execute(
-	                "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)");
-	            conn.createStatement().execute(
-	                "CREATE LOCAL INDEX " + INDEX_TABLE_NAME+ "_2" + " ON " + DATA_TABLE_FULL_NAME + " (v2) INCLUDE (v1)");
-	        } else {
-	            conn.createStatement().execute(
-	                "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)");
-	        }
-	            
-	        query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME;
-	        rs = conn.createStatement().executeQuery(query);
-	        assertFalse(rs.next());
-	
-	        // Verify the metadata for index is correct.
-	        rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
-	                new String[] { PTableType.INDEX.toString() });
-	        assertTrue(rs.next());
-	        assertEquals(INDEX_TABLE_NAME, rs.getString(3));
-	        assertEquals(PIndexState.ACTIVE.toString(), rs.getString("INDEX_STATE"));
-	        assertFalse(rs.next());
-	        
-	        PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
-	        stmt.setString(1, "a");
-	        stmt.setString(2, "x");
-	        stmt.setString(3, "1");
-	        stmt.execute();
-	        conn.commit();
-	
-	        TableName indexTable =
-	                TableName.valueOf(localIndex ? MetaDataUtil
-	                        .getLocalIndexTableName(DATA_TABLE_FULL_NAME) : INDEX_TABLE_FULL_NAME);
-	        HBaseAdmin admin = this.util.getHBaseAdmin();
-	        HTableDescriptor indexTableDesc = admin.getTableDescriptor(indexTable);
-	        try{
-	          admin.disableTable(indexTable);
-	          admin.deleteTable(indexTable);
-	        } catch (TableNotFoundException ignore) {}
-	
-	        stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
-	        stmt.setString(1, "a2");
-	        stmt.setString(2, "x2");
-	        stmt.setString(3, "2");
-	        stmt.execute();
-	        
-	        if (transactional) {
-	            try {
-	                conn.commit();
-	                fail();
-	            } catch (SQLException e1) {
-		        	try {
-		        		conn.rollback();
-		        		fail();
-		        	} catch (SQLException e2) {
-		        		// rollback fails as well because index is disabled
-		        	}
-	            }
-	        }
-	        else {
-	        	conn.commit();
-	        }
-	        
-	        // Verify the metadata for index is correct.
-	        rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
-	                new String[] { PTableType.INDEX.toString() });
-	        assertTrue(rs.next());
-	        assertEquals(INDEX_TABLE_NAME, rs.getString(3));
-	        // if the table is transactional, the index will not be disabled if there is a failure
-	        PIndexState indexState = transactional ? PIndexState.ACTIVE : PIndexState.DISABLE;
-			assertEquals(indexState.toString(), rs.getString("INDEX_STATE"));
-	        assertFalse(rs.next());
-	        if(localIndex) {
-	            rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME+"_2",
-	                new String[] { PTableType.INDEX.toString() });
-	            assertTrue(rs.next());
-	            assertEquals(INDEX_TABLE_NAME+"_2", rs.getString(3));
-	            assertEquals(indexState.toString(), rs.getString("INDEX_STATE"));
-	            assertFalse(rs.next());
-	        }
-	
-	        // if the table is transactional the write to the index table  will fail because the index has not been disabled
-	        if (!transactional) {
-		        // Verify UPSERT on data table still work after index is disabled       
-		        stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
-		        stmt.setString(1, "a3");
-		        stmt.setString(2, "x3");
-		        stmt.setString(3, "3");
-		        stmt.execute();
-		        conn.commit();
-	        }
-	        
-	        if (transactional) {
-	        	// if the table was transactional there should be 1 row (written before the index was disabled)
-	        	query = "SELECT /*+ NO_INDEX */ v2 FROM " + DATA_TABLE_FULL_NAME;
-		        rs = conn.createStatement().executeQuery("EXPLAIN " + query);
-		        String expectedPlan = "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + DATA_TABLE_FULL_NAME;
-				assertEquals(expectedPlan, QueryUtil.getExplainPlan(rs));
-		        rs = conn.createStatement().executeQuery(query);
-		        assertTrue(rs.next());
-	        	assertEquals("1", rs.getString(1));
-	        	assertFalse(rs.next());
-	        } else {
-	        	// if the table was not transactional there should be three rows (all writes to data table should succeed)
-		        query = "SELECT v2 FROM " + DATA_TABLE_FULL_NAME;
-		        rs = conn.createStatement().executeQuery("EXPLAIN " + query);
-		        String expectedPlan = "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + DATA_TABLE_FULL_NAME;
-				assertEquals(expectedPlan, QueryUtil.getExplainPlan(rs));
-		        rs = conn.createStatement().executeQuery(query);
-	        	assertTrue(rs.next());
-	        	assertEquals("1", rs.getString(1));
-	        	assertTrue(rs.next());
-	        	assertEquals("2", rs.getString(1));
-	        	assertTrue(rs.next());
-	        	assertEquals("3", rs.getString(1));
-	        	assertFalse(rs.next());
-	        }
-	        
-	        // recreate index table
-	        admin.createTable(indexTableDesc);
-	        do {
-	          rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
-	              new String[] { PTableType.INDEX.toString() });
-	          assertTrue(rs.next());
-	          if(PIndexState.ACTIVE.toString().equals(rs.getString("INDEX_STATE"))){
-	              break;
-	          }
-	          if(localIndex) {
-	              rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME+"_2",
-	                  new String[] { PTableType.INDEX.toString() });
-	              assertTrue(rs.next());
-	              if(PIndexState.ACTIVE.toString().equals(rs.getString("INDEX_STATE"))){
-	                  break;
-	              }
-	          }
-	          Thread.sleep(15 * 1000); // sleep 15 secs
-	        } while(true);
-	        
-	        // Verify UPSERT on data table still work after index table is recreated       
-	        stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
-	        stmt.setString(1, "a4");
-	        stmt.setString(2, "x4");
-	        stmt.setString(3, "4");
-	        stmt.execute();
-	        conn.commit();
-	        
-	        // verify index table has data
-	        query = "SELECT count(1) FROM " + INDEX_TABLE_FULL_NAME;
-	        rs = conn.createStatement().executeQuery(query);
-	        assertTrue(rs.next());
-	        
-	        // for txn tables there will be only one row in the index (a4)
-	        // for non txn tables there will be three rows because we only partially build index from where we failed and the oldest 
-	        // index row has been deleted when we dropped the index table during test
-	        assertEquals( transactional ? 1: 3, rs.getInt(1));
-        }
+    public void testWriteFailureDisablesIndex() throws Exception {
+        helpTestWriteFailureDisablesIndex(false);
     }
     
-    @Test(timeout=300000)
-    public void testWriteFailureWithRegionServerDown() throws Exception {
+    public void helpTestWriteFailureDisablesIndex(boolean localIndex) throws Exception {
         Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
-        try (Connection conn = driver.connect(url, props);) {
-        	String query;
-        	ResultSet rs;
-	        conn.setAutoCommit(false);
-	        conn.createStatement().execute(
-	                "CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)");
-	        query = "SELECT * FROM " + DATA_TABLE_FULL_NAME;
-	        rs = conn.createStatement().executeQuery(query);
-	        assertFalse(rs.next());
-	
-	        conn.createStatement().execute(
-	                "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)");
-	        query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME;
-	        rs = conn.createStatement().executeQuery(query);
-	        assertFalse(rs.next());
-	
-	        // Verify the metadata for index is correct.
-	        rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
-	                new String[] { PTableType.INDEX.toString() });
-	        assertTrue(rs.next());
-	        assertEquals(INDEX_TABLE_NAME, rs.getString(3));
-	        assertEquals(PIndexState.ACTIVE.toString(), rs.getString("INDEX_STATE"));
-	        assertFalse(rs.next());
-	        
-	        PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
-	        stmt.setString(1, "a");
-	        stmt.setString(2, "x");
-	        stmt.setString(3, "1");
-	        stmt.execute();
-	        conn.commit();
-	        
-	        // find a RS which doesn't has CATALOG table
-	        TableName catalogTable = TableName.valueOf("SYSTEM.CATALOG");
-	        TableName indexTable = TableName.valueOf(INDEX_TABLE_FULL_NAME);
-	        final HBaseCluster cluster = this.util.getHBaseCluster();
-	        Collection<ServerName> rss = cluster.getClusterStatus().getServers();
-	        HBaseAdmin admin = this.util.getHBaseAdmin();
-	        List<HRegionInfo> regions = admin.getTableRegions(catalogTable);
-	        ServerName catalogRS = cluster.getServerHoldingRegion(regions.get(0).getTable(),
-			regions.get(0).getRegionName());
-	        ServerName metaRS = cluster.getServerHoldingMeta();
-	        ServerName rsToBeKilled = null;
-	        
-	        // find first RS isn't holding META or CATALOG table
-	        for(ServerName curRS : rss) {
-	            if(!curRS.equals(catalogRS) && !metaRS.equals(curRS)) {
-	                rsToBeKilled = curRS;
-	                break;
-	            }
-	        }
-	        assertTrue(rsToBeKilled != null);
-	        
-	        regions = admin.getTableRegions(indexTable);
-	        final HRegionInfo indexRegion = regions.get(0);
-	        final ServerName dstRS = rsToBeKilled;
-	        admin.move(indexRegion.getEncodedNameAsBytes(), Bytes.toBytes(rsToBeKilled.getServerName()));
-	        this.util.waitFor(30000, 200, new Waiter.Predicate<Exception>() {
-	            @Override
-	            public boolean evaluate() throws Exception {
-		      ServerName sn = cluster.getServerHoldingRegion(indexRegion.getTable(),
-			      	indexRegion.getRegionName());
-	              return (sn != null && sn.equals(dstRS));
-	            }
-	          });
-	        
-	        // use timer sending updates in every 10ms
-	        this.scheduleTimer = new Timer(true);
-	        this.scheduleTimer.schedule(new SendingUpdatesScheduleTask(conn), 0, 10);
-	        // let timer sending some updates
-	        Thread.sleep(100);
-	        
-	        // kill RS hosting index table
-	        this.util.getHBaseCluster().killRegionServer(rsToBeKilled);
-	        
-	        // wait for index table completes recovery
-	        this.util.waitUntilAllRegionsAssigned(indexTable);
-	        
-	        // Verify the metadata for index is correct.       
-	        do {
-	          Thread.sleep(15 * 1000); // sleep 15 secs
-	          rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
-	              new String[] { PTableType.INDEX.toString() });
-	          assertTrue(rs.next());
-	          if(PIndexState.ACTIVE.toString().equals(rs.getString("INDEX_STATE"))){
-	              break;
-	          }
-	        } while(true);
-	        this.scheduleTimer.cancel();
-	        
-	        assertEquals(cluster.getClusterStatus().getDeadServers(), 1);
+        try (Connection conn = driver.connect(url, props)) {
+            String query;
+            ResultSet rs;
+            conn.setAutoCommit(false);
+            conn.createStatement().execute(
+                    "CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)");
+            query = "SELECT * FROM " + DATA_TABLE_FULL_NAME;
+            rs = conn.createStatement().executeQuery(query);
+            assertFalse(rs.next());
+    
+            if(localIndex) {
+                conn.createStatement().execute(
+                    "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)");
+                conn.createStatement().execute(
+                    "CREATE LOCAL INDEX " + INDEX_TABLE_NAME+ "_2" + " ON " + DATA_TABLE_FULL_NAME + " (v2) INCLUDE (v1)");
+            } else {
+                conn.createStatement().execute(
+                    "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)");
+            }
+                
+            query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME;
+            rs = conn.createStatement().executeQuery(query);
+            assertFalse(rs.next());
+    
+            // Verify the metadata for index is correct.
+            rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
+                    new String[] { PTableType.INDEX.toString() });
+            assertTrue(rs.next());
+            assertEquals(INDEX_TABLE_NAME, rs.getString(3));
+            assertEquals(PIndexState.ACTIVE.toString(), rs.getString("INDEX_STATE"));
+            assertFalse(rs.next());
+            
+            PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
+            stmt.setString(1, "a");
+            stmt.setString(2, "x");
+            stmt.setString(3, "1");
+            stmt.execute();
+            conn.commit();
+    
+            TableName indexTable =
+                    TableName.valueOf(localIndex ? MetaDataUtil
+                            .getLocalIndexTableName(DATA_TABLE_FULL_NAME) : INDEX_TABLE_FULL_NAME);
+            HBaseAdmin admin = this.util.getHBaseAdmin();
+            HTableDescriptor indexTableDesc = admin.getTableDescriptor(indexTable);
+            try{
+              admin.disableTable(indexTable);
+              admin.deleteTable(indexTable);
+            } catch (TableNotFoundException ignore) {}
+    
+            stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
+            stmt.setString(1, "a2");
+            stmt.setString(2, "x2");
+            stmt.setString(3, "2");
+            stmt.execute();
+            if (transactional) {
+                try {
+                    conn.commit();
+                    fail();
+                } catch (SQLException e1) {
+                    try {
+                        conn.rollback();
+                        fail();
+                    } catch (SQLException e2) {
+                        // rollback fails as well because index is disabled
+                    }
+                }
+            }
+            else {
+                conn.commit();
+            }
+    
+            // Verify the metadata for index is correct.
+            rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
+                    new String[] { PTableType.INDEX.toString() });
+            assertTrue(rs.next());
+            assertEquals(INDEX_TABLE_NAME, rs.getString(3));
+            assertEquals(PIndexState.DISABLE.toString(), rs.getString("INDEX_STATE"));
+            assertFalse(rs.next());
+            if(localIndex) {
+                rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME+"_2",
+                    new String[] { PTableType.INDEX.toString() });
+                assertTrue(rs.next());
+                assertEquals(INDEX_TABLE_NAME+"_2", rs.getString(3));
+                assertEquals(PIndexState.DISABLE.toString(), rs.getString("INDEX_STATE"));
+                assertFalse(rs.next());
+            }
+    
+            // if the table is transactional the write to the index table will fail because the
+            // index has not been disabled
+            if (!transactional) {
+                // Verify UPSERT on data table still work after index is disabled
+                stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
+                stmt.setString(1, "a3");
+                stmt.setString(2, "x3");
+                stmt.setString(3, "3");
+                stmt.execute();
+                conn.commit();
+            }
+            
+            if (transactional) {
+                // if the table was transactional there should be 1 row (written before the index
+                // was disabled)
+                query = "SELECT /*+ NO_INDEX */ v2 FROM " + DATA_TABLE_FULL_NAME;
+                rs = conn.createStatement().executeQuery("EXPLAIN " + query);
+                String expectedPlan =
+                        "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + DATA_TABLE_FULL_NAME;
+                assertEquals(expectedPlan, QueryUtil.getExplainPlan(rs));
+                rs = conn.createStatement().executeQuery(query);
+                assertTrue(rs.next());
+                assertEquals("1", rs.getString(1));
+                assertFalse(rs.next());
+            } else {
+                // if the table was not transactional there should be three rows (all writes to data
+                // table should succeed)
+                query = "SELECT v2 FROM " + DATA_TABLE_FULL_NAME;
+                rs = conn.createStatement().executeQuery("EXPLAIN " + query);
+                String expectedPlan =
+                        "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + DATA_TABLE_FULL_NAME;
+                assertEquals(expectedPlan, QueryUtil.getExplainPlan(rs));
+                rs = conn.createStatement().executeQuery(query);
+                assertTrue(rs.next());
+                assertEquals("1", rs.getString(1));
+                assertTrue(rs.next());
+                assertEquals("2", rs.getString(1));
+                assertTrue(rs.next());
+                assertEquals("3", rs.getString(1));
+                assertFalse(rs.next());
+            }
+            
+            // recreate index table
+            admin.createTable(indexTableDesc);
+            do {
+              Thread.sleep(15 * 1000); // sleep 15 secs
+              rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
+                  new String[] { PTableType.INDEX.toString() });
+              assertTrue(rs.next());
+              if(PIndexState.ACTIVE.toString().equals(rs.getString("INDEX_STATE"))){
+                  break;
+              }
+              if(localIndex) {
+                  rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME+"_2",
+                      new String[] { PTableType.INDEX.toString() });
+                  assertTrue(rs.next());
+                  if(PIndexState.ACTIVE.toString().equals(rs.getString("INDEX_STATE"))){
+                      break;
+                  }
+              }
+            } while(true);
+            
+            // Verify UPSERT on data table still work after index table is recreated
+            stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
+            stmt.setString(1, "a4");
+            stmt.setString(2, "x4");
+            stmt.setString(3, "4");
+            stmt.execute();
+            conn.commit();
+
+            // verify index table has data
+            query = "SELECT count(1) FROM " + INDEX_TABLE_FULL_NAME;
+            rs = conn.createStatement().executeQuery(query);
+            assertTrue(rs.next());
+
+            // for txn tables there will be only one row in the index (a4)
+            // for non txn tables there will be three rows because we only partially build index
+            // from where we failed and the oldest
+            // index row has been deleted when we dropped the index table during test
+            assertEquals(transactional ? 1 : 3, rs.getInt(1));
+            }
         }
+        
+        @Test(timeout=300000)
+        public void testWriteFailureWithRegionServerDown() throws Exception {
+            String query;
+            ResultSet rs;
+    
+            Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+            try (Connection conn = driver.connect(url, props);) {
+                conn.setAutoCommit(false);
+                conn.createStatement().execute(
+                        "CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)");
+                query = "SELECT * FROM " + DATA_TABLE_FULL_NAME;
+                rs = conn.createStatement().executeQuery(query);
+                assertFalse(rs.next());
+        
+                conn.createStatement().execute(
+                        "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)");
+                query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME;
+                rs = conn.createStatement().executeQuery(query);
+                assertFalse(rs.next());
+        
+                // Verify the metadata for index is correct.
+                rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
+                        new String[] { PTableType.INDEX.toString() });
+                assertTrue(rs.next());
+                assertEquals(INDEX_TABLE_NAME, rs.getString(3));
+                assertEquals(PIndexState.ACTIVE.toString(), rs.getString("INDEX_STATE"));
+                assertFalse(rs.next());
+                
+                PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)");
+                stmt.setString(1, "a");
+                stmt.setString(2, "x");
+                stmt.setString(3, "1");
+                stmt.execute();
+                conn.commit();
+                
+                // find a RS which doesn't has CATALOG table
+                TableName catalogTable = TableName.valueOf("SYSTEM.CATALOG");
+                TableName indexTable = TableName.valueOf(INDEX_TABLE_FULL_NAME);
+                final HBaseCluster cluster = this.util.getHBaseCluster();
+                Collection<ServerName> rss = cluster.getClusterStatus().getServers();
+                HBaseAdmin admin = this.util.getHBaseAdmin();
+                List<HRegionInfo> regions = admin.getTableRegions(catalogTable);
+                ServerName catalogRS = cluster.getServerHoldingRegion(regions.get(0).getTable(),
+                        regions.get(0).getRegionName());
+                ServerName metaRS = cluster.getServerHoldingMeta();
+                ServerName rsToBeKilled = null;
+                
+                // find first RS isn't holding META or CATALOG table
+                for(ServerName curRS : rss) {
+                    if(!curRS.equals(catalogRS) && !metaRS.equals(curRS)) {
+                        rsToBeKilled = curRS;
+                        break;
+                    }
+                }
+                assertTrue(rsToBeKilled != null);
+                
+                regions = admin.getTableRegions(indexTable);
+                final HRegionInfo indexRegion = regions.get(0);
+                final ServerName dstRS = rsToBeKilled;
+                admin.move(indexRegion.getEncodedNameAsBytes(), Bytes.toBytes(rsToBeKilled.getServerName()));
+                this.util.waitFor(30000, 200, new Waiter.Predicate<Exception>() {
+                    @Override
+                    public boolean evaluate() throws Exception {
+                      ServerName sn = cluster.getServerHoldingRegion(indexRegion.getTable(),
+                              indexRegion.getRegionName());
+                      return (sn != null && sn.equals(dstRS));
+                    }
+                  });
+                
+                // use timer sending updates in every 10ms
+                this.scheduleTimer = new Timer(true);
+                this.scheduleTimer.schedule(new SendingUpdatesScheduleTask(conn), 0, 10);
+                // let timer sending some updates
+                Thread.sleep(100);
+                
+                // kill RS hosting index table
+                this.util.getHBaseCluster().killRegionServer(rsToBeKilled);
+                
+                // wait for index table completes recovery
+                this.util.waitUntilAllRegionsAssigned(indexTable);
+                
+                // Verify the metadata for index is correct.       
+                do {
+                  Thread.sleep(15 * 1000); // sleep 15 secs
+                  rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(SCHEMA_NAME), INDEX_TABLE_NAME,
+                      new String[] { PTableType.INDEX.toString() });
+                  assertTrue(rs.next());
+                  if(PIndexState.ACTIVE.toString().equals(rs.getString("INDEX_STATE"))){
+                      break;
+                  }
+                } while(true);
+                this.scheduleTimer.cancel();
+                
+                assertEquals(cluster.getClusterStatus().getDeadServers(), 1);
+            }
     }
     
     static class SendingUpdatesScheduleTask extends TimerTask {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/MutableRollbackIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/MutableRollbackIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/MutableRollbackIT.java
index 3f212cc..d75050c 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/MutableRollbackIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/MutableRollbackIT.java
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.phoenix.end2end.index.txn;
 
 import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java
index 0fac1eb..4993d7b 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.phoenix.end2end.index.txn;
 
 import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java
index 122b81b..0e16d97 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.phoenix.end2end.index.txn;
 
 import static org.apache.phoenix.util.PhoenixRuntime.JDBC_PROTOCOL;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java
index 09a7511..d82aa1f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java
@@ -64,4 +64,4 @@ public abstract class BaseMutationPlan implements MutationPlan {
         return Collections.emptySet();
     }
 
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java
index 3285828..0e8036a 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java
@@ -66,4 +66,4 @@ public class CreateFunctionCompiler {
             }
         };
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java
index 8a6e239..1837b52 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java
@@ -92,4 +92,4 @@ public class CreateIndexCompiler {
         	
         };
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
index 1ffd36e..d5b74fb 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
@@ -326,4 +326,4 @@ public class CreateTableCompiler {
         }
         
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
index a02ba99..12aa7c5 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
@@ -651,4 +651,4 @@ public class DeleteCompiler {
         }
         return mutationPlans.size() == 1 ? mutationPlans.get(0) : new MultiDeleteMutationPlan(mutationPlans);
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java
index 25bf35f..dac691f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java
@@ -242,4 +242,4 @@ public class ListJarsQueryPlan implements QueryPlan {
 	public Operation getOperation() {
 		return stmt.getUpdateOperation();
 	}
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java
index 70e5fff..ddc2004 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java
@@ -26,4 +26,4 @@ import org.apache.phoenix.schema.TableRef;
 public interface MutationPlan extends StatementPlan {
     public MutationState execute() throws SQLException;
     public TableRef getTargetRef();
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java
index 96b057d..506623b 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java
@@ -301,4 +301,4 @@ public class PostDDLCompiler {
             }
         };
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryPlan.java
index 6be3963..1c0c469 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryPlan.java
@@ -53,7 +53,6 @@ public interface QueryPlan extends StatementPlan {
     
     // TODO: change once joins are supported
     TableRef getTableRef();
-    
     /**
      * Returns projector used to formulate resultSet row
      */

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java
index 5e46773..cfdb8e9 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java
@@ -35,4 +35,4 @@ public interface StatementPlan {
     ExplainPlan getExplainPlan() throws SQLException;
     public Set<TableRef> getSourceRefs();
     Operation getOperation();
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
index 96a15a3..0f7f6f9 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
@@ -1047,4 +1047,4 @@ public class UpsertCompiler {
             }
         }
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
index bc6dd23..31b360f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
@@ -73,7 +73,6 @@ import org.apache.phoenix.util.LogUtil;
 import org.apache.phoenix.util.SQLCloseable;
 import org.apache.phoenix.util.SQLCloseables;
 import org.apache.phoenix.util.ScanUtil;
-import org.apache.phoenix.util.TransactionUtil;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
@@ -466,4 +465,4 @@ public abstract class BaseQueryPlan implements QueryPlan {
         return groupBy.isEmpty() ? orderBy.getOrderByExpressions().isEmpty() : groupBy.isOrderPreserving();
     }
     
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ba952bc7/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
index e35851d..56e0ccd 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
@@ -120,4 +120,4 @@ public abstract class DelegateQueryPlan implements QueryPlan {
 		return delegate.getOperation();
 	}
 	
-}
+}
\ No newline at end of file