agora inbox for pgsql-hackers@postgresql.org
help / color / mirror / Atom feedFrom: Justin Pryzby <pryzbyj@telsasoft.com>
Subject: [PATCH v27 2/5] Save the values of the callback..
Date: Thu, 19 Mar 2020 15:21:22 -0500
..allowing them to be restored later, rather than setting phase=UNKNOWN.
---
src/backend/access/heap/vacuumlazy.c | 81 ++++++++++++++++++----------
1 file changed, 54 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 92bac9a24d..d923a40687 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -378,7 +378,8 @@ static LVSharedIndStats *get_indstats(LVShared *lvshared, int n);
static bool skip_parallel_vacuum_index(Relation indrel, LVShared *lvshared);
static void vacuum_error_callback(void *arg);
static void update_vacuum_error_cbarg(LVRelStats *errcbarg, int phase,
- BlockNumber blkno, Relation rel);
+ BlockNumber blkno, char *indname,
+ LVRelStats *olderrcbarg);
/*
@@ -745,6 +746,7 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
};
int64 initprog_val[3];
ErrorContextCallback errcallback;
+ LVRelStats olderrcbarg;
pg_rusage_init(&ru0);
@@ -892,7 +894,7 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
/* Setup error traceback support for ereport() */
update_vacuum_error_cbarg(vacrelstats, VACUUM_ERRCB_PHASE_SCAN_HEAP,
- InvalidBlockNumber, NULL);
+ InvalidBlockNumber, NULL, &olderrcbarg);
errcallback.callback = vacuum_error_callback;
errcallback.arg = vacrelstats;
errcallback.previous = error_context_stack;
@@ -924,7 +926,7 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
update_vacuum_error_cbarg(vacrelstats, VACUUM_ERRCB_PHASE_SCAN_HEAP,
- blkno, NULL);
+ blkno, NULL, &olderrcbarg);
if (blkno == next_unskippable_block)
{
@@ -1047,7 +1049,10 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
/* Set the error context while continuing heap scan */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_SCAN_HEAP, blkno, NULL);
+ olderrcbarg.phase,
+ olderrcbarg.blkno,
+ olderrcbarg.indname,
+ NULL);
}
/*
@@ -1532,8 +1537,10 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
/* Set the error context while continuing heap scan */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_SCAN_HEAP, blkno, NULL);
-
+ olderrcbarg.phase,
+ olderrcbarg.blkno,
+ olderrcbarg.indname,
+ NULL);
}
freespace = PageGetHeapFreeSpace(page);
@@ -1817,6 +1824,7 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats)
int npages;
PGRUsage ru0;
Buffer vmbuffer = InvalidBuffer;
+ LVRelStats olderrcbarg;
/* Report that we are now vacuuming the heap */
pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
@@ -1824,7 +1832,7 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats)
/* Setup error traceback support for ereport() */
update_vacuum_error_cbarg(vacrelstats, VACUUM_ERRCB_PHASE_VACUUM_HEAP,
- InvalidBlockNumber, NULL);
+ InvalidBlockNumber, NULL, &olderrcbarg);
pg_rusage_init(&ru0);
npages = 0;
@@ -1875,7 +1883,9 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats)
/* Clear the error traceback phase */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_UNKNOWN, InvalidBlockNumber,
+ olderrcbarg.phase,
+ olderrcbarg.blkno,
+ olderrcbarg.indname,
NULL);
}
@@ -1899,12 +1909,13 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
int uncnt = 0;
TransactionId visibility_cutoff_xid;
bool all_frozen;
+ LVRelStats olderrcbarg;
pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
/* Setup error traceback support for ereport() */
update_vacuum_error_cbarg(vacrelstats, VACUUM_ERRCB_PHASE_VACUUM_HEAP,
- blkno, NULL);
+ blkno, NULL, &olderrcbarg);
START_CRIT_SECTION();
@@ -1984,9 +1995,10 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
/* Clear the error traceback phase */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_UNKNOWN, InvalidBlockNumber,
+ olderrcbarg.phase,
+ olderrcbarg.blkno,
+ olderrcbarg.indname,
NULL);
-
return tupindex;
}
@@ -2384,6 +2396,7 @@ lazy_vacuum_index(Relation indrel, IndexBulkDeleteResult **stats,
IndexVacuumInfo ivinfo;
const char *msg;
PGRUsage ru0;
+ LVRelStats olderrcbarg;
pg_rusage_init(&ru0);
@@ -2397,8 +2410,9 @@ lazy_vacuum_index(Relation indrel, IndexBulkDeleteResult **stats,
/* Setup error traceback support for ereport() */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_VACUUM_INDEX, InvalidBlockNumber,
- indrel);
+ VACUUM_ERRCB_PHASE_VACUUM_INDEX,
+ InvalidBlockNumber,
+ RelationGetRelationName(indrel), &olderrcbarg);
/* Do bulk deletion */
*stats = index_bulk_delete(&ivinfo, *stats,
@@ -2417,7 +2431,9 @@ lazy_vacuum_index(Relation indrel, IndexBulkDeleteResult **stats,
/* Clear the error traceback phase */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_UNKNOWN, InvalidBlockNumber,
+ olderrcbarg.phase,
+ olderrcbarg.blkno,
+ olderrcbarg.indname,
NULL);
}
@@ -2435,6 +2451,7 @@ lazy_cleanup_index(Relation indrel,
IndexVacuumInfo ivinfo;
const char *msg;
PGRUsage ru0;
+ LVRelStats olderrcbarg;
pg_rusage_init(&ru0);
@@ -2449,7 +2466,9 @@ lazy_cleanup_index(Relation indrel,
/* Setup error traceback support for ereport() */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_INDEX_CLEANUP, InvalidBlockNumber, indrel);
+ VACUUM_ERRCB_PHASE_INDEX_CLEANUP,
+ InvalidBlockNumber,
+ RelationGetRelationName(indrel), &olderrcbarg);
*stats = index_vacuum_cleanup(&ivinfo, *stats);
@@ -2475,7 +2494,9 @@ lazy_cleanup_index(Relation indrel,
/* Clear the error traceback phase */
update_vacuum_error_cbarg(vacrelstats,
- VACUUM_ERRCB_PHASE_UNKNOWN, InvalidBlockNumber,
+ olderrcbarg.phase,
+ olderrcbarg.blkno,
+ olderrcbarg.indname,
NULL);
}
@@ -3522,22 +3543,28 @@ vacuum_error_callback(void *arg)
/* Update vacuum error callback for current phase, block and index */
static void
update_vacuum_error_cbarg(LVRelStats *errcbarg, int phase, BlockNumber blkno,
- Relation indrel)
+ char *indname, LVRelStats *olderrcbarg)
{
- errcbarg->blkno = blkno;
- errcbarg->phase = phase;
-
- /* Free index name from any previous phase */
- if (errcbarg->indname)
+ /* Save the values to allow resetting later */
+ if (olderrcbarg != NULL)
+ *olderrcbarg = *errcbarg;
+ else if (errcbarg->indname)
{
+ /*
+ * Free index name from any previous phase, but only if we're resetting
+ * the values to a previous state, and not if the values were saved to
+ * restore later. We need to avoid pfreeing a pointer that's
+ * referenced by olderrcbarg.
+ */
+ Assert(olderrcbarg == NULL);
pfree(errcbarg->indname);
errcbarg->indname = NULL;
}
+ errcbarg->blkno = blkno;
+ errcbarg->phase = phase;
+
/* For index phases, save the name of the current index for the callback */
- if (indrel)
- {
- Assert(indrel->rd_rel->relkind == RELKIND_INDEX);
- errcbarg->indname = pstrdup(RelationGetRelationName(indrel));
- }
+ if (indname)
+ errcbarg->indname = pstrdup(indname);
}
--
2.17.0
--gPQW1Pk7T/0rhUBV
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="v27-0003-Drop-reltuples.patch"
view thread (4+ messages)
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: pryzbyj@telsasoft.com
Subject: Re: [PATCH v27 2/5] Save the values of the callback..
In-Reply-To: <no-message-id-710087@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox