This is an automated email from the ASF dual-hosted git repository.

tkhurana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/master by this push:
     new aad6208399 PHOENIX-7449 Handling already disabled table gracefully 
during dropTables execution (#2018)
aad6208399 is described below

commit aad62083996163713674738df1d8f0bc308dfc5c
Author: ritegarg <[email protected]>
AuthorDate: Tue Oct 29 15:29:30 2024 -0700

    PHOENIX-7449 Handling already disabled table gracefully during dropTables 
execution (#2018)
    
    * PHOENIX-7449 Handling already disabled table gracefully during dropTables 
execution
---
 .../phoenix/query/ConnectionQueryServicesImpl.java | 22 +++++++++++----
 .../query/ConnectionQueryServicesImplTest.java     | 33 +++++++++++++++++++++-
 2 files changed, 48 insertions(+), 7 deletions(-)

diff --git 
a/phoenix-core-client/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
 
b/phoenix-core-client/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
index 2b9b4b55bc..b69b2c06d3 100644
--- 
a/phoenix-core-client/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
+++ 
b/phoenix-core-client/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
@@ -150,6 +150,7 @@ import org.apache.hadoop.hbase.NamespaceNotFoundException;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableExistsException;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.TableNotEnabledException;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.CheckAndMutate;
@@ -1790,7 +1791,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                                 
SQLExceptionCode.INCONSISTENT_NAMESPACE_MAPPING_PROPERTIES.getErrorCode()) {
                             try {
                                 // In case we wrongly created SYSTEM.CATALOG 
or SYSTEM:CATALOG, we should drop it
-                                
admin.disableTable(TableName.valueOf(physicalTableName));
+                                disableTable(admin, 
TableName.valueOf(physicalTableName));
                                 
admin.deleteTable(TableName.valueOf(physicalTableName));
                             } catch 
(org.apache.hadoop.hbase.TableNotFoundException ignored) {
                                 // Ignore this since it just means that 
another client with a similar set of
@@ -1946,7 +1947,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         TableName tn = TableName.valueOf(tableName);
         try (Admin admin = getAdmin()) {
             if (!allowOnlineTableSchemaUpdate()) {
-                admin.disableTable(tn);
+                disableTable(admin, tn);
                 admin.modifyTable(newDesc); // TODO: Update to TableDescriptor
                 admin.enableTable(tn);
             } else {
@@ -2239,6 +2240,14 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         }
     }
 
+    private void disableTable(Admin admin, TableName tableName) throws 
IOException {
+        try {
+            admin.disableTable(tableName);
+        } catch (TableNotEnabledException e) {
+            LOGGER.info("Table already disabled, continuing with next steps", 
e);
+        }
+    }
+
     private boolean ensureViewIndexTableDropped(byte[] physicalTableName, long 
timestamp) throws SQLException {
         byte[] physicalIndexName = 
MetaDataUtil.getViewIndexPhysicalName(physicalTableName);
         boolean wasDeleted = false;
@@ -2250,7 +2259,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     final ReadOnlyProps props = this.getProps();
                     final boolean dropMetadata = 
props.getBoolean(DROP_METADATA_ATTRIB, DEFAULT_DROP_METADATA);
                     if (dropMetadata) {
-                        admin.disableTable(physicalIndexTableName);
+                        disableTable(admin, physicalIndexTableName);
                         admin.deleteTable(physicalIndexTableName);
                         clearTableRegionCache(physicalIndexTableName);
                         wasDeleted = true;
@@ -2583,7 +2592,8 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         dropTables(Collections.<byte[]>singletonList(tableNameToDelete));
     }
 
-    private void dropTables(final List<byte[]> tableNamesToDelete) throws 
SQLException {
+    @VisibleForTesting
+    void dropTables(final List<byte[]> tableNamesToDelete) throws SQLException 
{
         SQLException sqlE = null;
         try (Admin admin = getAdmin()) {
             if (tableNamesToDelete != null) {
@@ -2591,7 +2601,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     try {
                         TableName tn = TableName.valueOf(tableName);
                         TableDescriptor htableDesc = 
this.getTableDescriptor(tableName);
-                        admin.disableTable(tn);
+                        disableTable(admin, tn);
                         admin.deleteTable(tn);
                         tableStatsCache.invalidateAll(htableDesc);
                         clearTableRegionCache(TableName.valueOf(tableName));
@@ -4066,7 +4076,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                         // co-location of data and index regions. If we just 
modify the
                         // table descriptor when online schema change enabled 
may reopen
                         // the region in same region server instead of 
following data region.
-                        admin.disableTable(table.getTableName());
+                        disableTable(admin, table.getTableName());
                         admin.modifyTable(table);
                         admin.enableTable(table.getTableName());
                     }
diff --git 
a/phoenix-core/src/test/java/org/apache/phoenix/query/ConnectionQueryServicesImplTest.java
 
b/phoenix-core/src/test/java/org/apache/phoenix/query/ConnectionQueryServicesImplTest.java
index 54a1b29ce7..048bf250aa 100644
--- 
a/phoenix-core/src/test/java/org/apache/phoenix/query/ConnectionQueryServicesImplTest.java
+++ 
b/phoenix-core/src/test/java/org/apache/phoenix/query/ConnectionQueryServicesImplTest.java
@@ -36,6 +36,7 @@ import static org.mockito.Mockito.when;
 
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.HashMap;
@@ -45,6 +46,7 @@ import java.util.Map;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Admin;
+import org.apache.hadoop.hbase.TableNotEnabledException;
 import org.apache.hadoop.hbase.TableNotFoundException;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.Connection;
@@ -61,7 +63,6 @@ import org.apache.phoenix.monitoring.GlobalClientMetrics;
 import org.apache.phoenix.util.ReadOnlyProps;
 import org.junit.Before;
 import org.junit.ClassRule;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.Mockito;
@@ -96,6 +97,9 @@ public class ConnectionQueryServicesImplTest {
     @Mock
     private Table mockTable;
 
+    @Mock
+    private GuidePostsCacheWrapper mockTableStatsCache;
+
     public static final TableDescriptorBuilder SYS_TASK_TDB = 
TableDescriptorBuilder
             
.newBuilder(TableName.valueOf(PhoenixDatabaseMetaData.SYSTEM_TASK_NAME));
     public static final TableDescriptorBuilder SYS_TASK_TDB_SP = 
TableDescriptorBuilder
@@ -114,6 +118,9 @@ public class ConnectionQueryServicesImplTest {
         props = 
ConnectionQueryServicesImpl.class.getDeclaredField("connection");
         props.setAccessible(true);
         props.set(mockCqs, mockConn);
+        props = 
ConnectionQueryServicesImpl.class.getDeclaredField("tableStatsCache");
+        props.setAccessible(true);
+        props.set(mockCqs, mockTableStatsCache);
         when(mockCqs.checkIfSysMutexExistsAndModifyTTLIfRequired(mockAdmin))
                 .thenCallRealMethod();
         when(mockCqs.updateAndConfirmSplitPolicyForTask(SYS_TASK_TDB))
@@ -124,6 +131,7 @@ public class ConnectionQueryServicesImplTest {
         when(mockCqs.getAdmin()).thenCallRealMethod();
         when(mockCqs.getTable(Mockito.any())).thenCallRealMethod();
         when(mockCqs.getTableIfExists(Mockito.any())).thenCallRealMethod();
+        doCallRealMethod().when(mockCqs).dropTables(Mockito.any());
     }
 
     @SuppressWarnings("unchecked")
@@ -343,4 +351,27 @@ public class ConnectionQueryServicesImplTest {
         verify(mockConn, Mockito.times(1))
                 .getTable(TableName.valueOf("SYSTEM:MUTEX"));
     }
+
+    @Test
+    public void testDropTablesAlreadyDisabled() throws Exception {
+        when(mockConn.getAdmin()).thenReturn(mockAdmin);
+        doThrow(new 
TableNotEnabledException()).when(mockAdmin).disableTable(any());
+        doNothing().when(mockAdmin).deleteTable(any());
+        
mockCqs.dropTables(Collections.singletonList("TEST_TABLE".getBytes(StandardCharsets.UTF_8)));
+        verify(mockAdmin, 
Mockito.times(1)).disableTable(TableName.valueOf("TEST_TABLE"));
+        verify(mockAdmin, 
Mockito.times(1)).deleteTable(TableName.valueOf("TEST_TABLE"));
+        verify(mockConn).getAdmin();
+    }
+
+    @Test
+    public void testDropTablesTableEnabled() throws Exception {
+        when(mockConn.getAdmin()).thenReturn(mockAdmin);
+        doNothing().when(mockAdmin).disableTable(any());
+        doNothing().when(mockAdmin).deleteTable(any());
+        doNothing().when(mockTableStatsCache).invalidateAll();
+        
mockCqs.dropTables(Collections.singletonList("TEST_TABLE".getBytes(StandardCharsets.UTF_8)));
+        verify(mockAdmin, 
Mockito.times(1)).disableTable(TableName.valueOf("TEST_TABLE"));
+        verify(mockAdmin, 
Mockito.times(1)).deleteTable(TableName.valueOf("TEST_TABLE"));
+        verify(mockConn).getAdmin();
+    }
 }

Reply via email to