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-2023, 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 "storage/sinval.h"
15 #include "utils/hsearch.h"
16 #include "utils/relcache.h"
17 #include "utils/snapshot.h"
18 #include "utils/timestamp.h"
19 
22 
23 /* possible values for logical_decoding_mode */
24 typedef enum
25 {
29 
30 /* an individual tuple, stored in one chunk of memory */
31 typedef struct ReorderBufferTupleBuf
32 {
33  /* position in preallocated list */
35 
36  /* tuple header, the interesting bit for users of logical decoding */
38 
39  /* pre-allocated size of tuple buffer, different from tuple size */
41 
42  /* actual tuple data follows */
44 
45 /* pointer to the data stored in a TupleBuf */
46 #define ReorderBufferTupleBufData(p) \
47  ((HeapTupleHeader) MAXALIGN(((char *) p) + sizeof(ReorderBufferTupleBuf)))
48 
49 /*
50  * Types of the change passed to a 'change' callback.
51  *
52  * For efficiency and simplicity reasons we want to keep Snapshots, CommandIds
53  * and ComboCids in the same list with the user visible INSERT/UPDATE/DELETE
54  * changes. Users of the decoding facilities will never see changes with
55  * *_INTERNAL_* actions.
56  *
57  * The INTERNAL_SPEC_INSERT and INTERNAL_SPEC_CONFIRM, and INTERNAL_SPEC_ABORT
58  * changes concern "speculative insertions", their confirmation, and abort
59  * respectively. They're used by INSERT .. ON CONFLICT .. UPDATE. Users of
60  * logical decoding don't have to care about these.
61  */
63 {
77 
78 /* forward declaration */
79 struct ReorderBufferTXN;
80 
81 /*
82  * a single 'change', can be an insert (with one tuple), an update (old, new),
83  * or a delete (old).
84  *
85  * The same struct is also used internally for other purposes but that should
86  * never be visible outside reorderbuffer.c.
87  */
88 typedef struct ReorderBufferChange
89 {
91 
92  /* The type of change. */
94 
95  /* Transaction this change belongs to. */
97 
99 
100  /*
101  * Context data for the change. Which part of the union is valid depends
102  * on action.
103  */
104  union
105  {
106  /* Old, new tuples when action == *_INSERT|UPDATE|DELETE */
107  struct
108  {
109  /* relation that has been changed */
111 
112  /* no previously reassembled toast chunks are necessary anymore */
114 
115  /* valid for DELETE || UPDATE */
117  /* valid for INSERT || UPDATE */
119  } tp;
120 
121  /*
122  * Truncate data for REORDER_BUFFER_CHANGE_TRUNCATE representing one
123  * set of relations to be truncated.
124  */
125  struct
126  {
128  bool cascade;
132 
133  /* Message with arbitrary data. */
134  struct
135  {
136  char *prefix;
138  char *message;
139  } msg;
140 
141  /* New snapshot, set when action == *_INTERNAL_SNAPSHOT */
143 
144  /*
145  * New command id for existing snapshot in a catalog changing tx. Set
146  * when action == *_INTERNAL_COMMAND_ID.
147  */
149 
150  /*
151  * New cid mapping for catalog changing transaction, set when action
152  * == *_INTERNAL_TUPLECID.
153  */
154  struct
155  {
162 
163  /* Invalidation. */
164  struct
165  {
166  uint32 ninvalidations; /* Number of messages */
167  SharedInvalidationMessage *invalidations; /* invalidation message */
168  } inval;
169  } data;
170 
171  /*
172  * While in use this is how a change is linked into a transactions,
173  * otherwise it's the preallocated list.
174  */
177 
178 /* ReorderBufferTXN txn_flags */
179 #define RBTXN_HAS_CATALOG_CHANGES 0x0001
180 #define RBTXN_IS_SUBXACT 0x0002
181 #define RBTXN_IS_SERIALIZED 0x0004
182 #define RBTXN_IS_SERIALIZED_CLEAR 0x0008
183 #define RBTXN_IS_STREAMED 0x0010
184 #define RBTXN_HAS_PARTIAL_CHANGE 0x0020
185 #define RBTXN_PREPARE 0x0040
186 #define RBTXN_SKIPPED_PREPARE 0x0080
187 #define RBTXN_HAS_STREAMABLE_CHANGE 0x0100
188 
189 /* Does the transaction have catalog changes? */
190 #define rbtxn_has_catalog_changes(txn) \
191 ( \
192  ((txn)->txn_flags & RBTXN_HAS_CATALOG_CHANGES) != 0 \
193 )
194 
195 /* Is the transaction known as a subxact? */
196 #define rbtxn_is_known_subxact(txn) \
197 ( \
198  ((txn)->txn_flags & RBTXN_IS_SUBXACT) != 0 \
199 )
200 
201 /* Has this transaction been spilled to disk? */
202 #define rbtxn_is_serialized(txn) \
203 ( \
204  ((txn)->txn_flags & RBTXN_IS_SERIALIZED) != 0 \
205 )
206 
207 /* Has this transaction ever been spilled to disk? */
208 #define rbtxn_is_serialized_clear(txn) \
209 ( \
210  ((txn)->txn_flags & RBTXN_IS_SERIALIZED_CLEAR) != 0 \
211 )
212 
213 /* Has this transaction contains partial changes? */
214 #define rbtxn_has_partial_change(txn) \
215 ( \
216  ((txn)->txn_flags & RBTXN_HAS_PARTIAL_CHANGE) != 0 \
217 )
218 
219 /* Does this transaction contain streamable changes? */
220 #define rbtxn_has_streamable_change(txn) \
221 ( \
222  ((txn)->txn_flags & RBTXN_HAS_STREAMABLE_CHANGE) != 0 \
223 )
224 
225 /*
226  * Has this transaction been streamed to downstream?
227  *
228  * (It's not possible to deduce this from nentries and nentries_mem for
229  * various reasons. For example, all changes may be in subtransactions in
230  * which case we'd have nentries==0 for the toplevel one, which would say
231  * nothing about the streaming. So we maintain this flag, but only for the
232  * toplevel transaction.)
233  */
234 #define rbtxn_is_streamed(txn) \
235 ( \
236  ((txn)->txn_flags & RBTXN_IS_STREAMED) != 0 \
237 )
238 
239 /* Has this transaction been prepared? */
240 #define rbtxn_prepared(txn) \
241 ( \
242  ((txn)->txn_flags & RBTXN_PREPARE) != 0 \
243 )
244 
245 /* prepare for this transaction skipped? */
246 #define rbtxn_skip_prepared(txn) \
247 ( \
248  ((txn)->txn_flags & RBTXN_SKIPPED_PREPARE) != 0 \
249 )
250 
251 typedef struct ReorderBufferTXN
252 {
253  /* See above */
255 
256  /* The transaction's transaction id, can be a toplevel or sub xid. */
258 
259  /* Xid of top-level transaction, if known */
261 
262  /*
263  * Global transaction id required for identification of prepared
264  * transactions.
265  */
266  char *gid;
267 
268  /*
269  * LSN of the first data carrying, WAL record with knowledge about this
270  * xid. This is allowed to *not* be first record adorned with this xid, if
271  * the previous records aren't relevant for logical decoding.
272  */
274 
275  /* ----
276  * LSN of the record that lead to this xact to be prepared or committed or
277  * aborted. This can be a
278  * * plain commit record
279  * * plain commit record, of a parent transaction
280  * * prepared transaction
281  * * prepared transaction commit
282  * * plain abort record
283  * * prepared transaction abort
284  *
285  * This can also become set to earlier values than transaction end when
286  * a transaction is spilled to disk; specifically it's set to the LSN of
287  * the latest change written to disk so far.
288  * ----
289  */
291 
292  /*
293  * LSN pointing to the end of the commit record + 1.
294  */
296 
297  /* Toplevel transaction for this subxact (NULL for top-level). */
299 
300  /*
301  * LSN of the last lsn at which snapshot information reside, so we can
302  * restart decoding from there and fully recover this transaction from
303  * WAL.
304  */
306 
307  /* origin of the change that caused this transaction */
310 
311  /*
312  * Commit or Prepare time, only known when we read the actual commit or
313  * prepare record.
314  */
315  union
316  {
321 
322  /*
323  * The base snapshot is used to decode all changes until either this
324  * transaction modifies the catalog, or another catalog-modifying
325  * transaction commits.
326  */
329  dlist_node base_snapshot_node; /* link in txns_by_base_snapshot_lsn */
330 
331  /*
332  * Snapshot/CID from the previous streaming run. Only valid for already
333  * streamed transactions (NULL/InvalidCommandId otherwise).
334  */
337 
338  /*
339  * How many ReorderBufferChange's do we have in this txn.
340  *
341  * Changes in subtransactions are *not* included but tracked separately.
342  */
343  uint64 nentries;
344 
345  /*
346  * How many of the above entries are stored in memory in contrast to being
347  * spilled to disk.
348  */
349  uint64 nentries_mem;
350 
351  /*
352  * List of ReorderBufferChange structs, including new Snapshots, new
353  * CommandIds and command invalidation messages.
354  */
356 
357  /*
358  * List of (relation, ctid) => (cmin, cmax) mappings for catalog tuples.
359  * Those are always assigned to the toplevel transaction. (Keep track of
360  * #entries to create a hash of the right size)
361  */
363  uint64 ntuplecids;
364 
365  /*
366  * On-demand built hash for looking up the above values.
367  */
369 
370  /*
371  * Hash containing (potentially partial) toast entries. NULL if no toast
372  * tuples have been found for the current change.
373  */
375 
376  /*
377  * non-hierarchical list of subtransactions that are *not* aborted. Only
378  * used in toplevel transactions.
379  */
382 
383  /*
384  * Stored cache invalidations. This is not a linked list because we get
385  * all the invalidations at once.
386  */
389 
390  /* ---
391  * Position in one of three lists:
392  * * list of subtransactions if we are *known* to be subxact
393  * * list of toplevel xacts (can be an as-yet unknown subxact)
394  * * list of preallocated ReorderBufferTXNs (if unused)
395  * ---
396  */
398 
399  /*
400  * A node in the list of catalog modifying transactions
401  */
403 
404  /*
405  * Size of this transaction (changes currently in memory, in bytes).
406  */
408 
409  /* Size of top-transaction including sub-transactions. */
411 
412  /* If we have detected concurrent abort then ignore future changes. */
414 
415  /*
416  * Private data pointer of the output plugin.
417  */
420 
421 /* so we can define the callbacks used inside struct ReorderBuffer itself */
422 typedef struct ReorderBuffer ReorderBuffer;
423 
424 /* change callback signature */
426  ReorderBufferTXN *txn,
427  Relation relation,
428  ReorderBufferChange *change);
429 
430 /* truncate callback signature */
432  ReorderBufferTXN *txn,
433  int nrelations,
434  Relation relations[],
435  ReorderBufferChange *change);
436 
437 /* begin callback signature */
438 typedef void (*ReorderBufferBeginCB) (ReorderBuffer *rb,
439  ReorderBufferTXN *txn);
440 
441 /* commit callback signature */
443  ReorderBufferTXN *txn,
444  XLogRecPtr commit_lsn);
445 
446 /* message callback signature */
448  ReorderBufferTXN *txn,
449  XLogRecPtr message_lsn,
450  bool transactional,
451  const char *prefix, Size sz,
452  const char *message);
453 
454 /* begin prepare callback signature */
456  ReorderBufferTXN *txn);
457 
458 /* prepare callback signature */
460  ReorderBufferTXN *txn,
461  XLogRecPtr prepare_lsn);
462 
463 /* commit prepared callback signature */
465  ReorderBufferTXN *txn,
466  XLogRecPtr commit_lsn);
467 
468 /* rollback prepared callback signature */
470  ReorderBufferTXN *txn,
471  XLogRecPtr prepare_end_lsn,
472  TimestampTz prepare_time);
473 
474 /* start streaming transaction callback signature */
475 typedef void (*ReorderBufferStreamStartCB) (
476  ReorderBuffer *rb,
477  ReorderBufferTXN *txn,
478  XLogRecPtr first_lsn);
479 
480 /* stop streaming transaction callback signature */
481 typedef void (*ReorderBufferStreamStopCB) (
482  ReorderBuffer *rb,
483  ReorderBufferTXN *txn,
484  XLogRecPtr last_lsn);
485 
486 /* discard streamed transaction callback signature */
487 typedef void (*ReorderBufferStreamAbortCB) (
488  ReorderBuffer *rb,
489  ReorderBufferTXN *txn,
490  XLogRecPtr abort_lsn);
491 
492 /* prepare streamed transaction callback signature */
494  ReorderBuffer *rb,
495  ReorderBufferTXN *txn,
496  XLogRecPtr prepare_lsn);
497 
498 /* commit streamed transaction callback signature */
500  ReorderBuffer *rb,
501  ReorderBufferTXN *txn,
502  XLogRecPtr commit_lsn);
503 
504 /* stream change callback signature */
506  ReorderBuffer *rb,
507  ReorderBufferTXN *txn,
508  Relation relation,
509  ReorderBufferChange *change);
510 
511 /* stream message callback signature */
513  ReorderBuffer *rb,
514  ReorderBufferTXN *txn,
515  XLogRecPtr message_lsn,
516  bool transactional,
517  const char *prefix, Size sz,
518  const char *message);
519 
520 /* stream truncate callback signature */
522  ReorderBuffer *rb,
523  ReorderBufferTXN *txn,
524  int nrelations,
525  Relation relations[],
526  ReorderBufferChange *change);
527 
529 {
530  /*
531  * xid => ReorderBufferTXN lookup table
532  */
534 
535  /*
536  * Transactions that could be a toplevel xact, ordered by LSN of the first
537  * record bearing that xid.
538  */
540 
541  /*
542  * Transactions and subtransactions that have a base snapshot, ordered by
543  * LSN of the record which caused us to first obtain the base snapshot.
544  * This is not the same as toplevel_by_lsn, because we only set the base
545  * snapshot on the first logical-decoding-relevant record (eg. heap
546  * writes), whereas the initial LSN could be set by other operations.
547  */
549 
550  /*
551  * Transactions and subtransactions that have modified system catalogs.
552  */
554 
555  /*
556  * one-entry sized cache for by_txn. Very frequently the same txn gets
557  * looked up over and over again.
558  */
561 
562  /*
563  * Callbacks to be called when a transactions commits.
564  */
570 
571  /*
572  * Callbacks to be called when streaming a transaction at prepare time.
573  */
578 
579  /*
580  * Callbacks to be called when streaming a transaction.
581  */
590 
591  /*
592  * Pointer that will be passed untouched to the callbacks.
593  */
595 
596  /*
597  * Saved output plugin option
598  */
600 
601  /*
602  * Private memory context.
603  */
605 
606  /*
607  * Memory contexts for specific types objects
608  */
612 
614 
615  /* buffer for disk<->memory conversions */
616  char *outbuf;
618 
619  /* memory accounting */
621 
622  /*
623  * Statistics about transactions spilled to disk.
624  *
625  * A single transaction may be spilled repeatedly, which is why we keep
626  * two different counters. For spilling, the transaction counter includes
627  * both toplevel transactions and subtransactions.
628  */
629  int64 spillTxns; /* number of transactions spilled to disk */
630  int64 spillCount; /* spill-to-disk invocation counter */
631  int64 spillBytes; /* amount of data spilled to disk */
632 
633  /* Statistics about transactions streamed to the decoding output plugin */
634  int64 streamTxns; /* number of transactions streamed */
635  int64 streamCount; /* streaming invocation counter */
636  int64 streamBytes; /* amount of data decoded */
637 
638  /*
639  * Statistics about all the transactions sent to the decoding output
640  * plugin
641  */
642  int64 totalTxns; /* total number of transactions sent */
643  int64 totalBytes; /* total amount of data decoded */
644 };
645 
646 
648 extern void ReorderBufferFree(ReorderBuffer *rb);
649 
651  Size tuple_len);
653  ReorderBufferTupleBuf *tuple);
656  ReorderBufferChange *change, bool upd_mem);
657 
658 extern Oid *ReorderBufferGetRelids(ReorderBuffer *rb, int nrelids);
659 extern void ReorderBufferReturnRelids(ReorderBuffer *rb, Oid *relids);
660 
662  XLogRecPtr lsn, ReorderBufferChange *change,
663  bool toast_insert);
665  Snapshot snap, XLogRecPtr lsn,
666  bool transactional, const char *prefix,
667  Size message_size, const char *message);
668 extern void ReorderBufferCommit(ReorderBuffer *rb, TransactionId xid,
669  XLogRecPtr commit_lsn, XLogRecPtr end_lsn,
670  TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn);
672  XLogRecPtr commit_lsn, XLogRecPtr end_lsn,
673  XLogRecPtr two_phase_at,
674  TimestampTz commit_time,
675  RepOriginId origin_id, XLogRecPtr origin_lsn,
676  char *gid, bool is_commit);
678  TransactionId subxid, XLogRecPtr lsn);
680  TransactionId subxid, XLogRecPtr commit_lsn,
681  XLogRecPtr end_lsn);
682 extern void ReorderBufferAbort(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn,
683  TimestampTz abort_time);
684 extern void ReorderBufferAbortOld(ReorderBuffer *rb, TransactionId oldestRunningXid);
685 extern void ReorderBufferForget(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn);
687 
689  XLogRecPtr lsn, Snapshot snap);
691  XLogRecPtr lsn, Snapshot snap);
693  XLogRecPtr lsn, CommandId cid);
695  XLogRecPtr lsn, RelFileLocator locator,
696  ItemPointerData tid,
697  CommandId cmin, CommandId cmax, CommandId combocid);
699  Size nmsgs, SharedInvalidationMessage *msgs);
700 extern void ReorderBufferImmediateInvalidation(ReorderBuffer *rb, uint32 ninvalidations,
701  SharedInvalidationMessage *invalidations);
703 
707 
709  XLogRecPtr prepare_lsn, XLogRecPtr end_lsn,
710  TimestampTz prepare_time,
711  RepOriginId origin_id, XLogRecPtr origin_lsn);
713 extern void ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, char *gid);
717 
719 
720 extern void StartupReorderBuffer(void);
721 
722 #endif
unsigned int uint32
Definition: c.h:490
#define PGDLLIMPORT
Definition: c.h:1303
uint32 bits32
Definition: c.h:499
uint32 CommandId
Definition: c.h:650
uint32 TransactionId
Definition: c.h:636
size_t Size
Definition: c.h:589
int64 TimestampTz
Definition: timestamp.h:39
unsigned int Oid
Definition: postgres_ext.h:31
void ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change, bool upd_mem)
void(* ReorderBufferCommitCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr commit_lsn)
TransactionId * ReorderBufferGetCatalogChangesXacts(ReorderBuffer *rb)
void ReorderBufferReturnTupleBuf(ReorderBuffer *rb, ReorderBufferTupleBuf *tuple)
PGDLLIMPORT int logical_decoding_work_mem
void ReorderBufferXidSetCatalogChanges(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn)
void ReorderBufferAddNewCommandId(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, CommandId cid)
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(* ReorderBufferStreamCommitCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr commit_lsn)
bool ReorderBufferXidHasCatalogChanges(ReorderBuffer *rb, TransactionId xid)
PGDLLIMPORT int logical_decoding_mode
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 ReorderBufferQueueChange(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, ReorderBufferChange *change, bool toast_insert)
void ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, char *gid)
ReorderBuffer * ReorderBufferAllocate(void)
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)
struct ReorderBufferTupleBuf ReorderBufferTupleBuf
void(* ReorderBufferBeginCB)(ReorderBuffer *rb, ReorderBufferTXN *txn)
LogicalDecodingMode
Definition: reorderbuffer.h:25
@ LOGICAL_DECODING_MODE_BUFFERED
Definition: reorderbuffer.h:26
@ LOGICAL_DECODING_MODE_IMMEDIATE
Definition: reorderbuffer.h:27
void ReorderBufferSkipPrepare(ReorderBuffer *rb, TransactionId xid)
Oid * ReorderBufferGetRelids(ReorderBuffer *rb, int nrelids)
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)
ReorderBufferTXN * ReorderBufferGetOldestTXN(ReorderBuffer *rb)
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)
ReorderBufferChange * ReorderBufferGetChange(ReorderBuffer *rb)
void ReorderBufferAddSnapshot(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Snapshot snap)
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)
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)
void ReorderBufferReturnRelids(ReorderBuffer *rb, Oid *relids)
ReorderBufferTupleBuf * ReorderBufferGetTupleBuf(ReorderBuffer *rb, Size tuple_len)
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:63
@ REORDER_BUFFER_CHANGE_INVALIDATION
Definition: reorderbuffer.h:68
@ REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM
Definition: reorderbuffer.h:73
@ REORDER_BUFFER_CHANGE_INSERT
Definition: reorderbuffer.h:64
@ REORDER_BUFFER_CHANGE_MESSAGE
Definition: reorderbuffer.h:67
@ REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT
Definition: reorderbuffer.h:74
@ REORDER_BUFFER_CHANGE_INTERNAL_COMMAND_ID
Definition: reorderbuffer.h:70
@ REORDER_BUFFER_CHANGE_INTERNAL_TUPLECID
Definition: reorderbuffer.h:71
@ REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT
Definition: reorderbuffer.h:72
@ REORDER_BUFFER_CHANGE_TRUNCATE
Definition: reorderbuffer.h:75
@ REORDER_BUFFER_CHANGE_DELETE
Definition: reorderbuffer.h:66
@ REORDER_BUFFER_CHANGE_INTERNAL_SNAPSHOT
Definition: reorderbuffer.h:69
@ REORDER_BUFFER_CHANGE_UPDATE
Definition: reorderbuffer.h:65
void(* ReorderBufferStreamStopCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr last_lsn)
void StartupReorderBuffer(void)
void ReorderBufferAbortOld(ReorderBuffer *rb, TransactionId oldestRunningXid)
void(* ReorderBufferStreamTruncateCB)(ReorderBuffer *rb, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change)
Definition: dynahash.c:220
struct ReorderBufferChange::@95::@100 inval
ReorderBufferTupleBuf * newtuple
ReorderBufferChangeType action
Definition: reorderbuffer.h:93
struct ReorderBufferChange::@95::@97 truncate
RelFileLocator rlocator
ItemPointerData tid
struct ReorderBufferChange::@95::@98 msg
struct ReorderBufferTXN * txn
Definition: reorderbuffer.h:96
RelFileLocator locator
RepOriginId origin_id
Definition: reorderbuffer.h:98
ReorderBufferTupleBuf * oldtuple
SharedInvalidationMessage * invalidations
struct ReorderBufferChange::@95::@99 tuplecid
struct ReorderBufferChange::@95::@96 tp
union ReorderBufferChange::@95 data
CommandId command_id
XLogRecPtr restart_decoding_lsn
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
union ReorderBufferTXN::@101 xact_time
TimestampTz prepare_time
TransactionId xid
dlist_node base_snapshot_node
dlist_head changes
dlist_head subtxns
HeapTupleData tuple
Definition: reorderbuffer.h:37
ReorderBufferStreamMessageCB stream_message
ReorderBufferStreamChangeCB stream_change
ReorderBufferBeginCB begin_prepare
ReorderBufferStreamTruncateCB stream_truncate
ReorderBufferCommitPreparedCB commit_prepared
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
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