Hi, here are my review comments for v19-0001.
======
doc/src/sgml/protocol.sgml
nitpick - Now there is >1 option. /The following option is supported:/The
following options are supported:/
======
src/backend/access/transam/twophase.c
TwoPhaseTransactionGid:
nitpick - renamed parameter /gid/gid_res/ to emphasize that this is
returned by reference
~~~
1.
IsTwoPhaseTransactionGidForSubid
+ /* Construct the format GID based on the got xid */
+ TwoPhaseTransactionGid(subid, xid, gid_generated, sizeof(gid));
I think the wrong size is being passed here. It should be the buffer size
-- e.g. sizeof(gid_generated).
~
nitpick - renamed a couple of vars for readability
nitpick - expanded some comments.
======
src/backend/commands/subscriptioncmds.c
2. AlterSubscription
+ /*
+ * slot_name and two_phase cannot be altered
+ * simultaneously. The latter part refers to the pre-set
+ * slot name and tries to modify the slot option, so
+ * changing both does not make sense.
+ */
I had given a v18-0002 nitpick suggestion to re-word all of this comment.
But, as I wrote before [1], that fix belongs here in patch 0001 where the
comment was first added.
======
[1]
https://www.postgresql.org/message-id/CAHut%2BPsqMRS3dcijo5jsTSbgV1-9So-YBC7PH7xg0%2BZ8hA7fDQ%40mail.gmail.com
Kind Regards,
Peter Smith.
Fujitsu Australia
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml
index cba6661..24c57fb 100644
--- a/doc/src/sgml/protocol.sgml
+++ b/doc/src/sgml/protocol.sgml
@@ -2192,7 +2192,7 @@ psql "dbname=postgres replication=database" -c
"IDENTIFY_SYSTEM;"
</varlistentry>
</variablelist>
- <para>The following option is supported:</para>
+ <para>The following options are supported:</para>
<variablelist>
<varlistentry>
diff --git a/src/backend/access/transam/twophase.c
b/src/backend/access/transam/twophase.c
index f710030..b426f0b 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -2689,7 +2689,7 @@ LookupGXact(const char *gid, XLogRecPtr prepare_end_lsn,
* Return the GID in the supplied buffer.
*/
void
-TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid, int szgid)
+TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid_res, int szgid)
{
Assert(subid != InvalidRepOriginId);
@@ -2698,7 +2698,7 @@ TwoPhaseTransactionGid(Oid subid, TransactionId xid, char
*gid, int szgid)
(errcode(ERRCODE_PROTOCOL_VIOLATION),
errmsg_internal("invalid two-phase transaction
ID")));
- snprintf(gid, szgid, "pg_gid_%u_%u", subid, xid);
+ snprintf(gid_res, szgid, "pg_gid_%u_%u", subid, xid);
}
/*
@@ -2710,20 +2710,26 @@ static bool
IsTwoPhaseTransactionGidForSubid(Oid subid, char *gid)
{
int ret;
- Oid subid_written;
- TransactionId xid;
+ Oid subid_from_gid;
+ TransactionId xid_from_gid;
char gid_generated[GIDSIZE];
- ret = sscanf(gid, "pg_gid_%u_%u", &subid_written, &xid);
+ /* Extract the subid and xid from the given GID. */
+ ret = sscanf(gid, "pg_gid_%u_%u", &subid_from_gid, &xid_from_gid);
- /* Return false if the given GID has different format */
- if (ret != 2 || subid != subid_written)
+ /*
+ * Check that the given GID has expected format, and at least the subid
+ * matches.
+ */
+ if (ret != 2 || subid != subid_from_gid)
return false;
- /* Construct the format GID based on the got xid */
- TwoPhaseTransactionGid(subid, xid, gid_generated, sizeof(gid));
-
- /* ...And check whether the given GID is exact same as the format GID */
+ /*
+ * Reconstruct a tmp GID based on the subid and xid extracted from
+ * the given GID. Check that the tmp GID and the given GID match.
+ */
+ TwoPhaseTransactionGid(subid_from_gid, xid_from_gid,
+ gid_generated,
sizeof(gid_generated));
return strcmp(gid, gid_generated) == 0;
}