index_stats_log.patch
application/octet-stream
Filename: index_stats_log.patch
Type: application/octet-stream
Part: 0
Message:
Re: a verbose option for autovacuum
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/access/heap/vacuumlazy.c | 48 | 10 |
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index d8f847b0e6..45c673e471 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -313,6 +313,7 @@ typedef struct LVRelStats
int num_index_scans;
TransactionId latestRemovedXid;
bool lock_waiter_detected;
+ IndexBulkDeleteResult **indstats; /* used for autovacuum logs */
/* Used for error callback */
char *indname;
@@ -523,9 +524,6 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
/* Do the vacuuming */
lazy_scan_heap(onerel, params, vacrelstats, Irel, nindexes, aggressive);
- /* Done with indexes */
- vac_close_indexes(nindexes, Irel, NoLock);
-
/*
* Compute whether we actually scanned the all unfrozen pages. If we did,
* we can adjust relfrozenxid and relminmxid.
@@ -606,13 +604,18 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
pgstat_progress_end_command();
/* and log the action if appropriate */
- if (IsAutoVacuumWorkerProcess() && params->log_min_duration >= 0)
+ if (IsAutoVacuumWorkerProcess())
{
- TimestampTz endtime = GetCurrentTimestamp();
+ TimestampTz endtime = 0;
+ int i;
+
+ if (params->log_min_duration >= 0)
+ endtime = GetCurrentTimestamp();
- if (params->log_min_duration == 0 ||
- TimestampDifferenceExceeds(starttime, endtime,
- params->log_min_duration))
+ if (endtime > 0 &&
+ (params->log_min_duration == 0 ||
+ TimestampDifferenceExceeds(starttime, endtime,
+ params->log_min_duration)))
{
StringInfoData buf;
char *msgfmt;
@@ -672,6 +675,21 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
(long long) VacuumPageHit,
(long long) VacuumPageMiss,
(long long) VacuumPageDirty);
+ for (i = 0; i < nindexes; i++)
+ {
+ IndexBulkDeleteResult *stats = vacrelstats->indstats[i];
+
+ if (!stats)
+ continue;
+
+ appendStringInfo(&buf,
+ _("index \"%s\": pages: %u remain, %u newly deleted, %u currently deleted, %u reusable\n"),
+ RelationGetRelationName(Irel[i]),
+ stats->num_pages,
+ stats->pages_newly_deleted,
+ stats->pages_deleted,
+ stats->pages_free);
+ }
appendStringInfo(&buf, _("avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n"),
read_rate, write_rate);
appendStringInfo(&buf, _("system usage: %s\n"), pg_rusage_show(&ru0));
@@ -685,7 +703,17 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
(errmsg_internal("%s", buf.data)));
pfree(buf.data);
}
+
+ /* Cleanup index statistics */
+ for (i = 0; i < nindexes; i++)
+ {
+ if (vacrelstats->indstats[i])
+ pfree(vacrelstats->indstats[i]);
+ }
}
+
+ /* Done with indexes */
+ vac_close_indexes(nindexes, Irel, NoLock);
}
/*
@@ -1737,7 +1765,11 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
end_parallel_vacuum(indstats, lps, nindexes);
/* Update index statistics */
- update_index_statistics(Irel, indstats, nindexes);
+ if (vacrelstats->useindex)
+ {
+ update_index_statistics(Irel, indstats, nindexes);
+ vacrelstats->indstats = indstats;
+ }
/* If no indexes, make log report that lazy_vacuum_heap would've made */
if (vacuumed_pages)
@@ -3206,7 +3238,13 @@ update_index_statistics(Relation *Irel, IndexBulkDeleteResult **stats,
InvalidTransactionId,
InvalidMultiXactId,
false);
- pfree(stats[i]);
+
+ /*
+ * Autovacuum worker keeps the index statistics until the end
+ * of lazy vacuum for autovacuum logs.
+ */
+ if (!IsAutoVacuumWorkerProcess())
+ pfree(stats[i]);
}
}