PostgreSQL Source Code git master
reorderbuffer.h
Go to the documentation of this file.
1/*
2 * reorderbuffer.h
3 * PostgreSQL logical replay/reorder buffer management.
4 *
5 * Copyright (c) 2012-2025, PostgreSQL Global Development Group
6 *
7 * src/include/replication/reorderbuffer.h
8 */
9#ifndef REORDERBUFFER_H
10#define REORDERBUFFER_H
11
12#include "access/htup_details.h"
13#include "lib/ilist.h"
14#include "lib/pairingheap.h"
15#include "storage/sinval.h"
16#include "utils/hsearch.h"
17#include "utils/relcache.h"
18#include "utils/snapshot.h"
19#include "utils/timestamp.h"
20
21/* paths for logical decoding data (relative to installation's $PGDATA) */
22#define PG_LOGICAL_DIR "pg_logical"
23#define PG_LOGICAL_MAPPINGS_DIR PG_LOGICAL_DIR "/mappings"
24#define PG_LOGICAL_SNAPSHOTS_DIR PG_LOGICAL_DIR "/snapshots"
25
26/* GUC variables */
29
30/* possible values for debug_logical_replication_streaming */
31typedef enum
32{
36
37/*
38 * Types of the change passed to a 'change' callback.
39 *
40 * For efficiency and simplicity reasons we want to keep Snapshots, CommandIds
41 * and ComboCids in the same list with the user visible INSERT/UPDATE/DELETE
42 * changes. Users of the decoding facilities will never see changes with
43 * *_INTERNAL_* actions.
44 *
45 * The INTERNAL_SPEC_INSERT and INTERNAL_SPEC_CONFIRM, and INTERNAL_SPEC_ABORT
46 * changes concern "speculative insertions", their confirmation, and abort
47 * respectively. They're used by INSERT .. ON CONFLICT .. UPDATE. Users of
48 * logical decoding don't have to care about these.
49 */
51{
65
66/* forward declaration */
67struct ReorderBufferTXN;
68
69/*
70 * a single 'change', can be an insert (with one tuple), an update (old, new),
71 * or a delete (old).
72 *
73 * The same struct is also used internally for other purposes but that should
74 * never be visible outside reorderbuffer.c.
75 */
76typedef struct ReorderBufferChange
77{
79
80 /* The type of change. */
82
83 /* Transaction this change belongs to. */
85
87
88 /*
89 * Context data for the change. Which part of the union is valid depends
90 * on action.
91 */
92 union
93 {
94 /* Old, new tuples when action == *_INSERT|UPDATE|DELETE */
95 struct
96 {
97 /* relation that has been changed */
99
100 /* no previously reassembled toast chunks are necessary anymore */
102
103 /* valid for DELETE || UPDATE */
105 /* valid for INSERT || UPDATE */
107 } tp;
108
109 /*
110 * Truncate data for REORDER_BUFFER_CHANGE_TRUNCATE representing one
111 * set of relations to be truncated.
112 */
113 struct
114 {
120
121 /* Message with arbitrary data. */
122 struct
123 {
124 char *prefix;
126 char *message;
128
129 /* New snapshot, set when action == *_INTERNAL_SNAPSHOT */
131
132 /*
133 * New command id for existing snapshot in a catalog changing tx. Set
134 * when action == *_INTERNAL_COMMAND_ID.
135 */
137
138 /*
139 * New cid mapping for catalog changing transaction, set when action
140 * == *_INTERNAL_TUPLECID.
141 */
142 struct
143 {
150
151 /* Invalidation. */
152 struct
153 {
154 uint32 ninvalidations; /* Number of messages */
155 SharedInvalidationMessage *invalidations; /* invalidation message */
158
159 /*
160 * While in use this is how a change is linked into a transactions,
161 * otherwise it's the preallocated list.
162 */
165
166/* ReorderBufferTXN txn_flags */
167#define RBTXN_HAS_CATALOG_CHANGES 0x0001
168#define RBTXN_IS_SUBXACT 0x0002
169#define RBTXN_IS_SERIALIZED 0x0004
170#define RBTXN_IS_SERIALIZED_CLEAR 0x0008
171#define RBTXN_IS_STREAMED 0x0010
172#define RBTXN_HAS_PARTIAL_CHANGE 0x0020
173#define RBTXN_IS_PREPARED 0x0040
174#define RBTXN_SKIPPED_PREPARE 0x0080
175#define RBTXN_HAS_STREAMABLE_CHANGE 0x0100
176#define RBTXN_SENT_PREPARE 0x0200
177#define RBTXN_IS_COMMITTED 0x0400
178#define RBTXN_IS_ABORTED 0x0800
179
180#define RBTXN_PREPARE_STATUS_MASK (RBTXN_IS_PREPARED | RBTXN_SKIPPED_PREPARE | RBTXN_SENT_PREPARE)
181
182/* Does the transaction have catalog changes? */
183#define rbtxn_has_catalog_changes(txn) \
184( \
185 ((txn)->txn_flags & RBTXN_HAS_CATALOG_CHANGES) != 0 \
186)
187
188/* Is the transaction known as a subxact? */
189#define rbtxn_is_known_subxact(txn) \
190( \
191 ((txn)->txn_flags & RBTXN_IS_SUBXACT) != 0 \
192)
193
194/* Has this transaction been spilled to disk? */
195#define rbtxn_is_serialized(txn) \
196( \
197 ((txn)->txn_flags & RBTXN_IS_SERIALIZED) != 0 \
198)
199
200/* Has this transaction ever been spilled to disk? */
201#define rbtxn_is_serialized_clear(txn) \
202( \
203 ((txn)->txn_flags & RBTXN_IS_SERIALIZED_CLEAR) != 0 \
204)
205
206/* Does this transaction contain partial changes? */
207#define rbtxn_has_partial_change(txn) \
208( \
209 ((txn)->txn_flags & RBTXN_HAS_PARTIAL_CHANGE) != 0 \
210)
211
212/* Does this transaction contain streamable changes? */
213#define rbtxn_has_streamable_change(txn) \
214( \
215 ((txn)->txn_flags & RBTXN_HAS_STREAMABLE_CHANGE) != 0 \
216)
217
218/*
219 * Has this transaction been streamed to downstream?
220 *
221 * (It's not possible to deduce this from nentries and nentries_mem for
222 * various reasons. For example, all changes may be in subtransactions in
223 * which case we'd have nentries==0 for the toplevel one, which would say
224 * nothing about the streaming. So we maintain this flag, but only for the
225 * toplevel transaction.)
226 */
227#define rbtxn_is_streamed(txn) \
228( \
229 ((txn)->txn_flags & RBTXN_IS_STREAMED) != 0 \
230)
231
232/*
233 * Is this a prepared transaction?
234 *
235 * Being true means that this transaction should be prepared instead of
236 * committed. To check whether a prepare or a stream_prepare has already
237 * been sent for this transaction, we need to use rbtxn_sent_prepare().
238 */
239#define rbtxn_is_prepared(txn) \
240( \
241 ((txn)->txn_flags & RBTXN_IS_PREPARED) != 0 \
242)
243
244/* Has a prepare or stream_prepare already been sent? */
245#define rbtxn_sent_prepare(txn) \
246( \
247 ((txn)->txn_flags & RBTXN_SENT_PREPARE) != 0 \
248)
249
250/* Is this transaction committed? */
251#define rbtxn_is_committed(txn) \
252( \
253 ((txn)->txn_flags & RBTXN_IS_COMMITTED) != 0 \
254)
255
256/* Is this transaction aborted? */
257#define rbtxn_is_aborted(txn) \
258( \
259 ((txn)->txn_flags & RBTXN_IS_ABORTED) != 0 \
260)
261
262/* prepare for this transaction skipped? */
263#define rbtxn_skip_prepared(txn) \
264( \
265 ((txn)->txn_flags & RBTXN_SKIPPED_PREPARE) != 0 \
266)
267
268/* Is this a top-level transaction? */
269#define rbtxn_is_toptxn(txn) \
270( \
271 (txn)->toptxn == NULL \
272)
273
274/* Is this a subtransaction? */
275#define rbtxn_is_subtxn(txn) \
276( \
277 (txn)->toptxn != NULL \
278)
279
280/* Get the top-level transaction of this (sub)transaction. */
281#define rbtxn_get_toptxn(txn) \
282( \
283 rbtxn_is_subtxn(txn) ? (txn)->toptxn : (txn) \
284)
285
286typedef struct ReorderBufferTXN
287{
288 /* See above */
290
291 /* The transaction's transaction id, can be a toplevel or sub xid. */
293
294 /* Xid of top-level transaction, if known */
296
297 /*
298 * Global transaction id required for identification of prepared
299 * transactions.
300 */
301 char *gid;
302
303 /*
304 * LSN of the first data carrying, WAL record with knowledge about this
305 * xid. This is allowed to *not* be first record adorned with this xid, if
306 * the previous records aren't relevant for logical decoding.
307 */
309
310 /* ----
311 * LSN of the record that lead to this xact to be prepared or committed or
312 * aborted. This can be a
313 * * plain commit record
314 * * plain commit record, of a parent transaction
315 * * prepared transaction
316 * * prepared transaction commit
317 * * plain abort record
318 * * prepared transaction abort
319 *
320 * This can also become set to earlier values than transaction end when
321 * a transaction is spilled to disk; specifically it's set to the LSN of
322 * the latest change written to disk so far.
323 * ----
324 */
326
327 /*
328 * LSN pointing to the end of the commit record + 1.
329 */
331
332 /* Toplevel transaction for this subxact (NULL for top-level). */
334
335 /*
336 * LSN of the last lsn at which snapshot information reside, so we can
337 * restart decoding from there and fully recover this transaction from
338 * WAL.
339 */
341
342 /* origin of the change that caused this transaction */
345
346 /*
347 * Commit or Prepare time, only known when we read the actual commit or
348 * prepare record.
349 */
350 union
351 {
356
357 /*
358 * The base snapshot is used to decode all changes until either this
359 * transaction modifies the catalog, or another catalog-modifying
360 * transaction commits.
361 */
364 dlist_node base_snapshot_node; /* link in txns_by_base_snapshot_lsn */
365
366 /*
367 * Snapshot/CID from the previous streaming run. Only valid for already
368 * streamed transactions (NULL/InvalidCommandId otherwise).
369 */
372
373 /*
374 * How many ReorderBufferChange's do we have in this txn.
375 *
376 * Changes in subtransactions are *not* included but tracked separately.
377 */
379
380 /*
381 * How many of the above entries are stored in memory in contrast to being
382 * spilled to disk.
383 */
385
386 /*
387 * List of ReorderBufferChange structs, including new Snapshots, new
388 * CommandIds and command invalidation messages.
389 */
391
392 /*
393 * List of (relation, ctid) => (cmin, cmax) mappings for catalog tuples.
394 * Those are always assigned to the toplevel transaction. (Keep track of
395 * #entries to create a hash of the right size)
396 */
399
400 /*
401 * On-demand built hash for looking up the above values.
402 */
404
405 /*
406 * Hash containing (potentially partial) toast entries. NULL if no toast
407 * tuples have been found for the current change.
408 */
410
411 /*
412 * non-hierarchical list of subtransactions that are *not* aborted. Only
413 * used in toplevel transactions.
414 */
417
418 /*
419 * Stored cache invalidations. This is not a linked list because we get
420 * all the invalidations at once.
421 */
424
425 /* ---
426 * Position in one of two lists:
427 * * list of subtransactions if we are *known* to be subxact
428 * * list of toplevel xacts (can be an as-yet unknown subxact)
429 * ---
430 */
432
433 /*
434 * A node in the list of catalog modifying transactions
435 */
437
438 /*
439 * A node in txn_heap
440 */
442
443 /*
444 * Size of this transaction (changes currently in memory, in bytes).
445 */
447
448 /* Size of top-transaction including sub-transactions. */
450
451 /*
452 * Private data pointer of the output plugin.
453 */
456
457/* so we can define the callbacks used inside struct ReorderBuffer itself */
459
460/* change callback signature */
462 ReorderBufferTXN *txn,
463 Relation relation,
464 ReorderBufferChange *change);
465
466/* truncate callback signature */
468 ReorderBufferTXN *txn,
469 int nrelations,
470 Relation relations[],
471 ReorderBufferChange *change);
472
473/* begin callback signature */
475 ReorderBufferTXN *txn);
476
477/* commit callback signature */
479 ReorderBufferTXN *txn,
480 XLogRecPtr commit_lsn);
481
482/* message callback signature */
484 ReorderBufferTXN *txn,
485 XLogRecPtr message_lsn,
486 bool transactional,
487 const char *prefix, Size sz,
488 const char *message);
489
490/* begin prepare callback signature */
492 ReorderBufferTXN *txn);
493
494/* prepare callback signature */
496 ReorderBufferTXN *txn,
497 XLogRecPtr prepare_lsn);
498
499/* commit prepared callback signature */
501 ReorderBufferTXN *txn,
502 XLogRecPtr commit_lsn);
503
504/* rollback prepared callback signature */
506 ReorderBufferTXN *txn,
507 XLogRecPtr prepare_end_lsn,
508 TimestampTz prepare_time);
509
510/* start streaming transaction callback signature */
512 ReorderBufferTXN *txn,
513 XLogRecPtr first_lsn);
514
515/* stop streaming transaction callback signature */
517 ReorderBufferTXN *txn,
518 XLogRecPtr last_lsn);
519
520/* discard streamed transaction callback signature */
522 ReorderBufferTXN *txn,
523 XLogRecPtr abort_lsn);
524
525/* prepare streamed transaction callback signature */
527 ReorderBufferTXN *txn,
528 XLogRecPtr prepare_lsn);
529
530/* commit streamed transaction callback signature */
532 ReorderBufferTXN *txn,
533 XLogRecPtr commit_lsn);
534
535/* stream change callback signature */
537 ReorderBufferTXN *txn,
538 Relation relation,
539 ReorderBufferChange *change);
540
541/* stream message callback signature */
543 ReorderBufferTXN *txn,
544 XLogRecPtr message_lsn,
545 bool transactional,
546 const char *prefix, Size sz,
547 const char *message);
548
549/* stream truncate callback signature */
551 ReorderBufferTXN *txn,
552 int nrelations,
553 Relation relations[],
554 ReorderBufferChange *change);
555
556/* update progress txn callback signature */
558 ReorderBufferTXN *txn,
559 XLogRecPtr lsn);
560
562{
563 /*
564 * xid => ReorderBufferTXN lookup table
565 */
567
568 /*
569 * Transactions that could be a toplevel xact, ordered by LSN of the first
570 * record bearing that xid.
571 */
573
574 /*
575 * Transactions and subtransactions that have a base snapshot, ordered by
576 * LSN of the record which caused us to first obtain the base snapshot.
577 * This is not the same as toplevel_by_lsn, because we only set the base
578 * snapshot on the first logical-decoding-relevant record (eg. heap
579 * writes), whereas the initial LSN could be set by other operations.
580 */
582
583 /*
584 * Transactions and subtransactions that have modified system catalogs.
585 */
587
588 /*
589 * one-entry sized cache for by_txn. Very frequently the same txn gets
590 * looked up over and over again.
591 */
594
595 /*
596 * Callbacks to be called when a transactions commits.
597 */
603
604 /*
605 * Callbacks to be called when streaming a transaction at prepare time.
606 */
611
612 /*
613 * Callbacks to be called when streaming a transaction.
614 */
623
624 /*
625 * Callback to be called when updating progress during sending data of a
626 * transaction (and its subtransactions) to the output plugin.
627 */
629
630 /*
631 * Pointer that will be passed untouched to the callbacks.
632 */
634
635 /*
636 * Saved output plugin option
637 */
639
640 /*
641 * Private memory context.
642 */
644
645 /*
646 * Memory contexts for specific types objects
647 */
651
653
654 /* buffer for disk<->memory conversions */
655 char *outbuf;
657
658 /* memory accounting */
660
661 /* Max-heap for sizes of all top-level and sub transactions */
663
664 /*
665 * Statistics about transactions spilled to disk.
666 *
667 * A single transaction may be spilled repeatedly, which is why we keep
668 * two different counters. For spilling, the transaction counter includes
669 * both toplevel transactions and subtransactions.
670 */
671 int64 spillTxns; /* number of transactions spilled to disk */
672 int64 spillCount; /* spill-to-disk invocation counter */
673 int64 spillBytes; /* amount of data spilled to disk */
674
675 /* Statistics about transactions streamed to the decoding output plugin */
676 int64 streamTxns; /* number of transactions streamed */
677 int64 streamCount; /* streaming invocation counter */
678 int64 streamBytes; /* amount of data decoded */
679
680 /*
681 * Statistics about all the transactions sent to the decoding output
682 * plugin
683 */
684 int64 totalTxns; /* total number of transactions sent */
685 int64 totalBytes; /* total amount of data decoded */
686};
687
688
690extern void ReorderBufferFree(ReorderBuffer *rb);
691
693extern void ReorderBufferFreeTupleBuf(HeapTuple tuple);
694
697 ReorderBufferChange *change, bool upd_mem);
698
699extern Oid *ReorderBufferAllocRelids(ReorderBuffer *rb, int nrelids);
700extern void ReorderBufferFreeRelids(ReorderBuffer *rb, Oid *relids);
701
703 XLogRecPtr lsn, ReorderBufferChange *change,
704 bool toast_insert);
706 Snapshot snap, XLogRecPtr lsn,
707 bool transactional, const char *prefix,
708 Size message_size, const char *message);
710 XLogRecPtr commit_lsn, XLogRecPtr end_lsn,
711 TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn);
713 XLogRecPtr commit_lsn, XLogRecPtr end_lsn,
714 XLogRecPtr two_phase_at,
715 TimestampTz commit_time,
716 RepOriginId origin_id, XLogRecPtr origin_lsn,
717 char *gid, bool is_commit);
719 TransactionId subxid, XLogRecPtr lsn);
721 TransactionId subxid, XLogRecPtr commit_lsn,
722 XLogRecPtr end_lsn);
724 TimestampTz abort_time);
725extern void ReorderBufferAbortOld(ReorderBuffer *rb, TransactionId oldestRunningXid);
728
730 XLogRecPtr lsn, Snapshot snap);
732 XLogRecPtr lsn, Snapshot snap);
734 XLogRecPtr lsn, CommandId cid);
736 XLogRecPtr lsn, RelFileLocator locator,
737 ItemPointerData tid,
738 CommandId cmin, CommandId cmax, CommandId combocid);
740 Size nmsgs, SharedInvalidationMessage *msgs);
741extern void ReorderBufferImmediateInvalidation(ReorderBuffer *rb, uint32 ninvalidations,
742 SharedInvalidationMessage *invalidations);
744
748
750 XLogRecPtr prepare_lsn, XLogRecPtr end_lsn,
751 TimestampTz prepare_time,
752 RepOriginId origin_id, XLogRecPtr origin_lsn);
754extern void ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, char *gid);
758
760
761extern void StartupReorderBuffer(void);
762
763#endif
#define PGDLLIMPORT
Definition: c.h:1291
int64_t int64
Definition: c.h:499
uint32 bits32
Definition: c.h:511
uint64_t uint64
Definition: c.h:503
uint32_t uint32
Definition: c.h:502
uint32 CommandId
Definition: c.h:637
uint32 TransactionId
Definition: c.h:623
size_t Size
Definition: c.h:576
int64 TimestampTz
Definition: timestamp.h:39
unsigned int Oid
Definition: postgres_ext.h:32
void ReorderBufferFreeRelids(ReorderBuffer *rb, Oid *relids)
void ReorderBufferFreeChange(ReorderBuffer *rb, ReorderBufferChange *change, bool upd_mem)
void(* ReorderBufferCommitCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr commit_lsn)
PGDLLIMPORT int logical_decoding_work_mem
void ReorderBufferXidSetCatalogChanges(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn)
void ReorderBufferAddNewCommandId(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, CommandId cid)
PGDLLIMPORT int debug_logical_replication_streaming
void ReorderBufferAddNewTupleCids(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, RelFileLocator locator, ItemPointerData tid, CommandId cmin, CommandId cmax, CommandId combocid)
void ReorderBufferSetBaseSnapshot(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Snapshot snap)
void ReorderBufferAbort(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, TimestampTz abort_time)
void(* ReorderBufferUpdateProgressTxnCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr lsn)
void(* ReorderBufferStreamCommitCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr commit_lsn)
bool ReorderBufferXidHasCatalogChanges(ReorderBuffer *rb, TransactionId xid)
void ReorderBufferInvalidate(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn)
TransactionId ReorderBufferGetOldestXmin(ReorderBuffer *rb)
void(* ReorderBufferStreamStartCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr first_lsn)
void(* ReorderBufferApplyChangeCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, Relation relation, ReorderBufferChange *change)
struct ReorderBufferTXN ReorderBufferTXN
void(* ReorderBufferStreamPrepareCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr prepare_lsn)
void(* ReorderBufferStreamChangeCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, Relation relation, ReorderBufferChange *change)
void ReorderBufferFreeTupleBuf(HeapTuple tuple)
DebugLogicalRepStreamingMode
Definition: reorderbuffer.h:32
@ DEBUG_LOGICAL_REP_STREAMING_IMMEDIATE
Definition: reorderbuffer.h:34
@ DEBUG_LOGICAL_REP_STREAMING_BUFFERED
Definition: reorderbuffer.h:33
void ReorderBufferQueueChange(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, ReorderBufferChange *change, bool toast_insert)
void ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, char *gid)
void(* ReorderBufferCommitPreparedCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr commit_lsn)
void(* ReorderBufferStreamMessageCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size sz, const char *message)
void ReorderBufferForget(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn)
void ReorderBufferCommitChild(ReorderBuffer *rb, TransactionId xid, TransactionId subxid, XLogRecPtr commit_lsn, XLogRecPtr end_lsn)
TransactionId * ReorderBufferGetCatalogChangesXacts(ReorderBuffer *rb)
void(* ReorderBufferBeginCB)(ReorderBuffer *rb, ReorderBufferTXN *txn)
ReorderBuffer * ReorderBufferAllocate(void)
void ReorderBufferSkipPrepare(ReorderBuffer *rb, TransactionId xid)
void(* ReorderBufferMessageCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size sz, const char *message)
struct ReorderBufferChange ReorderBufferChange
void ReorderBufferAddInvalidations(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Size nmsgs, SharedInvalidationMessage *msgs)
void(* ReorderBufferApplyTruncateCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change)
void(* ReorderBufferBeginPrepareCB)(ReorderBuffer *rb, ReorderBufferTXN *txn)
void ReorderBufferQueueMessage(ReorderBuffer *rb, TransactionId xid, Snapshot snap, XLogRecPtr lsn, bool transactional, const char *prefix, Size message_size, const char *message)
bool ReorderBufferXidHasBaseSnapshot(ReorderBuffer *rb, TransactionId xid)
void ReorderBufferAddSnapshot(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Snapshot snap)
HeapTuple ReorderBufferAllocTupleBuf(ReorderBuffer *rb, Size tuple_len)
void ReorderBufferFinishPrepared(ReorderBuffer *rb, TransactionId xid, XLogRecPtr commit_lsn, XLogRecPtr end_lsn, XLogRecPtr two_phase_at, TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn, char *gid, bool is_commit)
void(* ReorderBufferStreamAbortCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr abort_lsn)
ReorderBufferChange * ReorderBufferAllocChange(ReorderBuffer *rb)
void ReorderBufferCommit(ReorderBuffer *rb, TransactionId xid, XLogRecPtr commit_lsn, XLogRecPtr end_lsn, TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn)
void ReorderBufferSetRestartPoint(ReorderBuffer *rb, XLogRecPtr ptr)
void(* ReorderBufferPrepareCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr prepare_lsn)
bool ReorderBufferRememberPrepareInfo(ReorderBuffer *rb, TransactionId xid, XLogRecPtr prepare_lsn, XLogRecPtr end_lsn, TimestampTz prepare_time, RepOriginId origin_id, XLogRecPtr origin_lsn)
void ReorderBufferImmediateInvalidation(ReorderBuffer *rb, uint32 ninvalidations, SharedInvalidationMessage *invalidations)
Oid * ReorderBufferAllocRelids(ReorderBuffer *rb, int nrelids)
void(* ReorderBufferRollbackPreparedCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr prepare_end_lsn, TimestampTz prepare_time)
void ReorderBufferProcessXid(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn)
void ReorderBufferAssignChild(ReorderBuffer *rb, TransactionId xid, TransactionId subxid, XLogRecPtr lsn)
void ReorderBufferFree(ReorderBuffer *rb)
ReorderBufferChangeType
Definition: reorderbuffer.h:51
@ REORDER_BUFFER_CHANGE_INVALIDATION
Definition: reorderbuffer.h:56
@ REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM
Definition: reorderbuffer.h:61
@ REORDER_BUFFER_CHANGE_INSERT
Definition: reorderbuffer.h:52
@ REORDER_BUFFER_CHANGE_MESSAGE
Definition: reorderbuffer.h:55
@ REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT
Definition: reorderbuffer.h:62
@ REORDER_BUFFER_CHANGE_INTERNAL_COMMAND_ID
Definition: reorderbuffer.h:58
@ REORDER_BUFFER_CHANGE_INTERNAL_TUPLECID
Definition: reorderbuffer.h:59
@ REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT
Definition: reorderbuffer.h:60
@ REORDER_BUFFER_CHANGE_TRUNCATE
Definition: reorderbuffer.h:63
@ REORDER_BUFFER_CHANGE_DELETE
Definition: reorderbuffer.h:54
@ REORDER_BUFFER_CHANGE_INTERNAL_SNAPSHOT
Definition: reorderbuffer.h:57
@ REORDER_BUFFER_CHANGE_UPDATE
Definition: reorderbuffer.h:53
void(* ReorderBufferStreamStopCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr last_lsn)
void StartupReorderBuffer(void)
void ReorderBufferAbortOld(ReorderBuffer *rb, TransactionId oldestRunningXid)
ReorderBufferTXN * ReorderBufferGetOldestTXN(ReorderBuffer *rb)
void(* ReorderBufferStreamTruncateCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change)
Definition: dynahash.c:220
struct ReorderBufferChange::@110::@112 truncate
ReorderBufferChangeType action
Definition: reorderbuffer.h:81
RelFileLocator rlocator
Definition: reorderbuffer.h:98
union ReorderBufferChange::@110 data
ItemPointerData tid
struct ReorderBufferTXN * txn
Definition: reorderbuffer.h:84
RelFileLocator locator
RepOriginId origin_id
Definition: reorderbuffer.h:86
struct ReorderBufferChange::@110::@111 tp
struct ReorderBufferChange::@110::@114 tuplecid
struct ReorderBufferChange::@110::@113 msg
struct ReorderBufferChange::@110::@115 inval
SharedInvalidationMessage * invalidations
CommandId command_id
XLogRecPtr restart_decoding_lsn
pairingheap_node txn_node
TimestampTz commit_time
XLogRecPtr base_snapshot_lsn
Snapshot snapshot_now
TransactionId toplevel_xid
dlist_node catchange_node
Snapshot base_snapshot
SharedInvalidationMessage * invalidations
RepOriginId origin_id
struct ReorderBufferTXN * toptxn
dlist_head tuplecids
XLogRecPtr first_lsn
TimestampTz abort_time
XLogRecPtr final_lsn
void * output_plugin_private
XLogRecPtr end_lsn
XLogRecPtr origin_lsn
TimestampTz prepare_time
TransactionId xid
dlist_node base_snapshot_node
dlist_head changes
dlist_head subtxns
union ReorderBufferTXN::@116 xact_time
ReorderBufferStreamMessageCB stream_message
ReorderBufferStreamChangeCB stream_change
ReorderBufferBeginCB begin_prepare
ReorderBufferStreamTruncateCB stream_truncate
ReorderBufferCommitPreparedCB commit_prepared
ReorderBufferUpdateProgressTxnCB update_progress_txn
ReorderBufferMessageCB message
dlist_head txns_by_base_snapshot_lsn
MemoryContext context
dclist_head catchange_txns
ReorderBufferRollbackPreparedCB rollback_prepared
ReorderBufferPrepareCB prepare
ReorderBufferStreamStopCB stream_stop
ReorderBufferApplyChangeCB apply_change
MemoryContext change_context
ReorderBufferTXN * by_txn_last_txn
TransactionId by_txn_last_xid
ReorderBufferStreamPrepareCB stream_prepare
ReorderBufferStreamAbortCB stream_abort
MemoryContext tup_context
ReorderBufferCommitCB commit
ReorderBufferStreamStartCB stream_start
ReorderBufferStreamCommitCB stream_commit
ReorderBufferApplyTruncateCB apply_truncate
dlist_head toplevel_by_lsn
pairingheap * txn_heap
ReorderBufferBeginCB begin
MemoryContext txn_context
XLogRecPtr current_restart_decoding_lsn
void * private_data
uint16 RepOriginId
Definition: xlogdefs.h:65
uint64 XLogRecPtr
Definition: xlogdefs.h:21