This is an automated email from the ASF dual-hosted git repository.
gjacoby pushed a commit to branch 5.1
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/5.1 by this push:
new 062d509f46 PHOENIX-6725 : ConcurrentMutationException when adding
column to table/view (#1452)
062d509f46 is described below
commit 062d509f464d18bce5f34e46b024278595c701bd
Author: Lokesh Khurana <[email protected]>
AuthorDate: Tue Jun 21 12:14:10 2022 -0700
PHOENIX-6725 : ConcurrentMutationException when adding column to table/view
(#1452)
Co-authored-by: Lokesh Khurana <[email protected]>
---
.../org/apache/phoenix/end2end/AlterTableIT.java | 23 ++++++++++++++++++++++
.../phoenix/coprocessor/MetaDataEndpointImpl.java | 12 +++++++++++
.../org/apache/phoenix/schema/MetaDataClient.java | 4 ++--
3 files changed, 37 insertions(+), 2 deletions(-)
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 60fa923617..88caf7b744 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
@@ -54,6 +54,7 @@ import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.coprocessor.MetaDataEndpointImpl;
import org.apache.phoenix.exception.SQLExceptionCode;
import org.apache.phoenix.jdbc.PhoenixConnection;
import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
@@ -751,6 +752,28 @@ public class AlterTableIT extends ParallelStatsDisabledIT {
conn1.close();
}
+ @Test
+ public void testAddColumnWithRetry_PostConcurrentFailureOnFirstTime()
throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ String ddl = "CREATE TABLE " + dataTableFullName + " (\n"
+ +"ID VARCHAR(15) PRIMARY KEY,\n"
+ +"COL1 BIGINT) " + tableDDLOptions;
+ Connection conn1 = DriverManager.getConnection(getUrl(), props);
+ conn1.createStatement().execute(ddl);
+
MetaDataEndpointImpl.setFailConcurrentMutateAddColumnOneTimeForTesting(true);
+ ddl = "ALTER TABLE " + dataTableFullName + " ADD STRING VARCHAR,
STRING_DATA_TYPES VARCHAR";
+ conn1.createStatement().execute(ddl);
+ ResultSet rs =
conn1.getMetaData().getColumns("","",dataTableFullName,null);
+ assertTrue(rs.next());
+ assertEquals("ID", rs.getString(4));
+ assertTrue(rs.next());
+ assertEquals("COL1", rs.getString(4));
+ assertTrue(rs.next());
+ assertEquals("STRING", rs.getString(4));
+ assertTrue(rs.next());
+ assertEquals("STRING_DATA_TYPES", rs.getString(4));
+ }
+
@Test
public void testAddMultipleColumns() throws Exception {
Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
diff --git
a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
index 77da73278d..8756e4ff4c 100644
---
a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
+++
b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
@@ -542,6 +542,7 @@ TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
return PNameFactory.newName(keyBuffer, keyOffset, length);
}
+ private static boolean failConcurrentMutateAddColumnOneTimeForTesting =
false;
private RegionCoprocessorEnvironment env;
private PhoenixMetaDataCoprocessorHost phoenixAccessCoprocessorHost;
@@ -555,6 +556,12 @@ TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
// before 4.15, so that we can rollback the upgrade to 4.15 if required
private boolean allowSplittableSystemCatalogRollback;
+ private MetricsMetadataSource metricsSource;
+
+ public static void
setFailConcurrentMutateAddColumnOneTimeForTesting(boolean fail) {
+ failConcurrentMutateAddColumnOneTimeForTesting = fail;
+ }
+
/**
* Stores a reference to the coprocessor environment provided by the
* {@link org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost} from
the region where this
@@ -2780,6 +2787,11 @@ TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
List<ImmutableBytesPtr> invalidateList = new
ArrayList<ImmutableBytesPtr>();
invalidateList.add(cacheKey);
PTable table = getTableFromCache(cacheKey, clientTimeStamp,
clientVersion);
+ if (failConcurrentMutateAddColumnOneTimeForTesting) {
+ failConcurrentMutateAddColumnOneTimeForTesting = false;
+ return new
MetaDataMutationResult(MutationCode.CONCURRENT_TABLE_MUTATION,
+ EnvironmentEdgeManager.currentTimeMillis(), table);
+ }
if (LOGGER.isDebugEnabled()) {
if (table == null) {
LOGGER.debug("Table " + Bytes.toStringBinary(key)
diff --git
a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index 511f8592e9..1a0cfcdebf 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -4122,7 +4122,7 @@ public class MetaDataClient {
}
if (EncodedColumnsUtil.usesEncodedColumnNames(table)
- && stmtProperties.isEmpty()) {
+ && stmtProperties.isEmpty() &&
!acquiredBaseTableMutex) {
// For tables that use column encoding acquire a mutex on
// the base table as we need to update the encoded column
// qualifier counter on the base table. Not applicable to
@@ -4142,7 +4142,7 @@ public class MetaDataClient {
// a conflicting type etc
boolean acquiredMutex = writeCell(null,
physicalSchemaName, physicalTableName,
pColumn.toString());
- if (!acquiredMutex) {
+ if (!acquiredMutex &&
!acquiredColumnMutexSet.contains(pColumn.toString())) {
throw new
ConcurrentTableMutationException(physicalSchemaName, physicalTableName);
}
acquiredColumnMutexSet.add(pColumn.toString());