Fix the logical replication from HEAD to lower versions.

Commit 464824323e changed the logical replication protocol to allow the
streaming of in-progress transactions and used the new version of protocol
irrespective of the server version. Use the appropriate version of the
protocol based on the server version.

Reported-by: Ashutosh Sharma
Author: Dilip Kumar
Reviewed-by: Ashutosh Sharma and Amit Kapila
Discussion: https://postgr.es/m/CAE9k0P=9OpXcNrcU5Gsvd5MZ8GFpiN833vNHzX6Uc=8+h1ft1Q@mail.gmail.com
This commit is contained in:
Amit Kapila 2020-09-26 10:08:00 +05:30
parent dee663f784
commit 079d0cacf4
3 changed files with 10 additions and 6 deletions

View File

@ -3087,7 +3087,9 @@ ApplyWorkerMain(Datum main_arg)
options.logical = true; options.logical = true;
options.startpoint = origin_startpos; options.startpoint = origin_startpos;
options.slotname = myslotname; options.slotname = myslotname;
options.proto.logical.proto_version = LOGICALREP_PROTO_VERSION_NUM; options.proto.logical.proto_version =
walrcv_server_version(wrconn) >= 140000 ?
LOGICALREP_PROTO_STREAM_VERSION_NUM : LOGICALREP_PROTO_VERSION_NUM;
options.proto.logical.publication_names = MySubscription->publications; options.proto.logical.publication_names = MySubscription->publications;
options.proto.logical.binary = MySubscription->binary; options.proto.logical.binary = MySubscription->binary;
options.proto.logical.streaming = MySubscription->stream; options.proto.logical.streaming = MySubscription->stream;

View File

@ -272,11 +272,11 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt,
&enable_streaming); &enable_streaming);
/* Check if we support requested protocol */ /* Check if we support requested protocol */
if (data->protocol_version > LOGICALREP_PROTO_VERSION_NUM) if (data->protocol_version > LOGICALREP_PROTO_MAX_VERSION_NUM)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("client sent proto_version=%d but we only support protocol %d or lower", errmsg("client sent proto_version=%d but we only support protocol %d or lower",
data->protocol_version, LOGICALREP_PROTO_VERSION_NUM))); data->protocol_version, LOGICALREP_PROTO_MAX_VERSION_NUM)));
if (data->protocol_version < LOGICALREP_PROTO_MIN_VERSION_NUM) if (data->protocol_version < LOGICALREP_PROTO_MIN_VERSION_NUM)
ereport(ERROR, ereport(ERROR,

View File

@ -19,8 +19,9 @@
/* /*
* Protocol capabilities * Protocol capabilities
* *
* LOGICALREP_PROTO_VERSION_NUM is our native protocol and the greatest version * LOGICALREP_PROTO_VERSION_NUM is our native protocol.
* we can support. LOGICALREP_PROTO_MIN_VERSION_NUM is the oldest version we * LOGICALREP_PROTO_MAX_VERSION_NUM is the greatest version we can support.
* LOGICALREP_PROTO_MIN_VERSION_NUM is the oldest version we
* have backwards compatibility for. The client requests protocol version at * have backwards compatibility for. The client requests protocol version at
* connect time. * connect time.
* *
@ -28,8 +29,9 @@
* support for streaming large transactions. * support for streaming large transactions.
*/ */
#define LOGICALREP_PROTO_MIN_VERSION_NUM 1 #define LOGICALREP_PROTO_MIN_VERSION_NUM 1
#define LOGICALREP_PROTO_VERSION_NUM 1
#define LOGICALREP_PROTO_STREAM_VERSION_NUM 2 #define LOGICALREP_PROTO_STREAM_VERSION_NUM 2
#define LOGICALREP_PROTO_VERSION_NUM 2 #define LOGICALREP_PROTO_MAX_VERSION_NUM LOGICALREP_PROTO_STREAM_VERSION_NUM
/* /*
* This struct stores a tuple received via logical replication. * This struct stores a tuple received via logical replication.