merge latest txn changes
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/38aeb5f9 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/38aeb5f9 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/38aeb5f9 Branch: refs/heads/txn Commit: 38aeb5f9bd7bf2bf1fb957c50318fed926e968c1 Parents: 518ae46 Author: Thomas D'Silva <[email protected]> Authored: Mon Nov 9 11:20:23 2015 -0800 Committer: Thomas D'Silva <[email protected]> Committed: Mon Nov 9 11:20:23 2015 -0800 ---------------------------------------------------------------------- phoenix-core/pom.xml | 2 +- .../apache/phoenix/end2end/AlterTableIT.java | 2 +- .../apache/phoenix/end2end/index/IndexIT.java | 109 +++++++++---------- .../phoenix/end2end/index/txn/RollbackIT.java | 3 +- .../org/apache/phoenix/tx/TransactionIT.java | 2 +- .../apache/phoenix/execute/MutationState.java | 9 +- .../apache/phoenix/index/IndexMaintainer.java | 11 +- .../index/PhoenixTransactionalIndexer.java | 2 +- .../phoenix/iterate/TableResultIterator.java | 5 - .../query/ConnectionQueryServicesImpl.java | 11 +- .../apache/phoenix/query/QueryConstants.java | 3 +- .../org/apache/phoenix/schema/PTableImpl.java | 2 +- .../apache/phoenix/util/TransactionUtil.java | 2 +- 13 files changed, 87 insertions(+), 76 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/pom.xml ---------------------------------------------------------------------- diff --git a/phoenix-core/pom.xml b/phoenix-core/pom.xml index 428f5d0..5c73ed4 100644 --- a/phoenix-core/pom.xml +++ b/phoenix-core/pom.xml @@ -244,7 +244,7 @@ </dependency> <dependency> <groupId>co.cask.tephra</groupId> - <artifactId>tephra-hbase-compat-0.98</artifactId> + <artifactId>tephra-hbase-compat-1.1</artifactId> <version>${tephra.version}</version> </dependency> http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/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 01d2552..279aa61 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 @@ -63,7 +63,7 @@ import org.junit.BeforeClass; import org.junit.Test; import co.cask.tephra.TxConstants; -import co.cask.tephra.hbase98.coprocessor.TransactionProcessor; +import co.cask.tephra.hbase11.coprocessor.TransactionProcessor; /** * http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java index 3738e5b..b347538 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexIT.java @@ -185,61 +185,60 @@ public class IndexIT extends BaseHBaseManagedTimeIT { } } - //TODO ENABLE THIS TEST AFTER MERGING MASTER TO SEE IF THE SCAN IS CREATED CORRECTLY -// @Test -// public void testDeleteFromNonPKColumnIndex() throws Exception { -// Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); -// // create unique table and index names for each parameterized test -// String tableName = TestUtil.DEFAULT_DATA_TABLE_NAME + "_" + System.currentTimeMillis(); -// String indexName = "IDX" + "_" + System.currentTimeMillis(); -// String fullTableName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, tableName); -// String fullIndexName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, indexName); -// String ddl ="CREATE TABLE " + fullTableName + BaseTest.TEST_TABLE_SCHEMA + tableDDLOptions; -// try (Connection conn = DriverManager.getConnection(getUrl(), props)) { -// conn.setAutoCommit(false); -// Statement stmt = conn.createStatement(); -// stmt.execute(ddl); -// BaseTest.populateTestTable(fullTableName); -// ddl = "CREATE " + (localIndex ? "LOCAL" : "") + " INDEX " + indexName + " ON " + fullTableName -// + " (long_col1, long_col2)" -// + " INCLUDE (decimal_col1, decimal_col2)"; -// stmt.execute(ddl); -// } -// try (Connection conn = DriverManager.getConnection(getUrl(), props)) { -// ResultSet rs; -// -// rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + fullTableName); -// assertTrue(rs.next()); -// assertEquals(3,rs.getInt(1)); -// rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + fullIndexName); -// assertTrue(rs.next()); -// assertEquals(3,rs.getInt(1)); -// -// String dml = "DELETE from " + fullTableName + " WHERE long_col2 = 4"; -// assertEquals(1,conn.createStatement().executeUpdate(dml)); -// conn.commit(); -// -// // query the data table -// String query = "SELECT /*+ NO_INDEX */ long_pk FROM " + fullTableName; -// rs = conn.createStatement().executeQuery(query); -// assertTrue(rs.next()); -// assertEquals(1L, rs.getLong(1)); -// assertTrue(rs.next()); -// assertEquals(3L, rs.getLong(1)); -// assertFalse(rs.next()); -// -// // query the index table -// query = "SELECT long_pk FROM " + fullTableName + " ORDER BY long_col1"; -// rs = conn.createStatement().executeQuery(query); -// assertTrue(rs.next()); -// assertEquals(1L, rs.getLong(1)); -// assertTrue(rs.next()); -// assertEquals(3L, rs.getLong(1)); -// assertFalse(rs.next()); -// -// conn.createStatement().execute("DROP INDEX " + indexName + " ON " + fullTableName); -// } -// } + @Test + public void testDeleteFromNonPKColumnIndex() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + // create unique table and index names for each parameterized test + String tableName = TestUtil.DEFAULT_DATA_TABLE_NAME + "_" + System.currentTimeMillis(); + String indexName = "IDX" + "_" + System.currentTimeMillis(); + String fullTableName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, tableName); + String fullIndexName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, indexName); + String ddl ="CREATE TABLE " + fullTableName + BaseTest.TEST_TABLE_SCHEMA + tableDDLOptions; + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.setAutoCommit(false); + Statement stmt = conn.createStatement(); + stmt.execute(ddl); + BaseTest.populateTestTable(fullTableName); + ddl = "CREATE " + (localIndex ? "LOCAL" : "") + " INDEX " + indexName + " ON " + fullTableName + + " (long_col1, long_col2)" + + " INCLUDE (decimal_col1, decimal_col2)"; + stmt.execute(ddl); + } + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + ResultSet rs; + + rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + fullTableName); + assertTrue(rs.next()); + assertEquals(3,rs.getInt(1)); + rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + fullIndexName); + assertTrue(rs.next()); + assertEquals(3,rs.getInt(1)); + + String dml = "DELETE from " + fullTableName + " WHERE long_col2 = 4"; + assertEquals(1,conn.createStatement().executeUpdate(dml)); + conn.commit(); + + // query the data table + String query = "SELECT /*+ NO_INDEX */ long_pk FROM " + fullTableName; + rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals(1L, rs.getLong(1)); + assertTrue(rs.next()); + assertEquals(3L, rs.getLong(1)); + assertFalse(rs.next()); + + // query the index table + query = "SELECT long_pk FROM " + fullTableName + " ORDER BY long_col1"; + rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals(1L, rs.getLong(1)); + assertTrue(rs.next()); + assertEquals(3L, rs.getLong(1)); + assertFalse(rs.next()); + + conn.createStatement().execute("DROP INDEX " + indexName + " ON " + fullTableName); + } + } @Test public void testGroupByCount() throws Exception { http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java index b7ec3c6..91efd45 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/RollbackIT.java @@ -52,7 +52,8 @@ public class RollbackIT extends BaseHBaseManagedTimeIT { @Parameters(name="localIndex = {0} , mutable = {1}") public static Collection<Boolean[]> data() { return Arrays.asList(new Boolean[][] { - { false, false }, { false, true }, { true, false }, { true, true } + { false, false }, { false, true }, + { true, false }, { true, true } }); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/it/java/org/apache/phoenix/tx/TransactionIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/tx/TransactionIT.java b/phoenix-core/src/it/java/org/apache/phoenix/tx/TransactionIT.java index fc73534..974d104 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/tx/TransactionIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/tx/TransactionIT.java @@ -44,7 +44,7 @@ import org.junit.Test; import com.google.common.collect.Lists; -import co.cask.tephra.hbase98.coprocessor.TransactionProcessor; +import co.cask.tephra.hbase11.coprocessor.TransactionProcessor; public class TransactionIT extends BaseHBaseManagedTimeIT { http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java index 33709c8..8633e8a 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java @@ -31,6 +31,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.concurrent.Immutable; + import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.HTableInterface; @@ -96,7 +99,7 @@ import co.cask.tephra.TransactionCodec; import co.cask.tephra.TransactionContext; import co.cask.tephra.TransactionFailureException; import co.cask.tephra.TransactionSystemClient; -import co.cask.tephra.hbase98.TransactionAwareHTable; +import co.cask.tephra.hbase11.TransactionAwareHTable; /** * @@ -485,7 +488,7 @@ public class MutationState implements SQLCloseable { Iterator<Map.Entry<ImmutableBytesPtr,RowMutationState>> iterator = values.entrySet().iterator(); long timestampToUse = timestamp; while (iterator.hasNext()) { - Entry<ImmutableBytesPtr, RowMutationState> rowEntry = iterator.next(); + Map.Entry<ImmutableBytesPtr, RowMutationState> rowEntry = iterator.next(); ImmutableBytesPtr key = rowEntry.getKey(); RowMutationState state = rowEntry.getValue(); if (tableWithRowTimestampCol) { @@ -728,7 +731,7 @@ public class MutationState implements SQLCloseable { // at this point we are going through mutations for each table TableRef tableRef = tableRefIterator.next(); Map<ImmutableBytesPtr, RowMutationState> valuesMap = mutations.get(tableRef); - if (valuesMap == null) { + if (valuesMap == null || valuesMap.isEmpty()) { continue; } PTable table = tableRef.getTable(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java b/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java index 1f64003..9b051f2 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java @@ -883,7 +883,16 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { } // This is what a delete looks like on the server side for mutable indexing... // Should all be one or the other for DeleteFamily versus DeleteFamilyVersion, but just in case not - return nDeleteVersionCF >= this.nDataCFs ? DeleteType.SINGLE_VERSION : nDeleteCF + nDeleteVersionCF >= this.nDataCFs ? DeleteType.ALL_VERSIONS : null; + DeleteType deleteType = null; + if (nDeleteVersionCF > 0 && nDeleteVersionCF >= this.nDataCFs) { + deleteType = DeleteType.SINGLE_VERSION; + } else { + int nDelete = nDeleteCF + nDeleteVersionCF; + if (nDelete>0 && nDelete >= this.nDataCFs) { + deleteType = DeleteType.ALL_VERSIONS; + } + } + return deleteType; } public boolean isRowDeleted(Collection<KeyValue> pendingUpdates) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixTransactionalIndexer.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixTransactionalIndexer.java b/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixTransactionalIndexer.java index bbb7768..63b6ed9 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixTransactionalIndexer.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixTransactionalIndexer.java @@ -72,7 +72,7 @@ import com.google.common.primitives.Longs; import co.cask.tephra.Transaction; import co.cask.tephra.Transaction.VisibilityLevel; import co.cask.tephra.TxConstants; -import co.cask.tephra.hbase98.TransactionAwareHTable; +import co.cask.tephra.hbase11.TransactionAwareHTable; /** * Do all the work of managing index updates for a transactional table from a single coprocessor. Since the transaction http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableResultIterator.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableResultIterator.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableResultIterator.java index f1a2496..7d07a4a 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableResultIterator.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableResultIterator.java @@ -67,11 +67,6 @@ public class TableResultIterator implements ResultIterator { delegate = this.delegate; if (delegate == null) { try { - ResultScanner resultScanner = htable.getScanner(scan); - Result result = null; - while ( (result = resultScanner.next())!=null ) { - System.out.println(result); - } this.delegate = delegate = isClosing ? ResultIterator.EMPTY_ITERATOR : new ScanningResultIterator(htable.getScanner(scan), scanMetrics); } catch (IOException e) { Closeables.closeQuietly(htable); http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java index 6a6f726..0ace121 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java @@ -27,6 +27,7 @@ import static org.apache.phoenix.util.UpgradeUtil.upgradeTo4_5_0; import java.io.IOException; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -49,7 +50,7 @@ import co.cask.tephra.TransactionSystemClient; import co.cask.tephra.TxConstants; import co.cask.tephra.distributed.PooledClientProvider; import co.cask.tephra.distributed.TransactionServiceClient; -import co.cask.tephra.hbase98.coprocessor.TransactionProcessor; +import co.cask.tephra.hbase11.coprocessor.TransactionProcessor; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HColumnDescriptor; @@ -1387,7 +1388,8 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement builder.addTableMetadataMutations(mp.toByteString()); } builder.setClientVersion(VersionUtil.encodeVersion(PHOENIX_MAJOR_VERSION, PHOENIX_MINOR_VERSION, PHOENIX_PATCH_NUMBER)); - instance.createTable(controller, builder.build(), rpcCallback); + CreateTableRequest build = builder.build(); + instance.createTable(controller, build, rpcCallback); if(controller.getFailedOn() != null) { throw controller.getFailedOn(); } @@ -1621,7 +1623,8 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement @Override public MetaDataMutationResult addColumn(final List<Mutation> tableMetaData, PTable table, Map<String, List<Pair<String,Object>>> stmtProperties, Set<String> colFamiliesForPColumnsToBeAdded) throws SQLException { - Map<String, Object> tableProps = new HashMap<String, Object>(); + List<Pair<byte[], Map<String, Object>>> families = new ArrayList<>(stmtProperties.size()); + Map<String, Object> tableProps = new HashMap<String, Object>(); Set<HTableDescriptor> tableDescriptors = Collections.emptySet(); Set<HTableDescriptor> origTableDescriptors = Collections.emptySet(); boolean nonTxToTx = false; @@ -1692,7 +1695,7 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement MutationProto mp = ProtobufUtil.toProto(m); builder.addTableMetadataMutations(mp.toByteString()); } - + builder.setClientVersion(VersionUtil.encodeVersion(PHOENIX_MAJOR_VERSION, PHOENIX_MINOR_VERSION, PHOENIX_PATCH_NUMBER)); instance.addColumn(controller, builder.build(), rpcCallback); if(controller.getFailedOn() != null) { throw controller.getFailedOn(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java index 340af79..1cac37f 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java @@ -332,6 +332,7 @@ public interface QueryConstants { HConstants.VERSIONS + "=" + MetaDataProtocol.DEFAULT_MAX_META_DATA_VERSIONS + ",\n" + HColumnDescriptor.KEEP_DELETED_CELLS + "=" + MetaDataProtocol.DEFAULT_META_DATA_KEEP_DELETED_CELLS + ",\n"+ // Install split policy to prevent a tenant's metadata from being split across regions. - HTableDescriptor.SPLIT_POLICY + "='" + MetaDataSplitPolicy.class.getName() + "'\n"; + HTableDescriptor.SPLIT_POLICY + "='" + MetaDataSplitPolicy.class.getName() + "',\n" + + PhoenixDatabaseMetaData.TRANSACTIONAL + "=" + Boolean.FALSE; } http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java index bebdaf0..b09c5ea 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java @@ -238,7 +238,7 @@ public class PTableImpl implements PTable { table.getTenantId(), table.getSchemaName(), table.getTableName(), table.getType(), table.getIndexState(), timeStamp, sequenceNumber, table.getPKName(), table.getBucketNum(), columns, table.getParentSchemaName(), table.getParentTableName(), table.getIndexes(), isImmutableRows, table.getPhysicalNames(), table.getDefaultFamilyName(), table.getViewStatement(), - isWalDisabled, isMultitenant, storeNulls, table.getViewType(), table.getViewIndexId(), table.getIndexType(), isTransactional, table.getTableStats(), + isWalDisabled, isMultitenant, storeNulls, table.getViewType(), table.getViewIndexId(), table.getIndexType(), table.getTableStats(), table.getBaseColumnCount(), table.rowKeyOrderOptimizable(), table.isTransactional()); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/38aeb5f9/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java index 020ac3b..175847d 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java @@ -30,7 +30,7 @@ import org.apache.phoenix.schema.PTable; import co.cask.tephra.TransactionConflictException; import co.cask.tephra.TransactionFailureException; import co.cask.tephra.TxConstants; -import co.cask.tephra.hbase98.TransactionAwareHTable; +import co.cask.tephra.hbase11.TransactionAwareHTable; public class TransactionUtil { private TransactionUtil() {
