aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2021-05-03 07:22:08 +0530
committerAmit Kapila <akapila@postgresql.org>2021-05-03 07:22:08 +0530
commit205f466282be11ec97506f73341e47b72e0aee5d (patch)
tree64f98a2c182758483d700306f6b1ca86751cdf35 /src
parenteb086056fec44516efdd5db71244a079fed65c7f (diff)
downloadpostgresql-205f466282be11ec97506f73341e47b72e0aee5d.tar.gz
postgresql-205f466282be11ec97506f73341e47b72e0aee5d.zip
Fix the computation of slot stats for 'total_bytes'.
Previously, we were using the size of all the changes present in ReorderBuffer to compute total_bytes after decoding a transaction and that can lead to counting some of the transactions' changes more than once. Fix it by using the size of the changes decoded for a transaction to compute 'total_bytes'. Author: Sawada Masahiko Reviewed-by: Vignesh C, Amit Kapila Discussion: https://postgr.es/m/20210319185247.ldebgpdaxsowiflw@alap3.anarazel.de
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/logical/reorderbuffer.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index e1e17962e7d..ee680e5e1b4 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -1366,10 +1366,11 @@ ReorderBufferIterTXNNext(ReorderBuffer *rb, ReorderBufferIterTXNState *state)
dlist_push_tail(&state->old_change, &change->node);
/*
- * Update the total bytes processed before releasing the current set
- * of changes and restoring the new set of changes.
+ * Update the total bytes processed by the txn for which we are
+ * releasing the current set of changes and restoring the new set of
+ * changes.
*/
- rb->totalBytes += rb->size;
+ rb->totalBytes += entry->txn->size;
if (ReorderBufferRestoreChanges(rb, entry->txn, &entry->file,
&state->entries[off].segno))
{
@@ -2371,9 +2372,9 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn,
iterstate = NULL;
/*
- * Update total transaction count and total transaction bytes
- * processed. Ensure to not count the streamed transaction multiple
- * times.
+ * Update total transaction count and total bytes processed by the
+ * transaction and its subtransactions. Ensure to not count the
+ * streamed transaction multiple times.
*
* Note that the statistics computation has to be done after
* ReorderBufferIterTXNFinish as it releases the serialized change
@@ -2382,7 +2383,7 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn,
if (!rbtxn_is_streamed(txn))
rb->totalTxns++;
- rb->totalBytes += rb->size;
+ rb->totalBytes += txn->total_size;
/*
* Done with current changes, send the last message for this set of
@@ -3073,7 +3074,7 @@ ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb,
{
Size sz;
ReorderBufferTXN *txn;
- ReorderBufferTXN *toptxn = NULL;
+ ReorderBufferTXN *toptxn;
Assert(change->txn);
@@ -3087,14 +3088,14 @@ ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb,
txn = change->txn;
- /* If streaming supported, update the total size in top level as well. */
- if (ReorderBufferCanStream(rb))
- {
- if (txn->toptxn != NULL)
- toptxn = txn->toptxn;
- else
- toptxn = txn;
- }
+ /*
+ * Update the total size in top level as well. This is later used to
+ * compute the decoding stats.
+ */
+ if (txn->toptxn != NULL)
+ toptxn = txn->toptxn;
+ else
+ toptxn = txn;
sz = ReorderBufferChangeSize(change);
@@ -3104,8 +3105,7 @@ ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb,
rb->size += sz;
/* Update the total size in the top transaction. */
- if (toptxn)
- toptxn->total_size += sz;
+ toptxn->total_size += sz;
}
else
{
@@ -3114,8 +3114,7 @@ ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb,
rb->size -= sz;
/* Update the total size in the top transaction. */
- if (toptxn)
- toptxn->total_size -= sz;
+ toptxn->total_size -= sz;
}
Assert(txn->size <= rb->size);