FAQ
Repository: hive
Updated Branches:
   refs/heads/branch-1 703526bc3 -> 87e5b4ef2


HIVE-12266 When client exists abnormally, it doesn't release ACID locks (Wei Zheng, via Eugene Koifman)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/87e5b4ef
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/87e5b4ef
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/87e5b4ef

Branch: refs/heads/branch-1
Commit: 87e5b4ef2f3a05f1c902b85588d1d96f8fe560b9
Parents: 703526b
Author: Eugene Koifman <ekoifman@hortonworks.com>
Authored: Tue Nov 3 11:47:52 2015 -0800
Committer: Eugene Koifman <ekoifman@hortonworks.com>
Committed: Tue Nov 3 11:47:52 2015 -0800

----------------------------------------------------------------------
  .../java/org/apache/hadoop/hive/ql/Driver.java | 43 +++++++++++++++-----
  1 file changed, 32 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/87e5b4ef/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
index 9b6104e..33c6ab5 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
@@ -119,12 +119,14 @@ import org.apache.hadoop.hive.shims.Utils;
  import org.apache.hadoop.mapred.ClusterStatus;
  import org.apache.hadoop.mapred.JobClient;
  import org.apache.hadoop.mapred.JobConf;
+import org.apache.hive.common.util.ShutdownHookManager;

  public class Driver implements CommandProcessor {

    static final private String CLASS_NAME = Driver.class.getName();
    static final private Log LOG = LogFactory.getLog(CLASS_NAME);
    static final private LogHelper console = new LogHelper(LOG);
+ static final int SHUTDOWN_HOOK_PRIORITY = 0;

    private static final Object compileMonitor = new Object();

@@ -387,7 +389,20 @@ public class Driver implements CommandProcessor {

      try {
        // Initialize the transaction manager. This must be done before analyze is called.
- SessionState.get().initTxnMgr(conf);
+ final HiveTxnManager txnManager = SessionState.get().initTxnMgr(conf);
+ // In case when user Ctrl-C twice to kill Hive CLI JVM, we want to release locks
+ ShutdownHookManager.addShutdownHook(
+ new Runnable() {
+ @Override
+ public void run() {
+ try {
+ releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false, txnManager);
+ } catch (LockException e) {
+ LOG.warn("Exception when releasing locks in ShutdownHook for Driver: " +
+ e.getMessage());
+ }
+ }
+ }, SHUTDOWN_HOOK_PRIORITY);

        command = new VariableSubstitution().substitute(conf, command);
        ctx = new Context(conf);
@@ -1037,16 +1052,22 @@ public class Driver implements CommandProcessor {
     * list of hive locks to be released Release all the locks specified. If some of the
     * locks have already been released, ignore them
     * @param commit if there is an open transaction and if true, commit,
- * if false rollback. If there is no open transaction this parameter is ignored.
+ * @param txnManager an optional existing transaction manager retrieved earlier from the session
     *
     **/
- private void releaseLocksAndCommitOrRollback(List<HiveLock> hiveLocks, boolean commit)
+ private void releaseLocksAndCommitOrRollback(List<HiveLock> hiveLocks, boolean commit,
+ HiveTxnManager txnManager)
        throws LockException {
      PerfLogger perfLogger = PerfLogger.getPerfLogger();
      perfLogger.PerfLogBegin(CLASS_NAME, PerfLogger.RELEASE_LOCKS);

- SessionState ss = SessionState.get();
- HiveTxnManager txnMgr = ss.getTxnMgr();
+ HiveTxnManager txnMgr;
+ if (txnManager == null) {
+ SessionState ss = SessionState.get();
+ txnMgr = ss.getTxnMgr();
+ } else {
+ txnMgr = txnManager;
+ }
      // If we've opened a transaction we need to commit or rollback rather than explicitly
      // releasing the locks.
      if (txnMgr.isTxnOpen()) {
@@ -1146,7 +1167,7 @@ public class Driver implements CommandProcessor {
      }
      if (ret != 0) {
        try {
- releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false);
+ releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false, null);
        } catch (LockException e) {
          LOG.warn("Exception in releasing locks. "
              + org.apache.hadoop.util.StringUtils.stringifyException(e));
@@ -1231,7 +1252,7 @@ public class Driver implements CommandProcessor {
          if(plan.getAutoCommitValue() && !txnManager.getAutoCommit()) {
            /*here, if there is an open txn, we want to commit it; this behavior matches
            * https://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#setAutoCommit(boolean)*/
- releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), true);
+ releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), true, null);
            txnManager.setAutoCommit(true);
          }
          else if(!plan.getAutoCommitValue() && txnManager.getAutoCommit()) {
@@ -1259,10 +1280,10 @@ public class Driver implements CommandProcessor {
      //if needRequireLock is false, the release here will do nothing because there is no lock
      try {
        if(txnManager.getAutoCommit() || plan.getOperation() == HiveOperation.COMMIT) {
- releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), true);
+ releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), true, null);
        }
        else if(plan.getOperation() == HiveOperation.ROLLBACK) {
- releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false);
+ releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false, null);
        }
        else {
          //txn (if there is one started) is not finished
@@ -1294,7 +1315,7 @@ public class Driver implements CommandProcessor {
    private CommandProcessorResponse rollback(CommandProcessorResponse cpr) {
      //console.printError(cpr.toString());
      try {
- releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false);
+ releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false, null);
      }
      catch (LockException e) {
        LOG.error("rollback() FAILED: " + cpr);//make sure not to loose
@@ -1865,7 +1886,7 @@ public class Driver implements CommandProcessor {
      destroyed = true;
      if (ctx != null) {
        try {
- releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false);
+ releaseLocksAndCommitOrRollback(ctx.getHiveLocks(), false, null);
        } catch (LockException e) {
          LOG.warn("Exception when releasing locking in destroy: " +
              e.getMessage());

Search Discussions

Discussion Posts

Previous

Related Discussions

Discussion Navigation
viewthread | post
posts ‹ prev | 4 of 4 | next ›
Discussion Overview
groupcommits @
categorieshive, hadoop
postedNov 3, '15 at 5:27p
activeNov 3, '15 at 7:48p
posts4
users1
websitehive.apache.org

1 user in discussion

Ekoifman: 4 posts

People

Translate

site design / logo © 2021 Grokbase