]> granicus.if.org Git - postgresql/commitdiff
Log when a BRIN autosummarization request fails
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 14 Mar 2018 14:53:56 +0000 (11:53 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 14 Mar 2018 14:59:40 +0000 (11:59 -0300)
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
src/backend/access/brin/brin.c
src/backend/postmaster/autovacuum.c
src/include/postmaster/autovacuum.h

index 23c0e05ed6c5add1eeacc9df193ad36c71df9e08..f02e061bc1cb4d99abe50f96e25beea8985768ac 100644 (file)
    representation because the existing values have changed.
   </para>
 
+  <para>
+   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:
+<screen>
+LOG:  request for BRIN range summarization for index "brin_wi_idx" page 128 was not recorded
+</screen>
+   When this happens, the range will be summarized normally during the next
+   regular vacuum of the table.
+  </para>
  </sect2>
 </sect1>
 
index 68b33716659f6be769f231276e45feac9619b769..0e5849efdccac7b2914ff379a68ab19eb521bf3e 100644 (file)
@@ -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);
                }
index 639bd716b1ecd3b3d8c467a280aa5fb1c7cdccde..c4bc09ea810911ac9386984e5f3faf59315ea873 100644 (file)
@@ -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;
 }
 
 /*
index 18cff540b737639f670f06df4204016e7ee35dcd..96752caed8d2af4aa5f85a754ca5adc2c36b6dad 100644 (file)
@@ -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 */