Index: ql/src/java/org/apache/hadoop/hive/ql/exec/JoinOperator.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/JoinOperator.java (revision 1387086) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/JoinOperator.java (working copy) @@ -152,7 +152,7 @@ } @Override - public void jobClose(Configuration hconf, boolean success, JobCloseFeedBack feedBack) + public void jobCloseOp(Configuration hconf, boolean success, JobCloseFeedBack feedBack) throws HiveException { int numAliases = conf.getExprs().size(); if (conf.getHandleSkewJoin()) { @@ -189,7 +189,7 @@ throw new HiveException(e); } } - super.jobClose(hconf, success, feedBack); + super.jobCloseOp(hconf, success, feedBack); } private void moveUpFiles(String specPath, Configuration hconf, Log log) Index: ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java (revision 1387086) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java (working copy) @@ -744,7 +744,7 @@ } @Override - public void jobClose(Configuration hconf, boolean success, JobCloseFeedBack feedBack) + public void jobCloseOp(Configuration hconf, boolean success, JobCloseFeedBack feedBack) throws HiveException { try { if ((conf != null) && isNativeTable) { @@ -755,7 +755,7 @@ } catch (IOException e) { throw new HiveException(e); } - super.jobClose(hconf, success, feedBack); + super.jobCloseOp(hconf, success, feedBack); } @Override Index: ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java (revision 1387086) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java (working copy) @@ -581,6 +581,13 @@ protected void closeOp(boolean abort) throws HiveException { } + private boolean jobCloseDone = false; + + // Operator specific logic goes here + public void jobCloseOp(Configuration conf, boolean success, JobCloseFeedBack feedBack) + throws HiveException { + } + /** * Unlike other operator interfaces which are called from map or reduce task, * jobClose is called from the jobclient side once the job has completed. @@ -592,12 +599,18 @@ */ public void jobClose(Configuration conf, boolean success, JobCloseFeedBack feedBack) throws HiveException { - if (childOperators == null) { + // JobClose has already been performed on this operator + if (jobCloseDone) { return; } - for (Operator op : childOperators) { - op.jobClose(conf, success, feedBack); + jobCloseOp(conf, success, feedBack); + jobCloseDone = true; + + if (childOperators != null) { + for (Operator op : childOperators) { + op.jobClose(conf, success, feedBack); + } } }