This is an automated email from the ASF dual-hosted git repository. gjacoby pushed a commit to branch 4.x-HBase-1.4 in repository https://gitbox.apache.org/repos/asf/phoenix.git
commit 46a59210cc414de95003c2faa6c39cc52ca9c6c0 Author: Geoffrey Jacoby <gjac...@apache.org> AuthorDate: Fri Nov 8 13:49:59 2019 -0800 PHOENIX-5560 - View Index Tables created incorrectly with IndexRegionObserver --- .../apache/phoenix/end2end/index/ViewIndexIT.java | 68 +++++++++++++++++++--- 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java index 3126ee4..9da0e50 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.io.IOException; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; @@ -37,10 +38,17 @@ import java.util.Collection; import java.util.List; import java.util.Properties; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.compile.QueryPlan; import org.apache.phoenix.end2end.IndexToolIT; import org.apache.phoenix.end2end.SplitSystemCatalogIT; +import org.apache.phoenix.hbase.index.IndexRegionObserver; +import org.apache.phoenix.hbase.index.Indexer; +import org.apache.phoenix.index.GlobalIndexChecker; +import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.query.KeyRange; @@ -70,13 +78,16 @@ public class ViewIndexIT extends SplitSystemCatalogIT { return Arrays.asList(true, false); } - private void createBaseTable(String schemaName, String tableName, boolean multiTenant, Integer saltBuckets, String splits) + private void createBaseTable(String schemaName, String tableName, boolean multiTenant, + Integer saltBuckets, String splits, boolean mutable) throws SQLException { Connection conn = getConnection(); if (isNamespaceMapped) { conn.createStatement().execute("CREATE SCHEMA IF NOT EXISTS " + schemaName); } - String ddl = "CREATE TABLE " + SchemaUtil.getTableName(schemaName, tableName) + " (t_id VARCHAR NOT NULL,\n" + + String ddl = "CREATE " + (mutable ? "" : "IMMUTABLE") + + " TABLE " + SchemaUtil.getTableName(schemaName, tableName) + + " (t_id VARCHAR NOT NULL,\n" + "k1 VARCHAR NOT NULL,\n" + "k2 INTEGER NOT NULL,\n" + "v1 VARCHAR,\n" + @@ -118,10 +129,10 @@ public class ViewIndexIT extends SplitSystemCatalogIT { conn.commit(); } - private Connection getConnection() throws SQLException{ + private PhoenixConnection getConnection() throws SQLException{ Properties props = new Properties(); props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(isNamespaceMapped)); - return DriverManager.getConnection(getUrl(),props); + return (PhoenixConnection) DriverManager.getConnection(getUrl(),props); } private Connection getTenantConnection(String tenant) throws SQLException { @@ -145,7 +156,7 @@ public class ViewIndexIT extends SplitSystemCatalogIT { String viewName = "VIEW_" + generateUniqueName(); String fullViewName = SchemaUtil.getTableName(viewSchemaName, viewName); - createBaseTable(schemaName, tableName, false, null, null); + createBaseTable(schemaName, tableName, false, null, null, true); Connection conn1 = getConnection(); Connection conn2 = getConnection(); conn1.createStatement().execute("CREATE VIEW " + fullViewName + " AS SELECT * FROM " + fullTableName); @@ -169,7 +180,7 @@ public class ViewIndexIT extends SplitSystemCatalogIT { String fullTableName = SchemaUtil.getTableName(SCHEMA1, tableName); String fullViewName = SchemaUtil.getTableName(SCHEMA2, generateUniqueName()); - createBaseTable(SCHEMA1, tableName, true, null, null); + createBaseTable(SCHEMA1, tableName, true, null, null, true); Connection conn = DriverManager.getConnection(getUrl()); PreparedStatement stmt = conn.prepareStatement( "UPSERT INTO " + fullTableName @@ -240,8 +251,47 @@ public class ViewIndexIT extends SplitSystemCatalogIT { QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan(); assertEquals(4, plan.getSplits().size()); } - - + + @Test + public void testCoprocsOnGlobalMTImmutableViewIndex() throws Exception { + testCoprocsOnGlobalViewIndexHelper(true, false); + } + + @Test + public void testCoprocsOnGlobalNonMTMutableViewIndex() throws Exception { + testCoprocsOnGlobalViewIndexHelper(false, true); + } + + @Test + public void testCoprocsOnGlobalMTMutableViewIndex() throws Exception { + testCoprocsOnGlobalViewIndexHelper(true, true); + } + + @Test + public void testCoprocsOnGlobalNonMTImmutableViewIndex() throws Exception { + testCoprocsOnGlobalViewIndexHelper(false, false); + } + + private void testCoprocsOnGlobalViewIndexHelper(boolean multiTenant, boolean mutable) throws SQLException, IOException { + String schemaName = generateUniqueName(); + String baseTable = generateUniqueName(); + String globalView = generateUniqueName(); + String globalViewIdx = generateUniqueName(); + createBaseTable(schemaName, baseTable, multiTenant, null, null, mutable); + try (PhoenixConnection conn = getConnection()) { + createView(conn, schemaName, globalView, baseTable); + createViewIndex(conn, schemaName, globalViewIdx, globalView, "K1"); + //now check that the right coprocs are installed + Admin admin = conn.getQueryServices().getAdmin(); + TableDescriptor td = admin.getTableDescriptor(TableName.valueOf( + MetaDataUtil.getViewIndexPhysicalName(SchemaUtil.getPhysicalHBaseTableName( + schemaName, baseTable, isNamespaceMapped).getString()))); + assertTrue(td.hasCoprocessor(GlobalIndexChecker.class.getName())); + assertFalse(td.hasCoprocessor(IndexRegionObserver.class.getName())); + assertFalse(td.hasCoprocessor(Indexer.class.getName())); + } + } + @Test public void testMultiTenantViewGlobalIndex() throws Exception { String baseTable = SchemaUtil.getTableName(SCHEMA1, generateUniqueName()); @@ -550,7 +600,7 @@ public class ViewIndexIT extends SplitSystemCatalogIT { String tenantViewIndexName = "TV_" + generateUniqueName(); Connection globalConn = getConnection(); Connection tenantConn = getTenantConnection(TENANT1); - createBaseTable(SCHEMA1, tableName, true, 0, null); + createBaseTable(SCHEMA1, tableName, true, 0, null, true); createView(globalConn, SCHEMA1, globalViewName, tableName); createViewIndex(globalConn, SCHEMA1, globalViewIndexName, globalViewName, "v1"); createView(tenantConn, SCHEMA1, tenantViewName, tableName);