diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2018-03-14 11:53:56 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2018-03-14 12:00:53 -0300 |
commit | eadcb7a2377a7a68dee24f750b61a2ac0d7f9f40 (patch) | |
tree | 0efa0e871c5f09e1504665d07ec0d0e938a23f40 /src | |
parent | 8559b40c5e3fb068d0dfd81d4a5a9f7411f2cbba (diff) | |
download | postgresql-eadcb7a2377a7a68dee24f750b61a2ac0d7f9f40.tar.gz postgresql-eadcb7a2377a7a68dee24f750b61a2ac0d7f9f40.zip |
Log when a BRIN autosummarization request fails
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/brin/brin.c | 16 | ||||
-rw-r--r-- | src/backend/postmaster/autovacuum.c | 7 | ||||
-rw-r--r-- | src/include/postmaster/autovacuum.h | 2 |
3 files changed, 20 insertions, 5 deletions
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index 4f0ff79cb49..7f4600f18d6 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 ec2de9d9a39..70e08b552a1 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 3469915ae25..816f031c011 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 */ |