Remove ReorderBufferTupleBuf structure.
authorMasahiko Sawada <msawada@postgresql.org>
Mon, 29 Jan 2024 01:37:16 +0000 (10:37 +0900)
committerMasahiko Sawada <msawada@postgresql.org>
Mon, 29 Jan 2024 01:37:16 +0000 (10:37 +0900)
Since commit a4ccc1cef, the 'node' and 'alloc_tuple_size' fields of
the ReorderBufferTupleBuf structure are no longer used. This leaves
only the 'tuple' field in the structure. Since keeping a single-field
structure makes little sense, the ReorderBufferTupleBuf is removed
entirely. The code is refactored accordingly.

No back-patching since these are ABI changes in an exposed structure
and functions, and there would be some risk of breaking extensions.

Author: Aleksander Alekseev
Reviewed-by: Amit Kapila, Masahiko Sawada, Reid Thompson
Discussion: https://postgr.es/m/CAD21AoCvnuxiXXfRecp7g9+CeC35POQfhuQeJFr7_9u_Q5jc_Q@mail.gmail.com

contrib/test_decoding/test_decoding.c
src/backend/replication/logical/decode.c
src/backend/replication/logical/reorderbuffer.c
src/backend/replication/pgoutput/pgoutput.c
src/include/replication/reorderbuffer.h
src/tools/pgindent/typedefs.list

index 4f4f51a89c1f8b75c46b5fca9a4395528257845b..7c50d139698412366b21d1c893ca6105df241a79 100644 (file)
@@ -640,7 +640,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
                                appendStringInfoString(ctx->out, " (no-tuple-data)");
                        else
                                tuple_to_stringinfo(ctx->out, tupdesc,
-                                                                       &change->data.tp.newtuple->tuple,
+                                                                       change->data.tp.newtuple,
                                                                        false);
                        break;
                case REORDER_BUFFER_CHANGE_UPDATE:
@@ -649,7 +649,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
                        {
                                appendStringInfoString(ctx->out, " old-key:");
                                tuple_to_stringinfo(ctx->out, tupdesc,
-                                                                       &change->data.tp.oldtuple->tuple,
+                                                                       change->data.tp.oldtuple,
                                                                        true);
                                appendStringInfoString(ctx->out, " new-tuple:");
                        }
@@ -658,7 +658,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
                                appendStringInfoString(ctx->out, " (no-tuple-data)");
                        else
                                tuple_to_stringinfo(ctx->out, tupdesc,
-                                                                       &change->data.tp.newtuple->tuple,
+                                                                       change->data.tp.newtuple,
                                                                        false);
                        break;
                case REORDER_BUFFER_CHANGE_DELETE:
@@ -670,7 +670,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
                        /* In DELETE, only the replica identity is present; display that */
                        else
                                tuple_to_stringinfo(ctx->out, tupdesc,
-                                                                       &change->data.tp.oldtuple->tuple,
+                                                                       change->data.tp.oldtuple,
                                                                        true);
                        break;
                default:
