/* ----------
* pgstat_report_stat() -
*
- * Called from tcop/postgres.c to send the so far collected per-table
- * and function usage statistics to the collector. Note that this is
- * called only when not within a transaction, so it is fair to use
+ * Must be called by processes that performs DML: tcop/postgres.c, logical
+ * receiver processes, SPI worker, etc. to send the so far collected
+ * per-table and function usage statistics to the collector. Note that this
+ * is called only when not within a transaction, so it is fair to use
* transaction stop time as an approximation of current time.
* ----------
*/
static void pg_attribute_noreturn()
finish_sync_worker(void)
{
- /* Commit any outstanding transaction. */
+ /*
+ * Commit any outstanding transaction. This is the usual case, unless
+ * there was nothing to do for the table.
+ */
if (IsTransactionState())
+ {
CommitTransactionCommand();
+ pgstat_report_stat(false);
+ }
/* And flush all writes. */
XLogFlush(GetXLogWriteRecPtr());
/* Process any tables that are being synchronized in parallel. */
process_syncing_tables(commit_data.end_lsn);
+ pgstat_report_stat(false);
pgstat_report_activity(STATE_IDLE, NULL);
}