[
https://issues.apache.org/jira/browse/HIVE-12352?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eugene Koifman updated HIVE-12352:
----------------------------------
Target Version/s: 1.3.0, 2.0.0 (was: 1.3.0)
> CompactionTxnHandler.markCleaned() may delete too much
> ------------------------------------------------------
>
> Key: HIVE-12352
> URL: https://issues.apache.org/jira/browse/HIVE-12352
> Project: Hive
> Issue Type: Bug
> Components: Transactions
> Affects Versions: 1.0.0
> Reporter: Eugene Koifman
> Assignee: Eugene Koifman
> Priority: Blocker
>
> Worker will start with DB in state X (wrt this partition).
> while it's working more txns will happen, against partition it's
> compacting.
> then this will delete state up to X and since then. There may be new
> delta files created
> between compaction starting and cleaning. These will not be compacted
> until more
> transactions happen. So this ideally should only delete
> up to TXN_ID that was compacted (i.e. HWM in Worker?) Then this can also
> run
> at READ_COMMITTED. So this means we'd want to store HWM in
> COMPACTION_QUEUE when
> Worker picks up the job.
> Actually the problem is even worse (but also solved using HWM as above):
> Suppose some transactions (against same partition) have started and aborted
> since the time Worker ran compaction job.
> That means there are never-compacted delta files with data that belongs to
> these aborted txns.
> Following will pick up these aborted txns.
> s = "select txn_id from TXNS, TXN_COMPONENTS where txn_id = tc_txnid and
> txn_state = '" +
> TXN_ABORTED + "' and tc_database = '" + info.dbname + "' and
> tc_table = '" +
> info.tableName + "'";
> if (info.partName != null) s += " and tc_partition = '" +
> info.partName + "'";
> The logic after that will delete relevant data from TXN_COMPONENTS and if one
> of these txns becomes empty, it will be picked up by cleanEmptyAbortedTxns().
> At that point any metadata about an Aborted txn is gone and the system will
> think it's committed.
> HWM in this case would be (in ValidCompactorTxnList)
> if(minOpenTxn > 0)
> min(highWaterMark, minOpenTxn)
> else
> highWaterMark
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)