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) {
