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/a311026b
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/a311026b
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/a311026b

Branch: refs/heads/4.x-HBase-1.4
Commit: a311026b7c11c79a99f7c5cedc8210c8839f9bfd
Parents: 391306c
Author: James Taylor <[email protected]>
Authored: Thu Oct 4 08:19:37 2018 -0700
Committer: James Taylor <[email protected]>
Committed: Fri Oct 5 08:09:59 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       | 300 +++++++++++++++++++
 .../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, 1805 insertions(+), 794 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/a311026b/.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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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/a311026b/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

Reply via email to