From 484a4a08abe316212d67d84bb8705b06e44f862d Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 14 Mar 2018 11:53:56 -0300 Subject: [PATCH] Log when a BRIN autosummarization request fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Autovacuum's 'workitem' request queue is of limited size, so requests can fail if they arrive more quickly than autovacuum can process them. Emit a log message when this happens, to provide better visibility of this. Backpatch to 10. While this represents an API change for AutoVacuumRequestWork, that function is not yet prepared to deal with external modules calling it, so there doesn't seem to be any risk (other than log spam, that is.) Author: Masahiko Sawada Reviewed-by: Fabrízio Mello, Ildar Musin, Álvaro Herrera Discussion: https://postgr.es/m/CAD21AoB1HrQhp6_4rTyHN5kWEJCEsG8YzsjZNt-ctoXSn5Uisw@mail.gmail.com --- doc/src/sgml/brin.sgml | 12 ++++++++++++ src/backend/access/brin/brin.c | 16 +++++++++++++--- src/backend/postmaster/autovacuum.c | 7 ++++++- src/include/postmaster/autovacuum.h | 2 +- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/brin.sgml b/doc/src/sgml/brin.sgml index 23c0e05ed6..f02e061bc1 100644 --- a/doc/src/sgml/brin.sgml +++ b/doc/src/sgml/brin.sgml @@ -86,6 +86,18 @@ representation because the existing values have changed. + + When autosummarization is enabled, each time a page range is filled a + request is sent to autovacuum for it to execute a targeted summarization + for that range, to be fulfilled at the end of the next worker run on the + same database. If the request queue is full, the request is not recorded + and a message is sent to the server log: + +LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was not recorded + + When this happens, the range will be summarized normally during the next + regular vacuum of the table. + diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index 68b3371665..0e5849efdc 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -187,9 +187,19 @@ brininsert(Relation idxRel, Datum *values, bool *nulls, brinGetTupleForHeapBlock(revmap, lastPageRange, &buf, &off, NULL, BUFFER_LOCK_SHARE, NULL); if (!lastPageTuple) - AutoVacuumRequestWork(AVW_BRINSummarizeRange, - RelationGetRelid(idxRel), - lastPageRange); + { + bool recorded; + + recorded = AutoVacuumRequestWork(AVW_BRINSummarizeRange, + RelationGetRelid(idxRel), + lastPageRange); + if (!recorded) + ereport(LOG, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("request for BRIN range summarization for index \"%s\" page %u was not recorded", + RelationGetRelationName(idxRel), + lastPageRange))); + } else LockBuffer(buf, BUFFER_LOCK_UNLOCK); } diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 639bd716b1..c4bc09ea81 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -3227,12 +3227,14 @@ AutoVacuumingActive(void) /* * Request one work item to the next autovacuum run processing our database. + * Return false if the request can't be recorded. */ -void +bool AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId, BlockNumber blkno) { int i; + bool result = false; LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE); @@ -3252,12 +3254,15 @@ AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId, workitem->avw_database = MyDatabaseId; workitem->avw_relation = relationId; workitem->avw_blockNumber = blkno; + result = true; /* done */ break; } LWLockRelease(AutovacuumLock); + + return result; } /* diff --git a/src/include/postmaster/autovacuum.h b/src/include/postmaster/autovacuum.h index 18cff540b7..96752caed8 100644 --- a/src/include/postmaster/autovacuum.h +++ b/src/include/postmaster/autovacuum.h @@ -71,7 +71,7 @@ extern void AutovacuumWorkerIAm(void); extern void AutovacuumLauncherIAm(void); #endif -extern void AutoVacuumRequestWork(AutoVacuumWorkItemType type, +extern bool AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId, BlockNumber blkno); /* shared memory stuff */