This is an automated email from the ASF dual-hosted git repository.
yanxinyi 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 cf630b5 PHOENIX-6172 Updating VIEW_INDEX_ID column type and ts in
Syscat with a 4.16 upgrade script
cf630b5 is described below
commit cf630b51df6f80f0247ad196a7e3f90c34427464
Author: Xinyi Yan <[email protected]>
AuthorDate: Fri Oct 16 21:41:18 2020 -0700
PHOENIX-6172 Updating VIEW_INDEX_ID column type and ts in Syscat with a
4.16 upgrade script
Signed-off-by: Xinyi Yan <[email protected]>
---
.../java/org/apache/phoenix/end2end/UpgradeIT.java | 75 ++++++++++++++++++++++
.../phoenix/query/ConnectionQueryServicesImpl.java | 24 +++++++
.../java/org/apache/phoenix/util/UpgradeUtil.java | 40 ++++++++++++
3 files changed, 139 insertions(+)
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java
index d2bd456..4ea90b0 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java
@@ -17,7 +17,11 @@
*/
package org.apache.phoenix.end2end;
+import static
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE;
+import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.VIEW_INDEX_ID;
+import static org.apache.phoenix.query.QueryConstants.SYSTEM_SCHEMA_NAME;
import static
org.apache.phoenix.thirdparty.com.google.common.base.Preconditions.checkNotNull;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
@@ -31,6 +35,7 @@ import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Types;
import java.util.List;
import java.util.Properties;
import java.util.Set;
@@ -40,6 +45,15 @@ import java.util.concurrent.FutureTask;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellUtil;
+import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.client.Put;
+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.client.Table;
+import org.apache.phoenix.schema.types.PInteger;
import org.apache.phoenix.thirdparty.com.google.common.collect.Lists;
import org.apache.phoenix.thirdparty.com.google.common.collect.Sets;
import org.apache.hadoop.hbase.TableName;
@@ -672,4 +686,65 @@ public class UpgradeIT extends ParallelStatsDisabledIT {
return key;
}
+ @Test
+ public void testUpgradeViewIndexIdDataType() throws Exception {
+ byte[] rowKey = SchemaUtil.getColumnKey(null,
+ SYSTEM_SCHEMA_NAME, SYSTEM_CATALOG_TABLE, VIEW_INDEX_ID,
+ PhoenixDatabaseMetaData.TABLE_FAMILY);
+ byte[] syscatBytes =
PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME.getBytes();
+ byte[] viewIndexIdTypeCellValueIn414 =
PInteger.INSTANCE.toBytes(Types.SMALLINT);
+ byte[] viewIndexIdTypeCellValueIn416 =
PInteger.INSTANCE.toBytes(Types.BIGINT);
+
+ try (PhoenixConnection conn = getConnection(false, null).
+ unwrap(PhoenixConnection.class)) {
+ // update the VIEW_INDEX_ID 0:DATAT_TYPE cell value to SMALLINT
+ // (4.14 and prior version is a SMALLINT column)
+ updateViewIndexIdColumnValue(rowKey, syscatBytes,
viewIndexIdTypeCellValueIn414);
+
assertTrue(UpgradeUtil.isUpdateViewIndexIdColumnDataTypeFromShortToLongNeeded(
+ conn, rowKey, syscatBytes));
+ verifyExpectedCellValue(rowKey, syscatBytes,
viewIndexIdTypeCellValueIn414);
+ // calling UpgradeUtil to mock the upgrade VIEW_INDEX_ID data type
to BIGINT
+ UpgradeUtil.updateViewIndexIdColumnDataTypeFromShortToLong(conn,
rowKey, syscatBytes);
+ verifyExpectedCellValue(rowKey, syscatBytes,
viewIndexIdTypeCellValueIn416);
+
assertFalse(UpgradeUtil.isUpdateViewIndexIdColumnDataTypeFromShortToLongNeeded(
+ conn, rowKey, syscatBytes));
+ } finally {
+ updateViewIndexIdColumnValue(rowKey, syscatBytes,
viewIndexIdTypeCellValueIn416);
+ }
+ }
+
+ private void updateViewIndexIdColumnValue(byte[] rowKey, byte[]
syscatBytes,
+ byte[] newColumnValue) throws
Exception {
+
+ try (PhoenixConnection conn =
+
DriverManager.getConnection(getUrl()).unwrap(PhoenixConnection.class);
+ Table sysTable = conn.getQueryServices().getTable(syscatBytes)) {
+ KeyValue viewIndexIdKV = new KeyValue(rowKey,
+ PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES,
+ PhoenixDatabaseMetaData.DATA_TYPE_BYTES,
+ MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP,
+ newColumnValue);
+ Put viewIndexIdPut = new Put(rowKey);
+ viewIndexIdPut.add(viewIndexIdKV);
+ sysTable.put(viewIndexIdPut);
+ }
+ }
+
+ private void verifyExpectedCellValue(byte[] rowKey, byte[] syscatBytes,
+ byte[] expectedDateTypeBytes) throws
Exception {
+ try(PhoenixConnection conn = getConnection(false, null).
+ unwrap(PhoenixConnection.class);
+ Table sysTable = conn.getQueryServices().getTable(syscatBytes)) {
+ Scan s = new Scan();
+ s.setRowPrefixFilter(rowKey);
+ s.addColumn(PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES,
+ PhoenixDatabaseMetaData.DATA_TYPE_BYTES);
+ ResultScanner scanner = sysTable.getScanner(s);
+ Result result= scanner.next();
+ Cell cell = result.getColumnLatestCell(
+ PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES,
+ PhoenixDatabaseMetaData.DATA_TYPE_BYTES);
+ assertArrayEquals(expectedDateTypeBytes,
CellUtil.cloneValue(cell));
+ }
+ }
}
diff --git
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
index ea46cd6..92794dc 100644
---
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
+++
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
@@ -61,6 +61,7 @@ import static
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TENANT_ID;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TRANSACTIONAL;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TTL_FOR_MUTEX;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.VIEW_CONSTANT;
+import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.VIEW_INDEX_ID;
import static
org.apache.phoenix.monitoring.GlobalClientMetrics.GLOBAL_HCONNECTIONS_COUNTER;
import static
org.apache.phoenix.monitoring.GlobalClientMetrics.GLOBAL_PHOENIX_CONNECTIONS_THROTTLED_COUNTER;
import static
org.apache.phoenix.monitoring.GlobalClientMetrics.GLOBAL_QUERY_SERVICES_COUNTER;
@@ -285,6 +286,7 @@ import org.apache.phoenix.util.QueryUtil;
import org.apache.phoenix.util.ReadOnlyProps;
import org.apache.phoenix.util.SchemaUtil;
import org.apache.phoenix.util.ServerUtil;
+import org.apache.phoenix.util.StringUtil;
import org.apache.phoenix.util.TimeKeeper;
import org.apache.phoenix.util.UpgradeUtil;
import org.slf4j.Logger;
@@ -3746,6 +3748,28 @@ public class ConnectionQueryServicesImpl extends
DelegateQueryServices implement
MIN_SYSTEM_TABLE_TIMESTAMP_4_16_0,
PhoenixDatabaseMetaData.PHOENIX_TTL_HWM + " "
+ PInteger.INSTANCE.getSqlTypeName());
+
+ boolean isNamespaceMapping =
+ SchemaUtil.isNamespaceMappingEnabled(null,
getConfiguration());
+ String tableName = PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME;
+ if (isNamespaceMapping) {
+ tableName = tableName.replace(
+ QueryConstants.NAME_SEPARATOR,
+ QueryConstants.NAMESPACE_SEPARATOR);
+ }
+ byte[] tableBytes = StringUtil.toBytes(tableName);
+ byte[] rowKey = SchemaUtil.getColumnKey(null,
+ QueryConstants.SYSTEM_SCHEMA_NAME,
+ SYSTEM_CATALOG_TABLE, VIEW_INDEX_ID,
+ PhoenixDatabaseMetaData.TABLE_FAMILY);
+ if
(UpgradeUtil.isUpdateViewIndexIdColumnDataTypeFromShortToLongNeeded
+ (metaConnection, rowKey, tableBytes)) {
+ LOGGER.info("Updating VIEW_INDEX_ID data type to BIGINT.");
+ UpgradeUtil.updateViewIndexIdColumnDataTypeFromShortToLong(
+ metaConnection, rowKey, tableBytes);
+ } else {
+ LOGGER.info("Updating VIEW_INDEX_ID data type is not needed.");
+ }
}
return metaConnection;
}
diff --git
a/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
b/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
index 907bddd..9e0f5bf 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
@@ -63,6 +63,7 @@ import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Types;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -2451,4 +2452,43 @@ public class UpgradeUtil {
public static void doNotUpgradeOnFirstConnection(Properties props) {
props.setProperty(DO_NOT_UPGRADE, String.valueOf(true));
}
+
+ public static boolean
isUpdateViewIndexIdColumnDataTypeFromShortToLongNeeded(
+ PhoenixConnection metaConnection, byte[] rowKey, byte[]
syscatBytes) {
+ try (Table sysTable =
metaConnection.getQueryServices().getTable(syscatBytes)) {
+ Scan s = new Scan();
+ s.setRowPrefixFilter(rowKey);
+ s.addColumn(PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES,
+ PhoenixDatabaseMetaData.DATA_TYPE_BYTES);
+ ResultScanner scanner = sysTable.getScanner(s);
+ Result result = scanner.next();
+ Cell cell = result.getColumnLatestCell(
+ PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES,
+ PhoenixDatabaseMetaData.DATA_TYPE_BYTES);
+ return Bytes.compareTo(CellUtil.cloneValue(cell),
+ PInteger.INSTANCE.toBytes(Types.SMALLINT)) == 0 ? true :
false;
+ } catch (Exception e) {
+ LOGGER.error(String.format(
+ "Checking VIEW_INDEX_ID data type for upgrade failed: %s.
", e.getMessage()));
+ }
+ return false;
+ }
+
+ public static void updateViewIndexIdColumnDataTypeFromShortToLong(
+ PhoenixConnection metaConnection, byte[] rowKey, byte[]
syscatBytes) {
+ try(Table sysTable =
metaConnection.getQueryServices().getTable(syscatBytes)) {
+ KeyValue viewIndexIdKV = new KeyValue(rowKey,
+ PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES,
+ PhoenixDatabaseMetaData.DATA_TYPE_BYTES,
+ MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP,
+ PInteger.INSTANCE.toBytes(Types.BIGINT));
+ Put viewIndexIdPut = new Put(rowKey);
+ viewIndexIdPut.add(viewIndexIdKV);
+ sysTable.put(viewIndexIdPut);
+ LOGGER.info("Updated VIEW_INDEX_ID data type from SMALLINT TO
BIGINT.");
+ } catch (Exception e) {
+ LOGGER.error(String.format(
+ "Upgrade/change VIEW_INDEX_ID data type failed: %s.
",e.getMessage()));
+ }
+ }
}