index 6a0f22b209b1c0ed1e277755b0d86e3cd641a02c..7b21731287dd1eda036954f851a8c1b5e8ca559c 100644 (file)
@@ -62,7 +62,7 @@ static void DecodePrepare(LogicalDecodingContext *ctx, XLogRecordBuffer *buf,
 
 
 /* common function to decode tuples */
-static void DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple);
+static void DecodeXLogTuple(char *data, Size len, HeapTuple tuple);
 
 /* helper functions for decoding transactions */
 static inline bool FilterPrepare(LogicalDecodingContext *ctx,
@@ -1152,7 +1152,7 @@ DecodeMultiInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
                ReorderBufferChange *change;
                xl_multi_insert_tuple *xlhdr;
                int                     datalen;
-               ReorderBufferTupleBuf *tuple;
+               HeapTuple       tuple;
                HeapTupleHeader header;
 
                change = ReorderBufferGetChange(ctx->reorder);
@@ -1169,21 +1169,21 @@ DecodeMultiInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
                        ReorderBufferGetTupleBuf(ctx->reorder, datalen);
 
                tuple = change->data.tp.newtuple;
-               header = tuple->tuple.t_data;
+               header = tuple->t_data;
 
                /* not a disk based tuple */
-               ItemPointerSetInvalid(&tuple->tuple.t_self);
+               ItemPointerSetInvalid(&tuple->t_self);
 
                /*
                 * We can only figure this out after reassembling the transactions.
                 */
-               tuple->tuple.t_tableOid = InvalidOid;
+               tuple->t_tableOid = InvalidOid;
 
-               tuple->tuple.t_len = datalen + SizeofHeapTupleHeader;
+               tuple->t_len = datalen + SizeofHeapTupleHeader;
 
                memset(header, 0, SizeofHeapTupleHeader);
 
-               memcpy((char *) tuple->tuple.t_data + SizeofHeapTupleHeader,
+               memcpy((char *) tuple->t_data + SizeofHeapTupleHeader,
                           (char *) data,
                           datalen);
                header->t_infomask = xlhdr->t_infomask;
@@ -1253,7 +1253,7 @@ DecodeSpecConfirm(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
  * computed outside as they are record specific.
  */
 static void
-DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple)
+DecodeXLogTuple(char *data, Size len, HeapTuple tuple)
 {
        xl_heap_header xlhdr;
        int                     datalen = len - SizeOfHeapHeader;
@@ -1261,14 +1261,14 @@ DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple)
 
        Assert(datalen >= 0);
 
-       tuple->tuple.t_len = datalen + SizeofHeapTupleHeader;
-       header = tuple->tuple.t_data;
+       tuple->t_len = datalen + SizeofHeapTupleHeader;
+       header = tuple->t_data;
 
        /* not a disk based tuple */
-       ItemPointerSetInvalid(&tuple->tuple.t_self);
+       ItemPointerSetInvalid(&tuple->t_self);
 
        /* we can only figure this out after reassembling the transactions */
-       tuple->tuple.t_tableOid = InvalidOid;
+       tuple->t_tableOid = InvalidOid;
 
        /* data is not stored aligned, copy to aligned storage */
        memcpy((char *) &xlhdr,
@@ -1277,7 +1277,7 @@ DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple)
 
        memset(header, 0, SizeofHeapTupleHeader);
 
-       memcpy(((char *) tuple->tuple.t_data) + SizeofHeapTupleHeader,
+       memcpy(((char *) tuple->t_data) + SizeofHeapTupleHeader,
                   data + SizeOfHeapHeader,
                   datalen);
 
index d1334ffb5507da4673a3461635fb894fef1f5da9..bbf0966182f92cfb34c119c83c837b0e99655003 100644 (file)
@@ -498,13 +498,13 @@ ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change,
                case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
                        if (change->data.tp.newtuple)
                        {
-                               ReorderBufferReturnTupleBuf(rb, change->data.tp.newtuple);
+                               ReorderBufferReturnTupleBuf(change->data.tp.newtuple);
                                change->data.tp.newtuple = NULL;
                        }
 
                        if (change->data.tp.oldtuple)
                        {
-                               ReorderBufferReturnTupleBuf(rb, change->data.tp.oldtuple);
+                               ReorderBufferReturnTupleBuf(change->data.tp.oldtuple);
                                change->data.tp.oldtuple = NULL;
                        }
                        break;
@@ -547,32 +547,29 @@ ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change,
 }
 
 /*
- * Get a fresh ReorderBufferTupleBuf fitting at least a tuple of size
- * tuple_len (excluding header overhead).
+ * Get a fresh HeapTuple fitting a tuple of size tuple_len (excluding header
+ * overhead).
  */
-ReorderBufferTupleBuf *
+HeapTuple
 ReorderBufferGetTupleBuf(ReorderBuffer *rb, Size tuple_len)
 {
-       ReorderBufferTupleBuf *tuple;
+       HeapTuple       tuple;
        Size            alloc_len;
 
        alloc_len = tuple_len + SizeofHeapTupleHeader;
 
-       tuple = (ReorderBufferTupleBuf *)
-               MemoryContextAlloc(rb->tup_context,
-                                                  sizeof(ReorderBufferTupleBuf) +
-                                                  MAXIMUM_ALIGNOF + alloc_len);
-       tuple->alloc_tuple_size = alloc_len;
-       tuple->tuple.t_data = ReorderBufferTupleBufData(tuple);
+       tuple = (HeapTuple) MemoryContextAlloc(rb->tup_context,
+                                                                                  HEAPTUPLESIZE + alloc_len);
+       tuple->t_data = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE);
 
        return tuple;
 }
 
 /*
- * Free a ReorderBufferTupleBuf.
+ * Free a HeapTuple returned by ReorderBufferGetTupleBuf().
  */
 void
-ReorderBufferReturnTupleBuf(ReorderBuffer *rb, ReorderBufferTupleBuf *tuple)
+ReorderBufferReturnTupleBuf(HeapTuple tuple)
 {
        pfree(tuple);
 }
@@ -3759,8 +3756,8 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
                case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
                        {
                                char       *data;
-                               ReorderBufferTupleBuf *oldtup,
-                                                  *newtup;
+                               HeapTuple       oldtup,
+                                                       newtup;
                                Size            oldlen = 0;
                                Size            newlen = 0;
 
@@ -3770,14 +3767,14 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
                                if (oldtup)
                                {
                                        sz += sizeof(HeapTupleData);
-                                       oldlen = oldtup->tuple.t_len;
+                                       oldlen = oldtup->t_len;
                                        sz += oldlen;
                                }
 
                                if (newtup)
                                {
                                        sz += sizeof(HeapTupleData);
-                                       newlen = newtup->tuple.t_len;
+                                       newlen = newtup->t_len;
                                        sz += newlen;
                                }
 
@@ -3790,19 +3787,19 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
 
                                if (oldlen)
                                {
-                                       memcpy(data, &oldtup->tuple, sizeof(HeapTupleData));
+                                       memcpy(data, oldtup, sizeof(HeapTupleData));
                                        data += sizeof(HeapTupleData);
 
-                                       memcpy(data, oldtup->tuple.t_data, oldlen);
+                                       memcpy(data, oldtup->t_data, oldlen);
                                        data += oldlen;
                                }
 
                                if (newlen)
                                {
-                                       memcpy(data, &newtup->tuple, sizeof(HeapTupleData));
+                                       memcpy(data, newtup, sizeof(HeapTupleData));
                                        data += sizeof(HeapTupleData);
 
-                                       memcpy(data, newtup->tuple.t_data, newlen);
+                                       memcpy(data, newtup->t_data, newlen);
                                        data += newlen;
                                }
                                break;
@@ -4118,8 +4115,8 @@ ReorderBufferChangeSize(ReorderBufferChange *change)
                case REORDER_BUFFER_CHANGE_DELETE:
                case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
                        {
-                               ReorderBufferTupleBuf *oldtup,
-                                                  *newtup;
+                               HeapTuple       oldtup,
+                                                       newtup;
                                Size            oldlen = 0;
                                Size            newlen = 0;
 
@@ -4129,14 +4126,14 @@ ReorderBufferChangeSize(ReorderBufferChange *change)
                                if (oldtup)
                                {
                                        sz += sizeof(HeapTupleData);
-                                       oldlen = oldtup->tuple.t_len;
+                                       oldlen = oldtup->t_len;
                                        sz += oldlen;
                                }
 
                                if (newtup)
                                {
                                        sz += sizeof(HeapTupleData);
-                                       newlen = newtup->tuple.t_len;
+                                       newlen = newtup->t_len;
                                        sz += newlen;
                                }
 
@@ -4365,16 +4362,16 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
                                        ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
 
                                /* restore ->tuple */
-                               memcpy(&change->data.tp.oldtuple->tuple, data,
+                               memcpy(change->data.tp.oldtuple, data,
                                           sizeof(HeapTupleData));
                                data += sizeof(HeapTupleData);
 
                                /* reset t_data pointer into the new tuplebuf */
-                               change->data.tp.oldtuple->tuple.t_data =
-                                       ReorderBufferTupleBufData(change->data.tp.oldtuple);
+                               change->data.tp.oldtuple->t_data =
+                                       (HeapTupleHeader) ((char *) change->data.tp.oldtuple + HEAPTUPLESIZE);
 
                                /* restore tuple data itself */
-                               memcpy(change->data.tp.oldtuple->tuple.t_data, data, tuplelen);
+                               memcpy(change->data.tp.oldtuple->t_data, data, tuplelen);
                                data += tuplelen;
                        }
 
@@ -4390,16 +4387,16 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
                                        ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
 
                                /* restore ->tuple */
-                               memcpy(&change->data.tp.newtuple->tuple, data,
+                               memcpy(change->data.tp.newtuple, data,
                                           sizeof(HeapTupleData));
                                data += sizeof(HeapTupleData);
 
                                /* reset t_data pointer into the new tuplebuf */
-                               change->data.tp.newtuple->tuple.t_data =
-                                       ReorderBufferTupleBufData(change->data.tp.newtuple);
+                               change->data.tp.newtuple->t_data =
+                                       (HeapTupleHeader) ((char *) change->data.tp.newtuple + HEAPTUPLESIZE);
 
                                /* restore tuple data itself */
-                               memcpy(change->data.tp.newtuple->tuple.t_data, data, tuplelen);
+                               memcpy(change->data.tp.newtuple->t_data, data, tuplelen);
                                data += tuplelen;
                        }
 
@@ -4646,7 +4643,7 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn,
                                                          Relation relation, ReorderBufferChange *change)
 {
        ReorderBufferToastEnt *ent;
-       ReorderBufferTupleBuf *newtup;
+       HeapTuple       newtup;
        bool            found;
        int32           chunksize;
        bool            isnull;
@@ -4661,9 +4658,9 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn,
        Assert(IsToastRelation(relation));
 
        newtup = change->data.tp.newtuple;
-       chunk_id = DatumGetObjectId(fastgetattr(&newtup->tuple, 1, desc, &isnull));
+       chunk_id = DatumGetObjectId(fastgetattr(newtup, 1, desc, &isnull));
        Assert(!isnull);
-       chunk_seq = DatumGetInt32(fastgetattr(&newtup->tuple, 2, desc, &isnull));
+       chunk_seq = DatumGetInt32(fastgetattr(newtup, 2, desc, &isnull));
        Assert(!isnull);
 
        ent = (ReorderBufferToastEnt *)
@@ -4686,7 +4683,7 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn,
                elog(ERROR, "got sequence entry %d for toast chunk %u instead of seq %d",
                         chunk_seq, chunk_id, ent->last_chunk_seq + 1);
 
-       chunk = DatumGetPointer(fastgetattr(&newtup->tuple, 3, desc, &isnull));
+       chunk = DatumGetPointer(fastgetattr(newtup, 3, desc, &isnull));
        Assert(!isnull);
 
        /* calculate size so we can allocate the right size at once later */
@@ -4737,7 +4734,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn,
        Relation        toast_rel;
        TupleDesc       toast_desc;
        MemoryContext oldcontext;
-       ReorderBufferTupleBuf *newtup;
+       HeapTuple       newtup;
        Size            old_size;
 
        /* no toast tuples changed */
@@ -4777,7 +4774,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn,
 
        newtup = change->data.tp.newtuple;
 
-       heap_deform_tuple(&newtup->tuple, desc, attrs, isnull);
+       heap_deform_tuple(newtup, desc, attrs, isnull);
 
        for (natt = 0; natt < desc->natts; natt++)
        {
@@ -4842,12 +4839,12 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn,
                {
                        bool            cisnull;
                        ReorderBufferChange *cchange;
-                       ReorderBufferTupleBuf *ctup;
+                       HeapTuple       ctup;
                        Pointer         chunk;
 
                        cchange = dlist_container(ReorderBufferChange, node, it.cur);
                        ctup = cchange->data.tp.newtuple;
-                       chunk = DatumGetPointer(fastgetattr(&ctup->tuple, 3, toast_desc, &cisnull));
+                       chunk = DatumGetPointer(fastgetattr(ctup, 3, toast_desc, &cisnull));
 
                        Assert(!cisnull);
                        Assert(!VARATT_IS_EXTERNAL(chunk));
@@ -4882,11 +4879,11 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn,
         * the tuplebuf because attrs[] will point back into the current content.
         */
        tmphtup = heap_form_tuple(desc, attrs, isnull);
-       Assert(newtup->tuple.t_len <= MaxHeapTupleSize);
-       Assert(ReorderBufferTupleBufData(newtup) == newtup->tuple.t_data);
+       Assert(newtup->t_len <= MaxHeapTupleSize);
+       Assert(newtup->t_data == (HeapTupleHeader) ((char *) newtup + HEAPTUPLESIZE));
 
-       memcpy(newtup->tuple.t_data, tmphtup->t_data, tmphtup->t_len);
-       newtup->tuple.t_len = tmphtup->t_len;
+       memcpy(newtup->t_data, tmphtup->t_data, tmphtup->t_len);
+       newtup->t_len = tmphtup->t_len;
 
        /*
         * free resources we won't further need, more persistent stuff will be
index 425238187f64b523ee9bf477e78727c53358e5f8..998f92d67128d41ce61616631abd17060c237cd4 100644 (file)
@@ -1473,7 +1473,7 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
        if (change->data.tp.oldtuple)
        {
                old_slot = relentry->old_slot;
-               ExecStoreHeapTuple(&change->data.tp.oldtuple->tuple, old_slot, false);
+               ExecStoreHeapTuple(change->data.tp.oldtuple, old_slot, false);
 
                /* Convert tuple if needed. */
                if (relentry->attrmap)
@@ -1488,7 +1488,7 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
        if (change->data.tp.newtuple)
        {
                new_slot = relentry->new_slot;
-               ExecStoreHeapTuple(&change->data.tp.newtuple->tuple, new_slot, false);
+               ExecStoreHeapTuple(change->data.tp.newtuple, new_slot, false);
 
                /* Convert tuple if needed. */
                if (relentry->attrmap)
index 3e232c6c27fb61b8286d8bd93d5998bee2d7fabd..0b2c95f7aa09525eafab6264f7acd1ad7bbc40cf 100644 (file)
@@ -28,25 +28,6 @@ typedef enum
        DEBUG_LOGICAL_REP_STREAMING_IMMEDIATE,
 }                      DebugLogicalRepStreamingMode;
 
-/* an individual tuple, stored in one chunk of memory */
-typedef struct ReorderBufferTupleBuf
-{
-       /* position in preallocated list */
-       slist_node      node;
-
-       /* tuple header, the interesting bit for users of logical decoding */
-       HeapTupleData tuple;
-
-       /* pre-allocated size of tuple buffer, different from tuple size */
-       Size            alloc_tuple_size;
-
-       /* actual tuple data follows */
-} ReorderBufferTupleBuf;
-
-/* pointer to the data stored in a TupleBuf */
-#define ReorderBufferTupleBufData(p) \
-       ((HeapTupleHeader) MAXALIGN(((char *) p) + sizeof(ReorderBufferTupleBuf)))
-
 /*
  * Types of the change passed to a 'change' callback.
  *
@@ -114,9 +95,9 @@ typedef struct ReorderBufferChange
                        bool            clear_toast_afterwards;
 
                        /* valid for DELETE || UPDATE */
-                       ReorderBufferTupleBuf *oldtuple;
+                       HeapTuple       oldtuple;
                        /* valid for INSERT || UPDATE */
-                       ReorderBufferTupleBuf *newtuple;
+                       HeapTuple       newtuple;
                }                       tp;
 
                /*
@@ -678,10 +659,10 @@ struct ReorderBuffer
 extern ReorderBuffer *ReorderBufferAllocate(void);
 extern void ReorderBufferFree(ReorderBuffer *rb);
 
-extern ReorderBufferTupleBuf *ReorderBufferGetTupleBuf(ReorderBuffer *rb,
-                                                                                                          Size tuple_len);
-extern void ReorderBufferReturnTupleBuf(ReorderBuffer *rb,
-                                                                               ReorderBufferTupleBuf *tuple);
+extern HeapTuple ReorderBufferGetTupleBuf(ReorderBuffer *rb,
+                                                                                 Size tuple_len);
+extern void ReorderBufferReturnTupleBuf(HeapTuple tuple);
+
 extern ReorderBufferChange *ReorderBufferGetChange(ReorderBuffer *rb);
 extern void ReorderBufferReturnChange(ReorderBuffer *rb,
                                                                          ReorderBufferChange *change, bool upd_mem);
index 7e866e3c3d04d81cd25fafc851297761449e00e7..dc3b0ef87107c2129c98fcd5b1033548d2756b70 100644 (file)
@@ -2351,7 +2351,6 @@ ReorderBufferStreamTruncateCB
 ReorderBufferTXN
 ReorderBufferTXNByIdEnt
 ReorderBufferToastEnt
-ReorderBufferTupleBuf
 ReorderBufferTupleCidEnt
 ReorderBufferTupleCidKey
 ReorderBufferUpdateProgressTxnCB