PHOENIX-4731 Make running transactional unit tests for a given provider optional
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/fd9af912 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/fd9af912 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/fd9af912 Branch: refs/heads/4.x-HBase-1.3 Commit: fd9af912fe640b5085fb09e5be3b3c19a3f7d40b Parents: 20000d9 Author: James Taylor <[email protected]> Authored: Thu Oct 4 08:19:37 2018 -0700 Committer: James Taylor <[email protected]> Committed: Fri Oct 5 07:32:38 2018 -0700 ---------------------------------------------------------------------- .gitignore | 1 + .../apache/phoenix/end2end/AlterTableIT.java | 4 + .../phoenix/end2end/AlterTableWithViewsIT.java | 17 +- .../org/apache/phoenix/end2end/BaseViewIT.java | 17 +- ...mnEncodedImmutableNonTxStatsCollectorIT.java | 12 +- ...olumnEncodedImmutableTxStatsCollectorIT.java | 16 +- ...lumnEncodedMutableNonTxStatsCollectorIT.java | 10 +- .../ColumnEncodedMutableTxStatsCollectorIT.java | 15 +- .../ConnectionQueryServicesTestImpl.java | 2 +- .../apache/phoenix/end2end/IndexExtendedIT.java | 1 - .../org/apache/phoenix/end2end/IndexToolIT.java | 21 +- ...mnEncodedImmutableNonTxStatsCollectorIT.java | 10 +- ...olumnEncodedImmutableTxStatsCollectorIT.java | 16 +- .../phoenix/end2end/SqrtFunctionEnd2EndIT.java | 1 - ...SysTableNamespaceMappedStatsCollectorIT.java | 16 +- .../phoenix/end2end/TransactionalViewIT.java | 23 +- .../java/org/apache/phoenix/end2end/ViewIT.java | 21 +- .../phoenix/end2end/index/BaseIndexIT.java | 101 +++++-- .../index/GlobalImmutableNonTxIndexIT.java | 12 +- .../end2end/index/GlobalImmutableTxIndexIT.java | 17 +- .../index/GlobalMutableNonTxIndexIT.java | 12 +- .../end2end/index/GlobalMutableTxIndexIT.java | 17 +- .../phoenix/end2end/index/ImmutableIndexIT.java | 38 ++- .../index/LocalImmutableNonTxIndexIT.java | 12 +- .../end2end/index/LocalImmutableTxIndexIT.java | 16 +- .../end2end/index/LocalMutableNonTxIndexIT.java | 12 +- .../end2end/index/LocalMutableTxIndexIT.java | 16 +- .../end2end/index/MutableIndexFailureIT.java | 67 +++-- .../MutableIndexFailureWithNamespaceIT.java | 28 +- .../phoenix/end2end/index/MutableIndexIT.java | 9 +- .../end2end/index/txn/MutableRollbackIT.java | 46 +-- .../phoenix/end2end/index/txn/RollbackIT.java | 28 +- .../end2end/index/txn/TxWriteFailureIT.java | 25 +- .../apache/phoenix/execute/PartialCommitIT.java | 202 ++++++------- .../org/apache/phoenix/rpc/UpdateCacheIT.java | 17 +- .../phoenix/schema/stats/StatsCollectorIT.java | 26 +- .../phoenix/tx/FlappingTransactionIT.java | 55 ++-- .../phoenix/tx/ParameterizedTransactionIT.java | 92 ++++-- .../org/apache/phoenix/tx/TransactionIT.java | 174 +++++++++++- .../org/apache/phoenix/tx/TxCheckpointIT.java | 46 +-- .../apache/phoenix/compile/DeleteCompiler.java | 5 +- .../compile/PostLocalIndexDDLCompiler.java | 3 + .../apache/phoenix/compile/UpsertCompiler.java | 14 +- .../phoenix/coprocessor/OmidGCProcessor.java | 29 ++ .../coprocessor/OmidTransactionalProcessor.java | 29 ++ .../UngroupedAggregateRegionObserver.java | 15 +- .../phoenix/exception/SQLExceptionCode.java | 7 +- .../apache/phoenix/execute/DelegateHTable.java | 57 +--- .../apache/phoenix/execute/MutationState.java | 27 +- .../PhoenixTxIndexMutationGenerator.java | 57 +++- .../hbase/index/builder/BaseIndexBuilder.java | 2 +- .../phoenix/hbase/index/covered/IndexCodec.java | 10 +- .../hbase/index/covered/LocalTableState.java | 2 +- .../hbase/index/covered/NonTxIndexBuilder.java | 6 +- .../apache/phoenix/index/IndexMaintainer.java | 87 +++--- .../apache/phoenix/index/PhoenixIndexCodec.java | 18 +- .../index/PhoenixTransactionalIndexer.java | 2 +- .../phoenix/iterate/ScanningResultIterator.java | 7 +- .../phoenix/iterate/TableResultIterator.java | 9 +- .../mapreduce/index/DirectHTableWriter.java | 25 +- .../phoenix/mapreduce/index/IndexTool.java | 1 + .../index/PhoenixIndexImportMapper.java | 51 +++- .../util/PhoenixConfigurationUtil.java | 2 + .../phoenix/query/ConnectionQueryServices.java | 4 +- .../query/ConnectionQueryServicesImpl.java | 106 +++++-- .../query/DelegateConnectionQueryServices.java | 2 +- .../apache/phoenix/schema/MetaDataClient.java | 144 +++++++--- .../transaction/OmidTransactionContext.java | 55 ++-- .../transaction/OmidTransactionProvider.java | 71 +++-- .../transaction/OmidTransactionTable.java | 280 +++++++++++++++++++ .../transaction/PhoenixTransactionContext.java | 10 +- .../transaction/PhoenixTransactionProvider.java | 30 +- .../transaction/TephraTransactionContext.java | 17 +- .../transaction/TephraTransactionProvider.java | 16 +- .../phoenix/transaction/TransactionFactory.java | 26 +- .../java/org/apache/phoenix/util/IndexUtil.java | 8 +- .../org/apache/phoenix/util/SchemaUtil.java | 10 +- .../index/covered/CoveredColumnIndexCodec.java | 6 +- .../covered/CoveredIndexCodecForTesting.java | 6 +- .../covered/TestCoveredColumnIndexCodec.java | 8 +- .../phoenix/query/QueryServicesTestImpl.java | 5 +- .../java/org/apache/phoenix/util/TestUtil.java | 37 ++- pom.xml | 2 +- 83 files changed, 1785 insertions(+), 794 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/.gitignore ---------------------------------------------------------------------- diff --git a/.gitignore b/.gitignore index 33d40ea..2f47957 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,5 @@ target/ release/ RESULTS/ CSV_EXPORT/ +.DS_Store http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/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 295b5d7..2cac1a6 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 @@ -61,6 +61,7 @@ import org.apache.phoenix.schema.PTable.EncodedCQCounter; import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.TableNotFoundException; +import org.apache.phoenix.transaction.TransactionFactory; import org.apache.phoenix.util.IndexUtil; import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.SchemaUtil; @@ -1073,6 +1074,9 @@ public class AlterTableIT extends ParallelStatsDisabledIT { @Test public void testCreatingTxnTableFailsIfTxnsDisabled() throws Exception { + if (!TransactionFactory.Provider.getDefault().runTests()) { + return; + } Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(QueryServices.TRANSACTIONS_ENABLED, Boolean.toString(false)); try (Connection conn = DriverManager.getConnection(getUrl(), props)) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java index b1f0fce..9e7aaa2 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java @@ -36,6 +36,7 @@ import java.sql.SQLException; import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Properties; import org.apache.commons.lang.ArrayUtils; import org.apache.hadoop.hbase.client.HTable; @@ -49,6 +50,7 @@ import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PName; @@ -57,9 +59,12 @@ import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.PTableType; import org.apache.phoenix.schema.TableNotFoundException; +import org.apache.phoenix.transaction.TransactionFactory; import org.apache.phoenix.util.IndexUtil; import org.apache.phoenix.util.PhoenixRuntime; +import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.SchemaUtil; +import org.apache.phoenix.util.TestUtil; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -907,7 +912,12 @@ public class AlterTableWithViewsIT extends SplitSystemCatalogIT { @Test public void testMakeBaseTableTransactional() throws Exception { - try (Connection conn = DriverManager.getConnection(getUrl()); + if (!TransactionFactory.Provider.TEPHRA.runTests()) { + return; + } + Properties props = PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES); + props.setProperty(QueryServices.TRANSACTIONS_ENABLED, Boolean.TRUE.toString()); + try (Connection conn = DriverManager.getConnection(getUrl(), props); Connection viewConn = isMultiTenant ? DriverManager.getConnection(TENANT_SPECIFIC_URL1) : conn ) { String baseTableName = SchemaUtil.getTableName(SCHEMA1, generateUniqueName()); String viewOfTable = SchemaUtil.getTableName(SCHEMA2, generateUniqueName()); @@ -931,8 +941,9 @@ public class AlterTableWithViewsIT extends SplitSystemCatalogIT { assertFalse(phoenixConn.getTable(new PTableKey(null, baseTableName)).isTransactional()); assertFalse(viewConn.unwrap(PhoenixConnection.class).getTable(new PTableKey(tenantId, viewOfTable)).isTransactional()); - // make the base table transactional - conn.createStatement().execute("ALTER TABLE " + baseTableName + " SET TRANSACTIONAL=true"); + // make the base table transactional and explicitly set TEPHRA as provider since only it + // supports transitioning from non transactional to transactional + conn.createStatement().execute("ALTER TABLE " + baseTableName + " SET TRANSACTIONAL=true, TRANSACTION_PROVIDER='TEPHRA'"); // query the view to force the table cache to be updated viewConn.createStatement().execute("SELECT * FROM " + viewOfTable); htable = phoenixConn.getQueryServices().getTable(Bytes.toBytes(baseTableName)); http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java index c3d553a..c074b32 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java @@ -46,6 +46,7 @@ import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ScanUtil; import org.apache.phoenix.util.SchemaUtil; +import org.apache.phoenix.util.TestUtil; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @@ -57,13 +58,13 @@ public abstract class BaseViewIT extends ParallelStatsEnabledIT { protected String schemaName; protected String fullTableName; protected String tableDDLOptions; - protected boolean transactional; + protected String txProvider; - public BaseViewIT( boolean transactional) { + public BaseViewIT( String txProvider) { StringBuilder optionBuilder = new StringBuilder(); - this.transactional = transactional; - if (transactional) { - optionBuilder.append(" TRANSACTIONAL=true "); + this.txProvider = txProvider; + if (txProvider != null) { + optionBuilder.append(" TRANSACTIONAL=true,TRANSACTION_PROVIDER='" + txProvider + "'"); } this.schemaName = "S_" + generateUniqueName(); this.tableDDLOptions = optionBuilder.toString(); @@ -71,9 +72,9 @@ public abstract class BaseViewIT extends ParallelStatsEnabledIT { this.fullTableName = SchemaUtil.getTableName(schemaName, tableName); } - @Parameters(name="transactional = {0}") - public static Collection<Boolean> data() { - return Arrays.asList(new Boolean[] { false, true }); + @Parameters(name="transactionProvider={0}") + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData(Arrays.asList(new Object[][] { {"TEPHRA"}, {"OMID"}, {null} }), 0); } protected void testUpdatableViewWithIndex(Integer saltBuckets, boolean localIndex) throws Exception { http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableNonTxStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableNonTxStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableNonTxStatsCollectorIT.java index eb01e89..0481ba5 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableNonTxStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableNonTxStatsCollectorIT.java @@ -25,15 +25,15 @@ import org.junit.runners.Parameterized.Parameters; public class ColumnEncodedImmutableNonTxStatsCollectorIT extends StatsCollectorIT { - public ColumnEncodedImmutableNonTxStatsCollectorIT(boolean mutable, boolean transactional, + public ColumnEncodedImmutableNonTxStatsCollectorIT(boolean mutable, String transactionProvider, boolean userTableNamespaceMapped, boolean columnEncoded) { - super(mutable, transactional, userTableNamespaceMapped, columnEncoded); + super(mutable, transactionProvider, userTableNamespaceMapped, columnEncoded); } - @Parameters(name = "mutable = {0}, transactional = {1}, isUserTableNamespaceMapped = {2}, columnEncoded = {3}") - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { false, false, false, true }, { false, false, true, true } + @Parameters(name = "mutable={0},transactionProvider={1},isUserTableNamespaceMapped={2},columnEncoded={3}") + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { false, null, false, true }, { false, null, true, true } }); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableTxStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableTxStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableTxStatsCollectorIT.java index 4e90d70..073dc07 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableTxStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedImmutableTxStatsCollectorIT.java @@ -21,18 +21,22 @@ import java.util.Arrays; import java.util.Collection; import org.apache.phoenix.schema.stats.StatsCollectorIT; +import org.apache.phoenix.util.TestUtil; import org.junit.runners.Parameterized.Parameters; public class ColumnEncodedImmutableTxStatsCollectorIT extends StatsCollectorIT { - public ColumnEncodedImmutableTxStatsCollectorIT(boolean mutable, boolean transactional, + public ColumnEncodedImmutableTxStatsCollectorIT(boolean mutable, String transactionProvider, boolean userTableNamespaceMapped, boolean columnEncoded) { - super(mutable, transactional, userTableNamespaceMapped, columnEncoded); + super(mutable, transactionProvider, userTableNamespaceMapped, columnEncoded); } - @Parameters(name = "mutable = {0}, transactional = {1}, isUserTableNamespaceMapped = {2}, columnEncoded = {3}") - public static Collection<Boolean[]> data() { - return Arrays.asList( - new Boolean[][] { { false, true, false, true }, { false, true, true, true }, }); + @Parameters(name = "mutable={0},transactionProvider={1},isUserTableNamespaceMapped={2},columnEncoded={3}") + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList( + new Object[][] { + { false, "TEPHRA", false, true }, + { false, "TEPHRA", true, true }, }), 1); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableNonTxStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableNonTxStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableNonTxStatsCollectorIT.java index 2a560db..248f6fb 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableNonTxStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableNonTxStatsCollectorIT.java @@ -25,14 +25,14 @@ import org.junit.runners.Parameterized.Parameters; public class ColumnEncodedMutableNonTxStatsCollectorIT extends StatsCollectorIT { - public ColumnEncodedMutableNonTxStatsCollectorIT(boolean mutable, boolean transactional, + public ColumnEncodedMutableNonTxStatsCollectorIT(boolean mutable, String transactionProvider, boolean userTableNamespaceMapped, boolean columnEncoded) { - super(mutable, transactional, userTableNamespaceMapped, columnEncoded); + super(mutable, transactionProvider, userTableNamespaceMapped, columnEncoded); } - @Parameters(name = "mutable = {0}, transactional = {1}, isUserTableNamespaceMapped = {2}, columnEncoded = {3}") - public static Collection<Boolean[]> data() { + @Parameters(name = "mutable={0},transactionProvider={1},isUserTableNamespaceMapped={2},columnEncoded={3}") + public static Collection<Object[]> data() { return Arrays.asList( - new Boolean[][] { { true, false, false, true }, { true, false, true, true } }); + new Object[][] { { true, null, false, true }, { true, null, true, true } }); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableTxStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableTxStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableTxStatsCollectorIT.java index 01fa2b5..29e000e 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableTxStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedMutableTxStatsCollectorIT.java @@ -21,18 +21,21 @@ import java.util.Arrays; import java.util.Collection; import org.apache.phoenix.schema.stats.StatsCollectorIT; +import org.apache.phoenix.util.TestUtil; import org.junit.runners.Parameterized.Parameters; public class ColumnEncodedMutableTxStatsCollectorIT extends StatsCollectorIT { - public ColumnEncodedMutableTxStatsCollectorIT(boolean mutable, boolean transactional, + public ColumnEncodedMutableTxStatsCollectorIT(boolean mutable, String transactionProvider, boolean userTableNamespaceMapped, boolean columnEncoded) { - super(mutable, transactional, userTableNamespaceMapped, columnEncoded); + super(mutable, transactionProvider, userTableNamespaceMapped, columnEncoded); } - @Parameters(name = "mutable = {0}, transactional = {1}, isUserTableNamespaceMapped = {2}, columnEncoded = {3}") - public static Collection<Boolean[]> data() { - return Arrays.asList( - new Boolean[][] { { true, true, false, true }, { true, true, true, true } }); + @Parameters(name = "mutable={0},transactionProvider={1},isUserTableNamespaceMapped={2},columnEncoded={3}") + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList(new Object[][] { + { true, "TEPHRA", false, true }, + { true, "TEPHRA", true, true } }), 1); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/ConnectionQueryServicesTestImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ConnectionQueryServicesTestImpl.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ConnectionQueryServicesTestImpl.java index 3db93b0..6ebaa65 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ConnectionQueryServicesTestImpl.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ConnectionQueryServicesTestImpl.java @@ -99,7 +99,7 @@ public class ConnectionQueryServicesTestImpl extends ConnectionQueryServicesImpl } @Override - public synchronized PhoenixTransactionClient initTransactionClient(Provider provider) { + public synchronized PhoenixTransactionClient initTransactionClient(Provider provider) throws SQLException { PhoenixTransactionService txService = txServices[provider.ordinal()]; if (txService == null) { txService = txServices[provider.ordinal()] = provider.getTransactionProvider().getTransactionService(config, connectionInfo); http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java index 624f3e3..6af4d78 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java @@ -160,7 +160,6 @@ public class IndexExtendedIT extends BaseTest { //assert we are pulling from index table. rs = conn.createStatement().executeQuery("EXPLAIN " + selectSql); actualExplainPlan = QueryUtil.getExplainPlan(rs); - // TODO: why is it a 1-WAY parallel scan only for !transactional && mutable && localIndex IndexToolIT.assertExplainPlan(localIndex, actualExplainPlan, dataTableFullName, indexTableFullName); rs = stmt.executeQuery(selectSql); http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java index a120aaa..b8372c4 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java @@ -53,6 +53,7 @@ import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; import org.apache.phoenix.util.SchemaUtil; +import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -71,15 +72,13 @@ public class IndexToolIT extends ParallelStatsEnabledIT { private final boolean transactional; private final boolean directApi; private final String tableDDLOptions; - private final boolean mutable; private final boolean useSnapshot; - public IndexToolIT(boolean transactional, boolean mutable, boolean localIndex, + public IndexToolIT(String transactionProvider, boolean mutable, boolean localIndex, boolean directApi, boolean useSnapshot) { this.localIndex = localIndex; - this.transactional = transactional; + this.transactional = transactionProvider != null; this.directApi = directApi; - this.mutable = mutable; this.useSnapshot = useSnapshot; StringBuilder optionBuilder = new StringBuilder(); if (!mutable) { @@ -89,7 +88,7 @@ public class IndexToolIT extends ParallelStatsEnabledIT { if (!(optionBuilder.length() == 0)) { optionBuilder.append(","); } - optionBuilder.append(" TRANSACTIONAL=true "); + optionBuilder.append(" TRANSACTIONAL=true,TRANSACTION_PROVIDER='" + transactionProvider + "'"); } optionBuilder.append(" SPLIT ON(1,2)"); this.tableDDLOptions = optionBuilder.toString(); @@ -108,22 +107,22 @@ public class IndexToolIT extends ParallelStatsEnabledIT { } @Parameters( - name = "transactional = {0} , mutable = {1} , localIndex = {2}, directApi = {3}, useSnapshot = {4}") - public static Collection<Boolean[]> data() { - List<Boolean[]> list = Lists.newArrayListWithExpectedSize(16); + name = "transactionProvider={0},mutable={1},localIndex={2},directApi={3},useSnapshot={4}") + public static Collection<Object[]> data() { + List<Object[]> list = Lists.newArrayListWithExpectedSize(48); boolean[] Booleans = new boolean[] { false, true }; - for (boolean transactional : Booleans) { + for (Object transactionProvider : new String[] {"TEPHRA", "OMID", null}) { for (boolean mutable : Booleans) { for (boolean localIndex : Booleans) { for (boolean directApi : Booleans) { for (boolean useSnapshot : Booleans) { - list.add(new Boolean[] { transactional, mutable, localIndex, directApi, useSnapshot }); + list.add(new Object[] { transactionProvider, mutable, localIndex, directApi, useSnapshot }); } } } } } - return list; + return TestUtil.filterTxParamData(list,0); } @Test http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableNonTxStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableNonTxStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableNonTxStatsCollectorIT.java index 27c6dc2..fec890e 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableNonTxStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableNonTxStatsCollectorIT.java @@ -25,14 +25,14 @@ import org.junit.runners.Parameterized.Parameters; public class NonColumnEncodedImmutableNonTxStatsCollectorIT extends StatsCollectorIT { - public NonColumnEncodedImmutableNonTxStatsCollectorIT(boolean mutable, boolean transactional, + public NonColumnEncodedImmutableNonTxStatsCollectorIT(boolean mutable, String transactionProvider, boolean userTableNamespaceMapped, boolean columnEncoded) { - super(mutable, transactional, userTableNamespaceMapped, columnEncoded); + super(mutable, transactionProvider, userTableNamespaceMapped, columnEncoded); } - @Parameters(name = "mutable = {0}, transactional = {1}, isUserTableNamespaceMapped = {2}, columnEncoded = {3}") - public static Collection<Boolean[]> data() { + @Parameters(name = "mutable={0},transactionProvider={1},isUserTableNamespaceMapped={2},columnEncoded={3}") + public static Collection<Object[]> data() { return Arrays.asList( - new Boolean[][] { { false, false, false, false }, { false, false, true, false } }); + new Object[][] { { false, null, false, false }, { false, null, true, false } }); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableTxStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableTxStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableTxStatsCollectorIT.java index 0cec31a..04485c4 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableTxStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/NonColumnEncodedImmutableTxStatsCollectorIT.java @@ -21,18 +21,22 @@ import java.util.Arrays; import java.util.Collection; import org.apache.phoenix.schema.stats.StatsCollectorIT; +import org.apache.phoenix.util.TestUtil; import org.junit.runners.Parameterized.Parameters; public class NonColumnEncodedImmutableTxStatsCollectorIT extends StatsCollectorIT { - public NonColumnEncodedImmutableTxStatsCollectorIT(boolean mutable, boolean transactional, + public NonColumnEncodedImmutableTxStatsCollectorIT(boolean mutable, String transactionProvider, boolean userTableNamespaceMapped, boolean columnEncoded) { - super(mutable, transactional, userTableNamespaceMapped, columnEncoded); + super(mutable,transactionProvider, userTableNamespaceMapped, columnEncoded); } - @Parameters(name = "mutable = {0}, transactional = {1}, isUserTableNamespaceMapped = {2}, columnEncoded = {3}") - public static Collection<Boolean[]> data() { - return Arrays.asList( - new Boolean[][] { { false, true, false, false }, { false, true, true, false } }); + @Parameters(name = "mutable={0},transactionProvider={1},isUserTableNamespaceMapped={2},columnEncoded={3}") + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData(Arrays.asList( + new Object[][] { + { false, "TEPHRA", false, false }, { false, "TEPHRA", true, false }, + { false, "OMID", false, false }, { false, "OMID", true, false }, + }),1); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/SqrtFunctionEnd2EndIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SqrtFunctionEnd2EndIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SqrtFunctionEnd2EndIT.java index 657c3fd..b9108d3 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SqrtFunctionEnd2EndIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SqrtFunctionEnd2EndIT.java @@ -18,7 +18,6 @@ package org.apache.phoenix.end2end; import static org.apache.phoenix.util.TestUtil.closeStmtAndConn; -import static org.apache.phoenix.util.TestUtil.getTableName; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java index 4830189..8f0a1d8 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.stats.StatsCollectorIT; import org.apache.phoenix.util.ReadOnlyProps; +import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; import org.junit.runners.Parameterized.Parameters; @@ -31,15 +32,18 @@ import com.google.common.collect.Maps; public class SysTableNamespaceMappedStatsCollectorIT extends StatsCollectorIT { - public SysTableNamespaceMappedStatsCollectorIT(boolean mutable, boolean transactional, + public SysTableNamespaceMappedStatsCollectorIT(boolean mutable, String transactionProvider, boolean userTableNamespaceMapped, boolean columnEncoded) { - super(mutable, transactional, userTableNamespaceMapped, columnEncoded); + super(mutable, transactionProvider, userTableNamespaceMapped, columnEncoded); } - @Parameters(name = "mutable = {0}, transactional = {1}, isUserTableNamespaceMapped = {2}, columnEncoded = {3}") - public static Collection<Boolean[]> data() { - return Arrays.asList( - new Boolean[][] { { true, true, false, false }, { true, true, false, true }, }); + @Parameters(name = "mutable={0},transactionProvider={1},isUserTableNamespaceMapped={2},columnEncoded={3}") + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData(Arrays.asList( + new Object[][] { + { true, "TEPHRA", false, false }, { true, "TEPHRA", false, true }, + { true, "OMID", false, false }, + }), 1); } @BeforeClass http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/TransactionalViewIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TransactionalViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TransactionalViewIT.java index b8c028b..f8910c1 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TransactionalViewIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TransactionalViewIT.java @@ -24,6 +24,8 @@ import static org.junit.Assert.assertEquals; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.apache.phoenix.query.KeyRange; @@ -31,12 +33,27 @@ import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.TestUtil; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +@RunWith(Parameterized.class) public class TransactionalViewIT extends ParallelStatsEnabledIT { private String fullTableName; private String fullViewName; - + private final String transactionProvider; + + public TransactionalViewIT(String transactionProvider) { + this.transactionProvider = transactionProvider; + } + + @Parameters(name="TransactionalViewIT_transactionProvider={0}") + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData(Arrays.asList(new Object[][] { + {"TEPHRA"},{"OMID"}}),0); + } + @Before public void generateTableNames() { String schemaName = TestUtil.DEFAULT_SCHEMA_NAME; @@ -51,7 +68,7 @@ public class TransactionalViewIT extends ParallelStatsEnabledIT { try (Connection conn1 = DriverManager.getConnection(getUrl()); Connection conn2 = DriverManager.getConnection(getUrl())) { String ddl = "CREATE TABLE " + fullTableName - + " (k INTEGER NOT NULL PRIMARY KEY, v1 DATE) TRANSACTIONAL=true"; + + " (k INTEGER NOT NULL PRIMARY KEY, v1 DATE) TRANSACTIONAL=true,TRANSACTION_PROVIDER='" + transactionProvider + "'"; conn1.createStatement().execute(ddl); ddl = "CREATE VIEW " + fullViewName + " (v2 VARCHAR) AS SELECT * FROM " + fullTableName + " where k>5"; conn1.createStatement().execute(ddl); @@ -86,7 +103,7 @@ public class TransactionalViewIT extends ParallelStatsEnabledIT { try (Connection conn1 = DriverManager.getConnection(getUrl()); Connection conn2 = DriverManager.getConnection(getUrl())) { String ddl = "CREATE TABLE " + fullTableName - + " (k INTEGER NOT NULL PRIMARY KEY, v1 DATE) TRANSACTIONAL=true"; + + " (k INTEGER NOT NULL PRIMARY KEY, v1 DATE) TRANSACTIONAL=true,TRANSACTION_PROVIDER='" + transactionProvider + "'"; conn1.createStatement().execute(ddl); ddl = "CREATE VIEW " + fullViewName + " (v2 VARCHAR) AS SELECT * FROM " + fullTableName + " where k>5"; conn1.createStatement().execute(ddl); http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java index bfcc729..cad897f 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java @@ -100,7 +100,7 @@ import com.google.common.collect.Maps; public class ViewIT extends SplitSystemCatalogIT { protected String tableDDLOptions; - protected boolean transactional; + protected String transactionProvider; protected boolean columnEncoded; private static final String FAILED_VIEWNAME = SchemaUtil.getTableName(SCHEMA2, "FAILED_VIEW"); @@ -109,12 +109,12 @@ public class ViewIT extends SplitSystemCatalogIT { private static volatile CountDownLatch latch1 = null; private static volatile CountDownLatch latch2 = null; - public ViewIT(boolean transactional, boolean columnEncoded) { + public ViewIT(String transactionProvider, boolean columnEncoded) { StringBuilder optionBuilder = new StringBuilder(); - this.transactional = transactional; + this.transactionProvider = transactionProvider; this.columnEncoded = columnEncoded; - if (transactional) { - optionBuilder.append(" TRANSACTIONAL=true "); + if (transactionProvider != null) { + optionBuilder.append(" TRANSACTION_PROVIDER='" + transactionProvider + "'"); } if (!columnEncoded) { if (optionBuilder.length()!=0) @@ -124,11 +124,12 @@ public class ViewIT extends SplitSystemCatalogIT { this.tableDDLOptions = optionBuilder.toString(); } - @Parameters(name="ViewIT_transactional={0}, columnEncoded={1}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { true, false }, { true, true }, - { false, false }, { false, true }}); + @Parameters(name="ViewIT_transactionProvider={0}, columnEncoded={1}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData(Arrays.asList(new Object[][] { + { "TEPHRA", false }, { "TEPHRA", true }, + { "OMID", false }, + { null, false }, { null, true }}),0); } @BeforeClass http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java index d86037c..7c14fba 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java @@ -67,10 +67,13 @@ import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.parse.NamedTableNode; import org.apache.phoenix.parse.TableName; import org.apache.phoenix.query.BaseTest; +import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTableImpl; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.PTableType; +import org.apache.phoenix.transaction.PhoenixTransactionProvider.Feature; +import org.apache.phoenix.transaction.TransactionFactory; import org.apache.phoenix.util.DateUtil; import org.apache.phoenix.util.EnvironmentEdgeManager; import org.apache.phoenix.util.PhoenixRuntime; @@ -90,12 +93,12 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { private final boolean localIndex; private final boolean transactional; + private final TransactionFactory.Provider transactionProvider; private final boolean mutable; private final String tableDDLOptions; - protected BaseIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { + protected BaseIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { this.localIndex = localIndex; - this.transactional = transactional; this.mutable = mutable; StringBuilder optionBuilder = new StringBuilder(); if (!columnEncoded) { @@ -111,10 +114,14 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { optionBuilder.append(",IMMUTABLE_STORAGE_SCHEME="+PTableImpl.ImmutableStorageScheme.ONE_CELL_PER_COLUMN); } } + transactional = transactionProvider != null; if (transactional) { if (optionBuilder.length()!=0) optionBuilder.append(","); - optionBuilder.append(" TRANSACTIONAL=true "); + optionBuilder.append(" TRANSACTIONAL=true,TRANSACTION_PROVIDER='" + transactionProvider + "'"); + this.transactionProvider = TransactionFactory.Provider.valueOf(transactionProvider); + } else { + this.transactionProvider = null; } this.tableDDLOptions = optionBuilder.toString(); } @@ -200,7 +207,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { ResultSet rs; - rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + fullTableName); + rs = conn.createStatement().executeQuery("SELECT /*+ NO_INDEX */ COUNT(*) FROM " + fullTableName); assertTrue(rs.next()); assertEquals(3,rs.getInt(1)); rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + fullIndexName); @@ -245,7 +252,8 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { if (iterator.hasNext()) { byte[] tableName = iterator.next().getFirst(); // skip data table mutations PTable table = PhoenixRuntime.getTable(conn, Bytes.toString(tableName)); - boolean clientSideUpdate = !localIndex && (!mutable || transactional); + boolean clientSideUpdate = (!localIndex || (transactional && table.getTransactionProvider().getTransactionProvider().isUnsupported(Feature.MAINTAIN_LOCAL_INDEX_ON_SERVER))) + && (!mutable || transactional); if (!clientSideUpdate) { assertTrue(table.getType() == PTableType.TABLE); // should be data table } @@ -257,20 +265,11 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { @Test public void testCreateIndexAfterUpsertStarted() throws Exception { - testCreateIndexAfterUpsertStarted(false, + testCreateIndexAfterUpsertStarted(transactional, SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, generateUniqueName()), SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, generateUniqueName())); } - @Test - public void testCreateIndexAfterUpsertStartedTxnl() throws Exception { - if (transactional) { - testCreateIndexAfterUpsertStarted(true, - SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, generateUniqueName()), - SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, generateUniqueName())); - } - } - private void testCreateIndexAfterUpsertStarted(boolean readOwnWrites, String fullTableName, String fullIndexName) throws Exception { Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); try (Connection conn1 = DriverManager.getConnection(getUrl(), props)) { @@ -934,7 +933,9 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { stmt.setString(2, "y"); stmt.setString(3, "2"); stmt.execute(); - conn.commit(); + if (!transactional) { + conn.commit(); + } query = "SELECT * FROM " + fullTableName + " WHERE \"v2\" = '1'"; rs = conn.createStatement().executeQuery("EXPLAIN " + query); @@ -955,6 +956,18 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { assertEquals("1",rs.getString("v2")); assertFalse(rs.next()); + // Shadow cells shouldn't exist yet since commit hasn't happened + if (transactional && transactionProvider == TransactionFactory.Provider.OMID) { + assertShadowCellsDoNotExist(conn, fullTableName, fullIndexName); + } + + conn.commit(); + + // Confirm shadow cells exist after commit + if (transactional && transactionProvider == TransactionFactory.Provider.OMID) { + assertShadowCellsExist(conn, fullTableName, fullIndexName); + } + query = "SELECT \"V1\", \"V1\" as foo1, \"v2\" as foo, \"v2\" as \"Foo1\", \"v2\" FROM " + fullTableName + " ORDER BY foo"; rs = conn.createStatement().executeQuery("EXPLAIN " + query); if(localIndex){ @@ -1040,12 +1053,22 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { } @Test - public void testIndexWithDecimalCol() throws Exception { + public void testIndexWithDecimalColServerSideUpsert() throws Exception { + testIndexWithDecimalCol(true); + } + + @Test + public void testIndexWithDecimalColClientSideUpsert() throws Exception { + testIndexWithDecimalCol(false); + } + + private void testIndexWithDecimalCol(boolean enableServerSideUpsert) throws Exception { Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); String tableName = "TBL_" + generateUniqueName(); String indexName = "IND_" + generateUniqueName(); String fullTableName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, tableName); String fullIndexName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, indexName); + props.setProperty(QueryServices.ENABLE_SERVER_UPSERT_SELECT, Boolean.toString(enableServerSideUpsert)); try (Connection conn = DriverManager.getConnection(getUrl(), props)) { conn.setAutoCommit(false); String query; @@ -1057,6 +1080,10 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { String ddl = null; ddl = "CREATE " + (localIndex ? "LOCAL " : "") + "INDEX " + indexName + " ON " + fullTableName + " (decimal_pk) INCLUDE (decimal_col1, decimal_col2)"; conn.createStatement().execute(ddl); + + if (transactional && transactionProvider == TransactionFactory.Provider.OMID) { + assertShadowCellsExist(conn, fullTableName, fullIndexName); + } query = "SELECT decimal_pk, decimal_col1, decimal_col2 from " + fullTableName ; rs = conn.createStatement().executeQuery("EXPLAIN " + query); @@ -1083,6 +1110,46 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT { } } + private static void assertShadowCellsDoNotExist(Connection conn, String fullTableName, String fullIndexName) + throws Exception { + assertShadowCells(conn, fullTableName, fullIndexName, false); + } + + private static void assertShadowCellsExist(Connection conn, String fullTableName, String fullIndexName) + throws Exception { + assertShadowCells(conn, fullTableName, fullIndexName, true); + } + + private static void assertShadowCells(Connection conn, String fullTableName, String fullIndexName, boolean exists) + throws Exception { + PTable ptable = conn.unwrap(PhoenixConnection.class).getTable(new PTableKey(null, fullTableName)); + int nTableKVColumns = ptable.getColumns().size() - ptable.getPKColumns().size(); + HTableInterface hTable = conn.unwrap(PhoenixConnection.class).getQueryServices().getTable(Bytes.toBytes(fullTableName)); + ResultScanner tableScanner = hTable.getScanner(new Scan()); + Result tableResult; + PTable pindex = conn.unwrap(PhoenixConnection.class).getTable(new PTableKey(null, fullIndexName)); + int nIndexKVColumns = pindex.getColumns().size() - pindex.getPKColumns().size(); + HTableInterface hIndex = conn.unwrap(PhoenixConnection.class).getQueryServices().getTable(Bytes.toBytes(fullIndexName)); + ResultScanner indexScanner = hIndex.getScanner(new Scan()); + Result indexResult; + while ((indexResult = indexScanner.next()) != null) { + int nColumns = 0; + CellScanner scanner = indexResult.cellScanner(); + while (scanner.advance()) { + nColumns++; + } + assertEquals(exists, nColumns > nIndexKVColumns * 2); + assertNotNull(tableResult = tableScanner.next()); + nColumns = 0; + scanner = tableResult.cellScanner(); + while (scanner.advance()) { + nColumns++; + } + assertEquals(exists, nColumns > nTableKVColumns * 2); + } + assertNull(tableScanner.next()); + } + /** * Ensure that HTD contains table priorities correctly. */ http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableNonTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableNonTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableNonTxIndexIT.java index 70ad73d..d891920 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableNonTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableNonTxIndexIT.java @@ -24,14 +24,14 @@ import org.junit.runners.Parameterized.Parameters; public class GlobalImmutableNonTxIndexIT extends BaseIndexIT { - public GlobalImmutableNonTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public GlobalImmutableNonTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="GlobalImmutableNonTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { false, false, false, false }, { false, false, false, true } + @Parameters(name="GlobalImmutableNonTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { false, false, null, false }, { false, false, null, true } }); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableTxIndexIT.java index 1ba498c..76deb99 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalImmutableTxIndexIT.java @@ -20,19 +20,22 @@ package org.apache.phoenix.end2end.index; import java.util.Arrays; import java.util.Collection; +import org.apache.phoenix.util.TestUtil; import org.junit.runners.Parameterized.Parameters; public class GlobalImmutableTxIndexIT extends BaseIndexIT { - public GlobalImmutableTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public GlobalImmutableTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="GlobalImmutableTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { false, false, true, false }, { false, false, true, true }, - }); + @Parameters(name="GlobalImmutableTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList(new Object[][] { + { false, false, "TEPHRA", false }, { false, false, "TEPHRA", true }, + { false, false, "OMID", false }, + }), 2); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableNonTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableNonTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableNonTxIndexIT.java index f37182d..023bc1e 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableNonTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableNonTxIndexIT.java @@ -24,14 +24,14 @@ import org.junit.runners.Parameterized.Parameters; public class GlobalMutableNonTxIndexIT extends BaseIndexIT { - public GlobalMutableNonTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public GlobalMutableNonTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="GlobalMutableNonTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { false, true, false, false }, { false, true, false, true } + @Parameters(name="GlobalMutableNonTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { false, true, null, false }, { false, true, null, true } }); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableTxIndexIT.java index 65ca2c5..b33cce7 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalMutableTxIndexIT.java @@ -20,19 +20,22 @@ package org.apache.phoenix.end2end.index; import java.util.Arrays; import java.util.Collection; +import org.apache.phoenix.util.TestUtil; import org.junit.runners.Parameterized.Parameters; public class GlobalMutableTxIndexIT extends BaseIndexIT { - public GlobalMutableTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public GlobalMutableTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="GlobalMutableTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { false, true, true, false }, { false, true, true, true } - }); + @Parameters(name="GlobalMutableTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList(new Object[][] { + { false, true, "TEPHRA", false }, { false, true, "TEPHRA", true }, + { false, true, "OMID", false }, + }), 2); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ImmutableIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ImmutableIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ImmutableIndexIT.java index 1db9787..d676051 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ImmutableIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ImmutableIndexIT.java @@ -55,6 +55,9 @@ import org.apache.phoenix.query.BaseTest; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.PIndexState; import org.apache.phoenix.schema.PTableImpl; +import org.apache.phoenix.transaction.PhoenixTransactionProvider; +import org.apache.phoenix.transaction.PhoenixTransactionProvider.Feature; +import org.apache.phoenix.transaction.TransactionFactory; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.ReadOnlyProps; @@ -75,7 +78,7 @@ import com.google.common.collect.Maps; public class ImmutableIndexIT extends BaseUniqueNamesOwnClusterIT { private final boolean localIndex; - private final boolean transactional; + private final PhoenixTransactionProvider transactionProvider; private final String tableDDLOptions; private volatile boolean stopThreads = false; @@ -84,17 +87,17 @@ public class ImmutableIndexIT extends BaseUniqueNamesOwnClusterIT { private static String INDEX_DDL; public static final AtomicInteger NUM_ROWS = new AtomicInteger(0); - public ImmutableIndexIT(boolean localIndex, boolean transactional, boolean columnEncoded) { + public ImmutableIndexIT(boolean localIndex, boolean transactional, String transactionProvider, boolean columnEncoded) { StringBuilder optionBuilder = new StringBuilder("IMMUTABLE_ROWS=true"); this.localIndex = localIndex; - this.transactional = transactional; if (!columnEncoded) { - if (optionBuilder.length()!=0) - optionBuilder.append(","); - optionBuilder.append("COLUMN_ENCODED_BYTES=0,IMMUTABLE_STORAGE_SCHEME="+PTableImpl.ImmutableStorageScheme.ONE_CELL_PER_COLUMN); + optionBuilder.append(",COLUMN_ENCODED_BYTES=0,IMMUTABLE_STORAGE_SCHEME="+PTableImpl.ImmutableStorageScheme.ONE_CELL_PER_COLUMN); } if (transactional) { - optionBuilder.append(", TRANSACTIONAL=true"); + optionBuilder.append(",TRANSACTIONAL=true, TRANSACTION_PROVIDER='" + transactionProvider + "'"); + this.transactionProvider = TransactionFactory.Provider.valueOf(transactionProvider).getTransactionProvider(); + } else { + this.transactionProvider = null; } this.tableDDLOptions = optionBuilder.toString(); @@ -110,13 +113,16 @@ public class ImmutableIndexIT extends BaseUniqueNamesOwnClusterIT { setUpTestDriver(new ReadOnlyProps(serverProps.entrySet().iterator()), new ReadOnlyProps(clientProps.entrySet().iterator())); } - @Parameters(name="ImmutableIndexIT_localIndex={0},transactional={1},columnEncoded={2}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { false, false, false }, { false, false, true }, - { false, true, false }, { false, true, true }, - { true, false, false }, { true, false, true }, - { true, true, false }, { true, true, true } }); + @Parameters(name="ImmutableIndexIT_localIndex={0},transactional={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList(new Object[][] { + { false, false, null, false }, { false, false, null, true }, + { false, true, "OMID", false }, + { false, true, "TEPHRA", false }, { false, true, "TEPHRA", true }, + { true, false, null, false }, { true, false, null, true }, + { true, true, "TEPHRA", false }, { true, true, "TEPHRA", true }, + }), 2); } @Test @@ -252,7 +258,9 @@ public class ImmutableIndexIT extends BaseUniqueNamesOwnClusterIT { Iterator<Pair<byte[], List<KeyValue>>> iterator = PhoenixRuntime.getUncommittedDataIterator(conn); assertTrue(iterator.hasNext()); iterator.next(); - assertEquals(!localIndex, iterator.hasNext()); + assertEquals(!localIndex || + (transactionProvider != null && + transactionProvider.isUnsupported(Feature.MAINTAIN_LOCAL_INDEX_ON_SERVER)), iterator.hasNext()); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableNonTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableNonTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableNonTxIndexIT.java index 7b7c6ad..515d74c 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableNonTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableNonTxIndexIT.java @@ -24,14 +24,14 @@ import org.junit.runners.Parameterized.Parameters; public class LocalImmutableNonTxIndexIT extends BaseIndexIT { - public LocalImmutableNonTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public LocalImmutableNonTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="LocalImmutableNonTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { true, false, false, false }, { true, false, false, true } + @Parameters(name="LocalImmutableNonTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { true, false, null, false }, { true, false, null, true } }); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableTxIndexIT.java index 5ff6d04..176b36f 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalImmutableTxIndexIT.java @@ -20,19 +20,21 @@ package org.apache.phoenix.end2end.index; import java.util.Arrays; import java.util.Collection; +import org.apache.phoenix.util.TestUtil; import org.junit.runners.Parameterized.Parameters; public class LocalImmutableTxIndexIT extends BaseIndexIT { - public LocalImmutableTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public LocalImmutableTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="LocalImmutableTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { true, false, true, false }, { true, false, true, true } - }); + @Parameters(name="LocalImmutableTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList(new Object[][] { + { true, false, "TEPHRA", false }, { true, false, "TEPHRA", true }, + }), 2); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableNonTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableNonTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableNonTxIndexIT.java index 4b9688b..dd3a3bb 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableNonTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableNonTxIndexIT.java @@ -24,14 +24,14 @@ import org.junit.runners.Parameterized.Parameters; public class LocalMutableNonTxIndexIT extends BaseIndexIT { - public LocalMutableNonTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public LocalMutableNonTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="LocalMutableNonTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { true, true, false, false }, { true, true, false, true } + @Parameters(name="LocalMutableNonTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { true, true, null, false }, { true, true, null, true } }); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableTxIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableTxIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableTxIndexIT.java index 5f5dd0f..d1b7f53 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableTxIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalMutableTxIndexIT.java @@ -20,18 +20,20 @@ package org.apache.phoenix.end2end.index; import java.util.Arrays; import java.util.Collection; +import org.apache.phoenix.util.TestUtil; import org.junit.runners.Parameterized.Parameters; public class LocalMutableTxIndexIT extends BaseIndexIT { - public LocalMutableTxIndexIT(boolean localIndex, boolean mutable, boolean transactional, boolean columnEncoded) { - super(localIndex, mutable, transactional, columnEncoded); + public LocalMutableTxIndexIT(boolean localIndex, boolean mutable, String transactionProvider, boolean columnEncoded) { + super(localIndex, mutable, transactionProvider, columnEncoded); } - @Parameters(name="LocalMutableTxIndexIT_localIndex={0},mutable={1},transactional={2},columnEncoded={3}") // name is used by failsafe as file name in reports - public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { - { true, true, true, false }, { true, true, true, true } - }); + @Parameters(name="LocalMutableTxIndexIT_localIndex={0},mutable={1},transactionProvider={2},columnEncoded={3}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList(new Object[][] { + { true, true, "TEPHRA", false }, { true, true, "TEPHRA", true }, + }), 2); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/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 0611478..8be32fc 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 @@ -30,6 +30,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Properties; @@ -65,6 +66,8 @@ import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.PTableType; import org.apache.phoenix.schema.SortOrder; +import org.apache.phoenix.transaction.PhoenixTransactionProvider; +import org.apache.phoenix.transaction.TransactionFactory; import org.apache.phoenix.util.IndexScrutiny; import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.PhoenixRuntime; @@ -102,6 +105,7 @@ public class MutableIndexFailureIT extends BaseTest { private String fullIndexName; private final boolean transactional; + private final PhoenixTransactionProvider transactionProvider; private final boolean localIndex; private final String tableDDLOptions; private final boolean isNamespaceMapped; @@ -115,10 +119,12 @@ public class MutableIndexFailureIT extends BaseTest { protected static final int disableTimestampThresholdMs = 10000; protected static final int numRpcRetries = 2; - public MutableIndexFailureIT(boolean transactional, boolean localIndex, boolean isNamespaceMapped, Boolean disableIndexOnWriteFailure, boolean failRebuildTask, Boolean throwIndexWriteFailure) { - this.transactional = transactional; + public MutableIndexFailureIT(String transactionProvider, boolean localIndex, boolean isNamespaceMapped, Boolean disableIndexOnWriteFailure, boolean failRebuildTask, Boolean throwIndexWriteFailure) { + this.transactional = transactionProvider != null; + this.transactionProvider = transactionProvider == null ? null : + TransactionFactory.getTransactionProvider(TransactionFactory.Provider.valueOf(transactionProvider)); this.localIndex = localIndex; - this.tableDDLOptions = " SALT_BUCKETS=2, COLUMN_ENCODED_BYTES=NONE" + (transactional ? ", TRANSACTIONAL=true " : "") + this.tableDDLOptions = " SALT_BUCKETS=2, COLUMN_ENCODED_BYTES=NONE" + (transactional ? (",TRANSACTIONAL=true,TRANSACTION_PROVIDER='"+transactionProvider+"'") : "") + (disableIndexOnWriteFailure == null ? "" : (", " + PhoenixIndexFailurePolicy.DISABLE_INDEX_ON_WRITE_FAILURE + "=" + disableIndexOnWriteFailure)) + (throwIndexWriteFailure == null ? "" : (", " + PhoenixIndexFailurePolicy.THROW_INDEX_WRITE_FAILURE + "=" + throwIndexWriteFailure)); this.tableName = FailingRegionObserver.FAIL_TABLE_NAME; @@ -168,26 +174,27 @@ public class MutableIndexFailureIT extends BaseTest { return serverProps; } - @Parameters(name = "MutableIndexFailureIT_transactional={0},localIndex={1},isNamespaceMapped={2},disableIndexOnWriteFailure={3},failRebuildTask={4},throwIndexWriteFailure={5}") // name is used by failsafe as file name in reports - public static List<Object[]> data() { - return Arrays.asList(new Object[][] { - // note - can't disableIndexOnWriteFailure without throwIndexWriteFailure, PHOENIX-4130 - { false, false, false, false, false, false}, - { false, false, false, true, false, null}, - { true, false, false, true, false, null}, - { false, true, false, null, false, null}, - { true, true, false, true, false, null}, - { false, false, false, false, false, null}, - { false, true, false, false, false, null}, - { false, false, false, false, false, null}, - { false, false, false, true, false, null}, - { false, false, false, true, false, null}, - { false, true, false, true, false, null}, - { false, true, false, true, false, null}, - { false, false, false, true, true, null}, - { false, false, false, false, true, false}, - } - ); + @Parameters(name = "MutableIndexFailureIT_transactionProvider={0},localIndex={1},isNamespaceMapped={2},disableIndexOnWriteFailure={3},failRebuildTask={4},throwIndexWriteFailure={5}") // name is used by failsafe as file name in reports + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData( + Arrays.asList(new Object[][] { + // note - can't disableIndexOnWriteFailure without throwIndexWriteFailure, PHOENIX-4130 + { null, false, false, false, false, false}, + { null, false, false, true, false, null}, + { "TEPHRA", false, false, true, false, null}, + { "OMID", false, false, true, false, null}, + { null, true, false, null, false, null}, + { "TEPHRA", true, false, true, false, null}, + { null, false, false, false, false, null}, + { null, true, false, false, false, null}, + { null, false, false, false, false, null}, + { null, false, false, true, false, null}, + { null, true, false, true, false, null}, + { null, true, false, true, false, null}, + { null, false, false, true, true, null}, + { null, false, false, false, true, false}, + }), 0); + } private void runRebuildTask(Connection conn) throws InterruptedException, SQLException { @@ -253,7 +260,10 @@ public class MutableIndexFailureIT extends BaseTest { // Create other index which should be local/global if the other index is global/local to // check the drop index. conn.createStatement().execute( - "CREATE " + (!localIndex ? "LOCAL " : "") + " INDEX " + secondIndexName + " ON " + fullTableName + " (v2) INCLUDE (v1)"); + "CREATE " + ((!localIndex && + (transactionProvider == null + || !transactionProvider.isUnsupported(PhoenixTransactionProvider.Feature.ALLOW_LOCAL_INDEX))) + ? "LOCAL " : "") + " INDEX " + secondIndexName + " ON " + fullTableName + " (v2) INCLUDE (v1)"); conn.createStatement().execute( "CREATE " + (localIndex ? "LOCAL " : "") + " INDEX " + thirdIndexName + " ON " + fullTableName + " (v1) INCLUDE (v2)"); @@ -465,17 +475,16 @@ public class MutableIndexFailureIT extends BaseTest { } } - private void validateDataWithIndex(Connection conn, String fullTableName, String fullIndexName, boolean localIndex) throws SQLException { + private void validateDataWithIndex(Connection conn, String fullTableName, String fullIndexName, boolean localIndex) throws Exception { String query = "SELECT /*+ INDEX(" + fullTableName + " " + SchemaUtil.getTableNameFromFullName(fullIndexName) + ") */ k,v1 FROM " + fullTableName; - ResultSet rs = conn.createStatement().executeQuery("EXPLAIN " + query); + ResultSet rs = conn.createStatement().executeQuery(query); String expectedPlan = " OVER " + (localIndex ? Bytes.toString( SchemaUtil.getPhysicalTableName(fullTableName.getBytes(), isNamespaceMapped).getName()) : SchemaUtil.getPhysicalTableName(fullIndexName.getBytes(), isNamespaceMapped).getNameAsString()); - String explainPlan = QueryUtil.getExplainPlan(rs); + String explainPlan = QueryUtil.getExplainPlan(conn.createStatement().executeQuery("EXPLAIN " + query)); assertTrue(explainPlan, explainPlan.contains(expectedPlan)); - rs = conn.createStatement().executeQuery(query); if (transactional) { // failed commit does not get retried assertTrue(rs.next()); assertEquals("a", rs.getString(1)); @@ -507,7 +516,7 @@ public class MutableIndexFailureIT extends BaseTest { } } - private void updateTable(Connection conn, boolean commitShouldFail) throws SQLException { + private void updateTable(Connection conn, boolean commitShouldFail) throws Exception { PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + fullTableName + " VALUES(?,?,?)"); // Insert new row stmt.setString(1, "d"); http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureWithNamespaceIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureWithNamespaceIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureWithNamespaceIT.java index 5ed9e1f..b6ec49a 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureWithNamespaceIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureWithNamespaceIT.java @@ -18,7 +18,7 @@ package org.apache.phoenix.end2end.index; import java.util.Arrays; -import java.util.List; +import java.util.Collection; import java.util.Map; import org.apache.hadoop.hbase.HConstants; @@ -29,6 +29,7 @@ import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.util.ReadOnlyProps; import org.apache.phoenix.util.SchemaUtil; +import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; import org.junit.runners.Parameterized.Parameters; @@ -39,9 +40,9 @@ import com.google.common.collect.Maps; */ public class MutableIndexFailureWithNamespaceIT extends MutableIndexFailureIT { - public MutableIndexFailureWithNamespaceIT(boolean transactional, boolean localIndex, boolean isNamespaceMapped, + public MutableIndexFailureWithNamespaceIT(String transactionProvider, boolean localIndex, boolean isNamespaceMapped, Boolean disableIndexOnWriteFailure, boolean failRebuildTask, Boolean throwIndexWriteFailure) { - super(transactional, localIndex, isNamespaceMapped, disableIndexOnWriteFailure, failRebuildTask, + super(transactionProvider, localIndex, isNamespaceMapped, disableIndexOnWriteFailure, failRebuildTask, throwIndexWriteFailure); } @@ -63,18 +64,19 @@ public class MutableIndexFailureWithNamespaceIT extends MutableIndexFailureIT { } @Parameters(name = "MutableIndexFailureIT_transactional={0},localIndex={1},isNamespaceMapped={2},disableIndexOnWriteFailure={3},failRebuildTask={4},throwIndexWriteFailure={5}") // name is used by failsafe as file name in reports - public static List<Object[]> data() { - return Arrays.asList(new Object[][] { + public static Collection<Object[]> data() { + return TestUtil.filterTxParamData(Arrays.asList(new Object[][] { // note - can't disableIndexOnWriteFailure without throwIndexWriteFailure, PHOENIX-4130 - { false, false, true, true, false, null}, - { false, false, true, true, false, true}, - { true, false, true, true, false, null}, - { false, true, true, true, false, null}, - { true, true, true, null, false, null}, - { false, false, true, true, true, null}, - { false, false, true, false, true, false}, + { null, false, true, true, false, null}, + { null, false, true, true, false, true}, + { "TEPHRA", false, true, true, false, null}, + { "OMID", false, true, true, false, null}, + { null, true, true, true, false, null}, + { "TEPHRA", true, true, null, false, null}, + { null, false, true, true, true, null}, + { null, false, true, false, true, false}, } - ); + ),0); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd9af912/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java index 4433e12..a994094 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java @@ -106,16 +106,15 @@ public class MutableIndexIT extends ParallelStatsDisabledIT { return getConnection(props); } - @Parameters(name="MutableIndexIT_localIndex={0},transactional={1},columnEncoded={2}") // name is used by failsafe as file name in reports + @Parameters(name="MutableIndexIT_localIndex={0},transactionProvider={1},columnEncoded={2}") // name is used by failsafe as file name in reports public static Collection<Object[]> data() { - return Arrays.asList(new Object[][] { + return TestUtil.filterTxParamData(Arrays.asList(new Object[][] { { false, null, false }, { false, null, true }, { false, "TEPHRA", false }, { false, "TEPHRA", true }, - //{ false, "OMID", false }, { false, "OMID", true }, + { false, "OMID", false }, { true, null, false }, { true, null, true }, { true, "TEPHRA", false }, { true, "TEPHRA", true }, - //{ true, "OMID", false }, { true, "OMID", true }, - }); + }),1); } @Test
