Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id ED27D200BCE for ; Thu, 17 Nov 2016 17:09:20 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id EC8E5160B24; Thu, 17 Nov 2016 16:09:20 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 4555A160B1C for ; Thu, 17 Nov 2016 17:09:20 +0100 (CET) Received: (qmail 43182 invoked by uid 500); 17 Nov 2016 16:09:19 -0000 Mailing-List: contact commits-help@impala.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@impala.incubator.apache.org Delivered-To: mailing list commits@impala.incubator.apache.org Received: (qmail 43120 invoked by uid 99); 17 Nov 2016 16:09:19 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 17 Nov 2016 16:09:19 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id DD25C180538 for ; Thu, 17 Nov 2016 16:09:18 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -6.218 X-Spam-Level: X-Spam-Status: No, score=-6.218 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-2.999, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id ZZAewwbwI4iG for ; Thu, 17 Nov 2016 16:09:17 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id ED8BF60E18 for ; Thu, 17 Nov 2016 16:09:13 +0000 (UTC) Received: (qmail 42288 invoked by uid 99); 17 Nov 2016 16:09:12 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 17 Nov 2016 16:09:12 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 9F4AAF17A7; Thu, 17 Nov 2016 16:09:12 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: tarmstrong@apache.org To: commits@impala.incubator.apache.org Date: Thu, 17 Nov 2016 16:09:28 -0000 Message-Id: In-Reply-To: <36bd3629b3874cbfb622f1fa4b2f77c0@git.apache.org> References: <36bd3629b3874cbfb622f1fa4b2f77c0@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [17/50] [abbrv] incubator-impala git commit: IMPALA-4437: fix crash in disk-io-mgr archived-at: Thu, 17 Nov 2016 16:09:21 -0000 IMPALA-4437: fix crash in disk-io-mgr This fixes another issue where the 'buffer_' field was not set to NULL on an error, triggering a DCHECK. Testing: Added a unit test that triggers the bug on the two different codepaths that I fixed. Change-Id: Ib76cf5ba8d368b2b37bdc1d2133b8ddcb39f9e00 Reviewed-on: http://gerrit.cloudera.org:8080/4979 Reviewed-by: Dan Hecht Tested-by: Internal 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/ef689edf Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/ef689edf Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/ef689edf Branch: refs/heads/hadoop-next Commit: ef689edf36dd5715f17438e07a16fd4e38af5fb9 Parents: 51b1310 Author: Tim Armstrong Authored: Mon Nov 7 14:38:07 2016 -0800 Committer: Internal Jenkins Committed: Tue Nov 8 08:29:58 2016 +0000 ---------------------------------------------------------------------- be/src/runtime/disk-io-mgr-test.cc | 38 +++++++++++++++++++++++++++++++++ be/src/runtime/disk-io-mgr.cc | 2 ++ 2 files changed, 40 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/ef689edf/be/src/runtime/disk-io-mgr-test.cc ---------------------------------------------------------------------- diff --git a/be/src/runtime/disk-io-mgr-test.cc b/be/src/runtime/disk-io-mgr-test.cc index ef7e12f..9f8d6d7 100644 --- a/be/src/runtime/disk-io-mgr-test.cc +++ b/be/src/runtime/disk-io-mgr-test.cc @@ -1090,6 +1090,44 @@ TEST_F(DiskIoMgrTest, ReadIntoClientBuffer) { io_mgr.reset(); EXPECT_EQ(mem_tracker.consumption(), 0); } + +// Test reading into a client-allocated buffer where the read fails. +TEST_F(DiskIoMgrTest, ReadIntoClientBufferError) { + MemTracker mem_tracker(LARGE_MEM_LIMIT); + const char* tmp_file = "/file/that/does/not/exist"; + const int SCAN_LEN = 128; + + scoped_ptr io_mgr(new DiskIoMgr(1, 1, SCAN_LEN, SCAN_LEN)); + + ASSERT_OK(io_mgr->Init(&mem_tracker)); + // Reader doesn't need to provide mem tracker if it's providing buffers. + MemTracker* reader_mem_tracker = NULL; + DiskIoRequestContext* reader; + vector client_buffer(SCAN_LEN); + for (int i = 0; i < 1000; ++i) { + ASSERT_OK(io_mgr->RegisterContext(&reader, reader_mem_tracker)); + DiskIoMgr::ScanRange* range = AllocateRange(1); + range->Reset(NULL, tmp_file, SCAN_LEN, 0, 0, true, + DiskIoMgr::BufferOpts::ReadInto(&client_buffer[0], SCAN_LEN)); + ASSERT_OK(io_mgr->AddScanRange(reader, range, true)); + + /// Also test the cancellation path. Run multiple iterations since it is racy whether + /// the read fails before the cancellation. + if (i >= 1) io_mgr->CancelContext(reader); + + DiskIoMgr::BufferDescriptor* io_buffer; + ASSERT_FALSE(range->GetNext(&io_buffer).ok()); + + // DiskIoMgr should not have allocated memory. + EXPECT_EQ(mem_tracker.consumption(), 0); + + io_mgr->UnregisterContext(reader); + } + + pool_.reset(); + io_mgr.reset(); + EXPECT_EQ(mem_tracker.consumption(), 0); +} } int main(int argc, char** argv) { http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/ef689edf/be/src/runtime/disk-io-mgr.cc ---------------------------------------------------------------------- diff --git a/be/src/runtime/disk-io-mgr.cc b/be/src/runtime/disk-io-mgr.cc index 265b49a..87ac33a 100644 --- a/be/src/runtime/disk-io-mgr.cc +++ b/be/src/runtime/disk-io-mgr.cc @@ -981,6 +981,7 @@ void DiskIoMgr::HandleReadFinished(DiskQueue* disk_queue, DiskIoRequestContext* state.DecrementRequestThreadAndCheckDone(reader); DCHECK(reader->Validate()) << endl << reader->DebugString(); if (!buffer->is_client_buffer()) FreeBufferMemory(buffer); + buffer->buffer_ = NULL; buffer->scan_range_->Cancel(reader->status_); // Enqueue the buffer to use the scan range's buffer cleanup path. buffer->scan_range_->EnqueueBuffer(buffer); @@ -997,6 +998,7 @@ void DiskIoMgr::HandleReadFinished(DiskQueue* disk_queue, DiskIoRequestContext* if (!buffer->status_.ok()) { // Error case if (!buffer->is_client_buffer()) FreeBufferMemory(buffer); + buffer->buffer_ = NULL; buffer->eosr_ = true; --state.num_remaining_ranges(); buffer->scan_range_->Cancel(buffer->status_);