[ https://issues.apache.org/jira/browse/TEPHRA-244?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16160736#comment-16160736 ]
ASF GitHub Bot commented on TEPHRA-244: --------------------------------------- Github user poornachandra commented on a diff in the pull request: https://github.com/apache/incubator-tephra/pull/55#discussion_r137981906 --- Diff: tephra-hbase-compat-1.1-base/src/test/java/org/apache/tephra/hbase/txprune/InvalidListPruneTest.java --- @@ -384,7 +384,67 @@ public void testPruneEmptyTable() throws Exception { hBaseAdmin.disableTable(txEmptyTable); hBaseAdmin.deleteTable(txEmptyTable); } + } + + @Test + public void testPruneTransientTable() throws Exception { + // Make sure that transient tables do not block the progress of pruning + + // Create a temp table + TableName txTempTable = TableName.valueOf("tempTable"); + createTable(txTempTable.getName(), new byte[][]{family}, false, + Collections.singletonList(TestTransactionProcessor.class.getName())); + + TableName txDataTable2 = null; + + TransactionPruningPlugin transactionPruningPlugin = new TestTransactionPruningPlugin(); + transactionPruningPlugin.initialize(conf); + + try { + long now1 = System.currentTimeMillis(); + long inactiveTxTimeNow1 = (now1 - 150) * TxConstants.MAX_TX_PER_MS; + long noPruneUpperBound = -1; + long expectedPruneUpperBound1 = (now1 - 200) * TxConstants.MAX_TX_PER_MS; + InMemoryTransactionStateCache.setTransactionSnapshot( + new TransactionSnapshot(expectedPruneUpperBound1, expectedPruneUpperBound1, expectedPruneUpperBound1, + ImmutableSet.of(expectedPruneUpperBound1), + ImmutableSortedMap.<Long, TransactionManager.InProgressTx>of())); + + // fetch prune upper bound, there should be no prune upper bound since nothing has been compacted yet. + // This run is only to store the initial set of regions + long pruneUpperBound1 = transactionPruningPlugin.fetchPruneUpperBound(now1, inactiveTxTimeNow1); + Assert.assertEquals(noPruneUpperBound, pruneUpperBound1); + transactionPruningPlugin.pruneComplete(now1, noPruneUpperBound); + + // Now delete the transient table + hBaseAdmin.disableTable(txTempTable); + hBaseAdmin.deleteTable(txTempTable); + + // Compact the data table now + testUtil.compact(txDataTable1, true); + // Since the write to prune table happens async, we need to sleep a bit before checking the state of the table + TimeUnit.SECONDS.sleep(2); + + // Create a new table that will not be compacted + txDataTable2 = TableName.valueOf("invalidListPruneTestTable2"); + createTable(txDataTable2.getName(), new byte[][]{family}, false, + Collections.singletonList(TestTransactionProcessor.class.getName())); + + // fetch prune upper bound, there should be a prune upper bound even though txTempTable does not exist anymore, + // and txDataTable2 has not been compacted/flushed yet + long now2 = System.currentTimeMillis(); + long inactiveTxTimeNow2 = (now1 - 150) * TxConstants.MAX_TX_PER_MS; + long pruneUpperBound2 = transactionPruningPlugin.fetchPruneUpperBound(now2, inactiveTxTimeNow2); + Assert.assertEquals(expectedPruneUpperBound1, pruneUpperBound2); + transactionPruningPlugin.pruneComplete(now2, expectedPruneUpperBound1); + } finally { + transactionPruningPlugin.destroy(); + if (txDataTable2 != null) { --- End diff -- 👍 > Invalid tx pruning does not handle deletion of tables well > ---------------------------------------------------------- > > Key: TEPHRA-244 > URL: https://issues.apache.org/jira/browse/TEPHRA-244 > Project: Tephra > Issue Type: Bug > Components: core, manager > Affects Versions: 0.12.0-incubating > Reporter: Andreas Neumann > Assignee: Poorna Chandra > Fix For: 0.13.0-incubating > > > Suppose an application regularly creates and deletes tables (for example, > temporary tables). In such a scenario, there will always be such a temporary > table when pruning runs, and its regions will be recorded for that time. > However, the region will be deleted before it ever compacts or flushes, and > it will never record prune information. Because all prune times have such > regions, there will never be a set of transactional regions that all have > prune info, and pruning will never happen. > The fix is to exclude deleted tables from the list of regions at each time. > This is all regions of deleted tables (tables that do not exist any more), > not deleted regions: a region may disappear due to a split and its data will > be in new regions. -- This message was sent by Atlassian JIRA (v6.4.14#64029)