mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Generic Messages for Logical Decoding
API and mechanism to allow generic messages to be inserted into WAL that are intended to be read by logical decoding plugins. This commit adds an optional new callback to the logical decoding API. Messages are either text or bytea. Messages can be transactional, or not, and are identified by a prefix to allow multiple concurrent decoding plugins. (Not to be confused with Generic WAL records, which are intended to allow crash recovery of extensible objects.) Author: Petr Jelinek and Andres Freund Reviewers: Artur Zakirov, Tomas Vondra, Simon Riggs Discussion: 5685F999.6010202@2ndquadrant.com
This commit is contained in:
@@ -21,4 +21,6 @@ extern Datum pg_logical_slot_get_binary_changes(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_logical_slot_peek_changes(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_logical_slot_peek_binary_changes(PG_FUNCTION_ARGS);
|
||||
|
||||
extern Datum pg_logical_emit_message_bytea(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_logical_emit_message_text(PG_FUNCTION_ARGS);
|
||||
#endif
|
||||
|
41
src/include/replication/message.h
Normal file
41
src/include/replication/message.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
* message.h
|
||||
* Exports from replication/logical/message.c
|
||||
*
|
||||
* Copyright (c) 2013-2016, PostgreSQL Global Development Group
|
||||
*
|
||||
* src/include/replication/message.h
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef PG_LOGICAL_MESSAGE_H
|
||||
#define PG_LOGICAL_MESSAGE_H
|
||||
|
||||
#include "access/xlog.h"
|
||||
#include "access/xlogdefs.h"
|
||||
#include "access/xlogreader.h"
|
||||
|
||||
/*
|
||||
* Generic logical decoding message wal record.
|
||||
*/
|
||||
typedef struct xl_logical_message
|
||||
{
|
||||
bool transactional; /* is message transactional? */
|
||||
Size prefix_size; /* length of prefix */
|
||||
Size message_size; /* size of the message */
|
||||
char message[FLEXIBLE_ARRAY_MEMBER]; /* message including the null
|
||||
* terminated prefix of length
|
||||
* prefix_size */
|
||||
} xl_logical_message;
|
||||
|
||||
#define SizeOfLogicalMessage (offsetof(xl_logical_message, message))
|
||||
|
||||
extern XLogRecPtr LogLogicalMessage(const char *prefix, const char *message,
|
||||
size_t size, bool transactional);
|
||||
|
||||
/* RMGR API*/
|
||||
#define XLOG_LOGICAL_MESSAGE 0x00
|
||||
void logicalmsg_redo(XLogReaderState *record);
|
||||
void logicalmsg_desc(StringInfo buf, XLogReaderState *record);
|
||||
const char *logicalmsg_identify(uint8 info);
|
||||
|
||||
#endif /* PG_LOGICAL_MESSAGE_H */
|
@@ -73,6 +73,18 @@ typedef void (*LogicalDecodeCommitCB) (
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr commit_lsn);
|
||||
|
||||
/*
|
||||
* Called for the generic logical decoding messages.
|
||||
*/
|
||||
typedef void (*LogicalDecodeMessageCB) (
|
||||
struct LogicalDecodingContext *,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr message_lsn,
|
||||
bool transactional,
|
||||
const char *prefix,
|
||||
Size message_size,
|
||||
const char *message);
|
||||
|
||||
/*
|
||||
* Filter changes by origin.
|
||||
*/
|
||||
@@ -96,6 +108,7 @@ typedef struct OutputPluginCallbacks
|
||||
LogicalDecodeBeginCB begin_cb;
|
||||
LogicalDecodeChangeCB change_cb;
|
||||
LogicalDecodeCommitCB commit_cb;
|
||||
LogicalDecodeMessageCB message_cb;
|
||||
LogicalDecodeFilterByOriginCB filter_by_origin_cb;
|
||||
LogicalDecodeShutdownCB shutdown_cb;
|
||||
} OutputPluginCallbacks;
|
||||
|
@@ -54,6 +54,7 @@ enum ReorderBufferChangeType
|
||||
REORDER_BUFFER_CHANGE_INSERT,
|
||||
REORDER_BUFFER_CHANGE_UPDATE,
|
||||
REORDER_BUFFER_CHANGE_DELETE,
|
||||
REORDER_BUFFER_CHANGE_MESSAGE,
|
||||
REORDER_BUFFER_CHANGE_INTERNAL_SNAPSHOT,
|
||||
REORDER_BUFFER_CHANGE_INTERNAL_COMMAND_ID,
|
||||
REORDER_BUFFER_CHANGE_INTERNAL_TUPLECID,
|
||||
@@ -98,6 +99,14 @@ typedef struct ReorderBufferChange
|
||||
ReorderBufferTupleBuf *newtuple;
|
||||
} tp;
|
||||
|
||||
/* Message with arbitrary data. */
|
||||
struct
|
||||
{
|
||||
char *prefix;
|
||||
Size message_size;
|
||||
char *message;
|
||||
} msg;
|
||||
|
||||
/* New snapshot, set when action == *_INTERNAL_SNAPSHOT */
|
||||
Snapshot snapshot;
|
||||
|
||||
@@ -274,6 +283,15 @@ typedef void (*ReorderBufferCommitCB) (
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr commit_lsn);
|
||||
|
||||
/* message callback signature */
|
||||
typedef void (*ReorderBufferMessageCB) (
|
||||
ReorderBuffer *rb,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr message_lsn,
|
||||
bool transactional,
|
||||
const char *prefix, Size sz,
|
||||
const char *message);
|
||||
|
||||
struct ReorderBuffer
|
||||
{
|
||||
/*
|
||||
@@ -300,6 +318,7 @@ struct ReorderBuffer
|
||||
ReorderBufferBeginCB begin;
|
||||
ReorderBufferApplyChangeCB apply_change;
|
||||
ReorderBufferCommitCB commit;
|
||||
ReorderBufferMessageCB message;
|
||||
|
||||
/*
|
||||
* Pointer that will be passed untouched to the callbacks.
|
||||
@@ -350,6 +369,9 @@ ReorderBufferChange *ReorderBufferGetChange(ReorderBuffer *);
|
||||
void ReorderBufferReturnChange(ReorderBuffer *, ReorderBufferChange *);
|
||||
|
||||
void ReorderBufferQueueChange(ReorderBuffer *, TransactionId, XLogRecPtr lsn, ReorderBufferChange *);
|
||||
void ReorderBufferQueueMessage(ReorderBuffer *, TransactionId, Snapshot snapshot, XLogRecPtr lsn,
|
||||
bool transactional, const char *prefix,
|
||||
Size message_size, const char *message);
|
||||
void ReorderBufferCommit(ReorderBuffer *, TransactionId,
|
||||
XLogRecPtr commit_lsn, XLogRecPtr end_lsn,
|
||||
TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn);
|
||||
|
@@ -63,6 +63,8 @@ extern const char *SnapBuildExportSnapshot(SnapBuild *snapstate);
|
||||
extern void SnapBuildClearExportedSnapshot(void);
|
||||
|
||||
extern SnapBuildState SnapBuildCurrentState(SnapBuild *snapstate);
|
||||
extern Snapshot SnapBuildGetOrBuildSnapshot(SnapBuild *builder,
|
||||
TransactionId xid);
|
||||
|
||||
extern bool SnapBuildXactNeedsSkip(SnapBuild *snapstate, XLogRecPtr ptr);
|
||||
|
||||
|
Reference in New Issue
Block a user