Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1iXXAy-0001mE-ML for pgsql-hackers@arkaria.postgresql.org; Wed, 20 Nov 2019 21:06:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1iXXAw-0005nV-Bn for pgsql-hackers@arkaria.postgresql.org; Wed, 20 Nov 2019 21:06:10 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1iXXAv-0005nN-Rk for pgsql-hackers@lists.postgresql.org; Wed, 20 Nov 2019 21:06:10 +0000 Received: from mail-yw1-xc35.google.com ([2607:f8b0:4864:20::c35]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1iXXAr-0007dt-3z for pgsql-hackers@postgresql.org; Wed, 20 Nov 2019 21:06:08 +0000 Received: by mail-yw1-xc35.google.com with SMTP id j190so506019ywf.8 for ; Wed, 20 Nov 2019 13:06:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=telsasoft-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :user-agent; bh=p4rMTVkFqZiG8uMzMTZlkcJu2hPoDxu+gv2aAgEBxEE=; b=VNpPur2Mx7WFTfJ6YsEmpdzaRizflxuv/1Ny9CiS9TgLR/O5Qu0bJEX2HQsDcRFEu3 URj+ZjGDdo+B7/rGac/4W3oYSjWqb2DPxdypxfCIfOV4h+wUwjurOrXo5GEmKaY1D33g Yx9s4/gfVKC8V4rQ7f089j8J9aA8FuWRWYyC/vCLFdKxk+6tW3LWKfQi4DRZVFpxjLc0 Mc7Xbk6K0lZZ3Y3fVMzIDY4ixLviV+KvwYergMbU9LCK0BQ2UmYFKRIicRHOnSA3Q0sM aZas5FCzQFuXsetcYf5FwZPEGIugtKkmNs5VxYhSuTvpWcAxkbtr3Dec+oIm4R2WDio2 dNcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=p4rMTVkFqZiG8uMzMTZlkcJu2hPoDxu+gv2aAgEBxEE=; b=QZkAyPu8A/6mtHtH61OBAIRqoDIeEtFKwFhUlZmUt5/tWqmxTCnNBdvY3kC6ecqxzx IIqJaSBLX87TPUUs/6Rj4R6lpZI8URP7WatemIlh1oGMZ/JCU2yFW4EWeoTjqTJPLs45 LlY4UC2ZG3xO9Q+qKTptxpLB5IT+c8O2qN4U4SX02mRSIFuMG5zOYK9bfNxSV40zXIHO Jc+rYfeEx4FWAqf2NxhZMSFyOECy2KnlSspvjPwNVimosIl4zYiJM2Rzm8kiCdhWTcty ITJLasbPYjwdsnYJL8WPyMfmYZfNYcsKjESIHkwrEhM9S8bopfLDvs/+4TPoBNL3Wl85 TnWQ== X-Gm-Message-State: APjAAAVLW8H/Q+1xI+SHkbSTQN3bLfskt1UT4tGTaw1xtFJqSX0/hhqX koDddei8le3PnTFMhUSEkgRMsc0Z26M= X-Google-Smtp-Source: APXvYqwnPR2iOGIjG8mmKKCshQ4NBQfeQrPR1E9qts1jlv0lF2fWnhUTpihe7wY8CIlY7gNk5Jw0Eg== X-Received: by 2002:a81:892:: with SMTP id 140mr3266465ywi.348.1574283962654; Wed, 20 Nov 2019 13:06:02 -0800 (PST) Received: from pryzbyj (charmander.telsasoft.com. [50.244.222.1]) by smtp.gmail.com with ESMTPSA id u123sm256917ywd.105.2019.11.20.13.06.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Nov 2019 13:06:01 -0800 (PST) Received: by pryzbyj (Postfix, from userid 1000) id 7E223800AE5; Wed, 20 Nov 2019 15:06:00 -0600 (CST) Date: Wed, 20 Nov 2019 15:06:00 -0600 From: Justin Pryzby To: pgsql-hackers@postgresql.org Cc: Andres Freund Subject: error context for vacuum to include block number Message-ID: <20191120210600.GC30362@telsasoft.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="uQr8t48UFsdbeI+V" Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --uQr8t48UFsdbeI+V Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Aug 07, 2019 at 04:51:54PM -0700, Andres Freund wrote: https://www.postgresql.org/message-id/20190807235154.erbmr4o4bo6vgnjv%40alap3.anarazel.de | Ugh :( | | We really need to add a error context to vacuumlazy that shows which | block is being processed. I eeked out a minimal patch. I renamed "StringInfoData buf", since it wasn't nice to mask it by "Buffer buf". postgres=# SET statement_timeout=99;vacuum t; SET 2019-11-20 14:52:49.521 CST [6319] ERROR: canceling statement due to statement timeout 2019-11-20 14:52:49.521 CST [6319] CONTEXT: block 596 2019-11-20 14:52:49.521 CST [6319] STATEMENT: vacuum t; Justin --uQr8t48UFsdbeI+V Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0001-vacuum-errcontext-to-show-block-being-processed.patch" From 2aac5cdc16c222a053c02818ea2b3a6a5adfb89a Mon Sep 17 00:00:00 2001 From: Justin Pryzby Date: Wed, 20 Nov 2019 14:53:20 -0600 Subject: [PATCH v1] vacuum errcontext to show block being processed As requested here. https://www.postgresql.org/message-id/20190807235154.erbmr4o4bo6vgnjv%40alap3.anarazel.de --- src/backend/access/heap/vacuumlazy.c | 43 +++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index a3c4a1d..6e0938b 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -175,6 +175,7 @@ static bool lazy_tid_reaped(ItemPointer itemptr, void *state); static int vac_cmp_itemptr(const void *left, const void *right); static bool heap_page_is_all_visible(Relation rel, Buffer buf, TransactionId *visibility_cutoff_xid, bool *all_frozen); +static void vacuum_error_callback(void *arg); /* @@ -517,13 +518,14 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, BlockNumber next_unskippable_block; bool skipping_blocks; xl_heap_freeze_tuple *frozen; - StringInfoData buf; + StringInfoData sbuf; const int initprog_index[] = { PROGRESS_VACUUM_PHASE, PROGRESS_VACUUM_TOTAL_HEAP_BLKS, PROGRESS_VACUUM_MAX_DEAD_TUPLES }; int64 initprog_val[3]; + ErrorContextCallback errcallback; pg_rusage_init(&ru0); @@ -635,6 +637,12 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, else skipping_blocks = false; + /* Setup error traceback support for ereport() */ + errcallback.callback = vacuum_error_callback; + errcallback.arg = (void *) &blkno; + errcallback.previous = error_context_stack; + error_context_stack = &errcallback; + for (blkno = 0; blkno < nblocks; blkno++) { Buffer buf; @@ -1388,6 +1396,9 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, RecordPageWithFreeSpace(onerel, blkno, freespace); } + /* Pop the error context stack */ + error_context_stack = errcallback.previous; + /* report that everything is scanned and vacuumed */ pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno); @@ -1481,33 +1492,33 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, * This is pretty messy, but we split it up so that we can skip emitting * individual parts of the message when not applicable. */ - initStringInfo(&buf); - appendStringInfo(&buf, + initStringInfo(&sbuf); + appendStringInfo(&sbuf, _("%.0f dead row versions cannot be removed yet, oldest xmin: %u\n"), nkeep, OldestXmin); - appendStringInfo(&buf, _("There were %.0f unused item identifiers.\n"), + appendStringInfo(&sbuf, _("There were %.0f unused item identifiers.\n"), nunused); - appendStringInfo(&buf, ngettext("Skipped %u page due to buffer pins, ", + appendStringInfo(&sbuf, ngettext("Skipped %u page due to buffer pins, ", "Skipped %u pages due to buffer pins, ", vacrelstats->pinskipped_pages), vacrelstats->pinskipped_pages); - appendStringInfo(&buf, ngettext("%u frozen page.\n", + appendStringInfo(&sbuf, ngettext("%u frozen page.\n", "%u frozen pages.\n", vacrelstats->frozenskipped_pages), vacrelstats->frozenskipped_pages); - appendStringInfo(&buf, ngettext("%u page is entirely empty.\n", + appendStringInfo(&sbuf, ngettext("%u page is entirely empty.\n", "%u pages are entirely empty.\n", empty_pages), empty_pages); - appendStringInfo(&buf, _("%s."), pg_rusage_show(&ru0)); + appendStringInfo(&sbuf, _("%s."), pg_rusage_show(&ru0)); ereport(elevel, (errmsg("\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages", RelationGetRelationName(onerel), tups_vacuumed, num_tuples, vacrelstats->scanned_pages, nblocks), - errdetail_internal("%s", buf.data))); - pfree(buf.data); + errdetail_internal("%s", sbuf.data))); + pfree(sbuf.data); } @@ -2354,3 +2365,15 @@ heap_page_is_all_visible(Relation rel, Buffer buf, return all_visible; } + +/* + * Error context callback for errors occurring during vacuum. + */ +static void +vacuum_error_callback(void *arg) +{ + // BufferDesc *bufHdr = (BufferDesc *) arg; + Buffer *buf = (int *) arg; + + errcontext("block %u", *buf); +} -- 2.7.4 --uQr8t48UFsdbeI+V--