mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Track statistics for spilling of changes from ReorderBuffer.
This adds the statistics about transactions spilled to disk from ReorderBuffer. Users can query the pg_stat_replication_slots view to check these stats and call pg_stat_reset_replication_slot to reset the stats of a particular slot. Users can pass NULL in pg_stat_reset_replication_slot to reset stats of all the slots. This commit extends the statistics collector to track this information about slots. Author: Sawada Masahiko and Amit Kapila Reviewed-by: Amit Kapila and Dilip Kumar Discussion: https://postgr.es/m/CA+fd4k5_pPAYRTDrO2PbtTOe0eHQpBvuqmCr8ic39uTNmR49Eg@mail.gmail.com
This commit is contained in:
@ -343,6 +343,10 @@ ReorderBufferAllocate(void)
|
||||
buffer->outbufsize = 0;
|
||||
buffer->size = 0;
|
||||
|
||||
buffer->spillTxns = 0;
|
||||
buffer->spillCount = 0;
|
||||
buffer->spillBytes = 0;
|
||||
|
||||
buffer->current_restart_decoding_lsn = InvalidXLogRecPtr;
|
||||
|
||||
dlist_init(&buffer->toplevel_by_lsn);
|
||||
@ -1579,6 +1583,13 @@ ReorderBufferTruncateTXN(ReorderBuffer *rb, ReorderBufferTXN *txn)
|
||||
{
|
||||
ReorderBufferRestoreCleanup(rb, txn);
|
||||
txn->txn_flags &= ~RBTXN_IS_SERIALIZED;
|
||||
|
||||
/*
|
||||
* We set this flag to indicate if the transaction is ever serialized.
|
||||
* We need this to accurately update the stats as otherwise the same
|
||||
* transaction can be counted as serialized multiple times.
|
||||
*/
|
||||
txn->txn_flags |= RBTXN_IS_SERIALIZED_CLEAR;
|
||||
}
|
||||
|
||||
/* also reset the number of entries in the transaction */
|
||||
@ -3112,6 +3123,7 @@ ReorderBufferSerializeTXN(ReorderBuffer *rb, ReorderBufferTXN *txn)
|
||||
int fd = -1;
|
||||
XLogSegNo curOpenSegNo = 0;
|
||||
Size spilled = 0;
|
||||
Size size = txn->size;
|
||||
|
||||
elog(DEBUG2, "spill %u changes in XID %u to disk",
|
||||
(uint32) txn->nentries_mem, txn->xid);
|
||||
@ -3170,6 +3182,16 @@ ReorderBufferSerializeTXN(ReorderBuffer *rb, ReorderBufferTXN *txn)
|
||||
spilled++;
|
||||
}
|
||||
|
||||
/* update the statistics iff we have spilled anything */
|
||||
if (spilled)
|
||||
{
|
||||
rb->spillCount += 1;
|
||||
rb->spillBytes += size;
|
||||
|
||||
/* don't consider already serialized transactions */
|
||||
rb->spillTxns += (rbtxn_is_serialized(txn) || rbtxn_is_serialized_clear(txn)) ? 0 : 1;
|
||||
}
|
||||
|
||||
Assert(spilled == txn->nentries_mem);
|
||||
Assert(dlist_is_empty(&txn->changes));
|
||||
txn->nentries_mem = 0;
|
||||
|
Reference in New Issue
Block a user