IMPALA-5857: avoid invalid free of hedged read metrics

The libHdfs API documents that the output parameter is unchanged on
error, therefore we do not need to attempt to free it on error.

Testing:
The bug only reproduced under stress. I don't know how to trigger this
error path yet.

Change-Id: I93baf3b672429c0283d7f031ff302aca31e05be4
Reviewed-on: http://gerrit.cloudera.org:8080/7885
Reviewed-by: Sailesh Mukil <[email protected]>
Reviewed-by: Matthew Jacobs <[email protected]>
Tested-by: Impala Public Jenkins


Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/d5670d6b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/d5670d6b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/d5670d6b

Branch: refs/heads/master
Commit: d5670d6b912c65c9156d165603d65336d96a30a1
Parents: 35f5c7b
Author: Tim Armstrong <[email protected]>
Authored: Tue Aug 29 15:29:50 2017 -0700
Committer: Impala Public Jenkins <[email protected]>
Committed: Wed Aug 30 03:36:41 2017 +0000

----------------------------------------------------------------------
 be/src/runtime/disk-io-mgr-scan-range.cc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/d5670d6b/be/src/runtime/disk-io-mgr-scan-range.cc
----------------------------------------------------------------------
diff --git a/be/src/runtime/disk-io-mgr-scan-range.cc 
b/be/src/runtime/disk-io-mgr-scan-range.cc
index f9f96d0..df74fcc 100644
--- a/be/src/runtime/disk-io-mgr-scan-range.cc
+++ b/be/src/runtime/disk-io-mgr-scan-range.cc
@@ -350,14 +350,14 @@ void DiskIoMgr::ScanRange::Close() {
       // Update Hedged Read Metrics.
       // We call it only if the --use_hdfs_pread flag is set, to avoid having 
the
       // libhdfs client malloc and free a hdfsHedgedReadMetrics object 
unnecessarily
-      // otherwise.
+      // otherwise. 'hedged_metrics' is only set upon success.
       struct hdfsHedgedReadMetrics* hedged_metrics;
       int success = hdfsGetHedgedReadMetrics(fs_, &hedged_metrics);
       if (success == 0) {
         
ImpaladMetrics::HEDGED_READ_OPS->set_value(hedged_metrics->hedgedReadOps);
         
ImpaladMetrics::HEDGED_READ_OPS_WIN->set_value(hedged_metrics->hedgedReadOpsWin);
+        hdfsFreeHedgedReadMetrics(hedged_metrics);
       }
-      hdfsFreeHedgedReadMetrics(hedged_metrics);
     }
 
     if (num_remote_bytes_ > 0) {

Reply via email to