Hi I want to propose the addition of a new field in IDENTIFY_SYSTEM: xlogversion, which will carry XLOG_PAGE_MAGIC from primary. The idea of sending that info is to allow us to know if the xlog page version of two different major versions are compatible or not. Currently pg_upgrade requires the primary to be taken down, and then re-run all base backups for each standby which is a lot of work and doesn't sound like "online upgrade".
I want to add the field now to make the protocol stable, also because when we connect to start replication we check for the number of fields retrieved from IDENTIFY_SYSTEM so if we add it in 9.2 we will be unable to do this until 9.3 (when both releases agree about the number of fields returned). patch is very simple and doesn't affect anyone nor this will require an initdb so i guess is safe to apply now. comments? -- Jaime Casanova www.2ndQuadrant.com Professional PostgreSQL: Soporte y capacitación de PostgreSQL
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 6be5a14..2235c7f 100644 *** a/doc/src/sgml/protocol.sgml --- b/doc/src/sgml/protocol.sgml *************** The commands accepted in walsender mode *** 1315,1321 **** <listitem> <para> Requests the server to identify itself. Server replies with a result ! set of a single row, containing three fields: </para> <para> --- 1315,1321 ---- <listitem> <para> Requests the server to identify itself. Server replies with a result ! set of a single row, containing four fields: </para> <para> *************** The commands accepted in walsender mode *** 1356,1361 **** --- 1356,1372 ---- </para> </listitem> </varlistentry> + + <varlistentry> + <term> + xlogversion + </term> + <listitem> + <para> + Current version of xlog page format. + </para> + </listitem> + </varlistentry> </variablelist> </para> diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index 0831b1b..7e7354b 100644 *** a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c --- b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c *************** libpqrcv_connect(char *conninfo, XLogRec *** 114,120 **** "the primary server: %s", PQerrorMessage(streamConn)))); } ! if (PQnfields(res) != 3 || PQntuples(res) != 1) { int ntuples = PQntuples(res); int nfields = PQnfields(res); --- 114,120 ---- "the primary server: %s", PQerrorMessage(streamConn)))); } ! if (PQnfields(res) != 4 || PQntuples(res) != 1) { int ntuples = PQntuples(res); int nfields = PQnfields(res); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 470e6d1..392cf94 100644 *** a/src/backend/replication/walsender.c --- b/src/backend/replication/walsender.c *************** IdentifySystem(void) *** 279,289 **** char sysid[32]; char tli[11]; char xpos[MAXFNAMELEN]; XLogRecPtr logptr; /* ! * Reply with a result set with one row, three columns. First col is ! * system ID, second is timeline ID, and third is current xlog location. */ snprintf(sysid, sizeof(sysid), UINT64_FORMAT, --- 279,291 ---- char sysid[32]; char tli[11]; char xpos[MAXFNAMELEN]; + char xlp_magic[7]; XLogRecPtr logptr; /* ! * Reply with a result set with one row, four columns. First col is ! * system ID, second is timeline ID, third is current xlog location ! * and fourth is XLOG_PAGE_MAGIC (WAL version) */ snprintf(sysid, sizeof(sysid), UINT64_FORMAT, *************** IdentifySystem(void) *** 295,303 **** snprintf(xpos, sizeof(xpos), "%X/%X", logptr.xlogid, logptr.xrecoff); /* Send a RowDescription message */ pq_beginmessage(&buf, 'T'); ! pq_sendint(&buf, 3, 2); /* 3 fields */ /* first field */ pq_sendstring(&buf, "systemid"); /* col name */ --- 297,307 ---- snprintf(xpos, sizeof(xpos), "%X/%X", logptr.xlogid, logptr.xrecoff); + snprintf(xlp_magic, sizeof(xlp_magic), "%u", XLOG_PAGE_MAGIC); + /* Send a RowDescription message */ pq_beginmessage(&buf, 'T'); ! pq_sendint(&buf, 4, 2); /* 4 fields */ /* first field */ pq_sendstring(&buf, "systemid"); /* col name */ *************** IdentifySystem(void) *** 325,341 **** pq_sendint(&buf, -1, 2); pq_sendint(&buf, 0, 4); pq_sendint(&buf, 0, 2); pq_endmessage(&buf); /* Send a DataRow message */ pq_beginmessage(&buf, 'D'); ! pq_sendint(&buf, 3, 2); /* # of columns */ pq_sendint(&buf, strlen(sysid), 4); /* col1 len */ pq_sendbytes(&buf, (char *) &sysid, strlen(sysid)); pq_sendint(&buf, strlen(tli), 4); /* col2 len */ pq_sendbytes(&buf, (char *) tli, strlen(tli)); pq_sendint(&buf, strlen(xpos), 4); /* col3 len */ pq_sendbytes(&buf, (char *) xpos, strlen(xpos)); pq_endmessage(&buf); --- 329,357 ---- pq_sendint(&buf, -1, 2); pq_sendint(&buf, 0, 4); pq_sendint(&buf, 0, 2); + + /* fourth field */ + pq_sendstring(&buf, "xlogversion"); + pq_sendint(&buf, 0, 4); + pq_sendint(&buf, 0, 2); + pq_sendint(&buf, INT4OID, 4); + pq_sendint(&buf, 4, 2); + pq_sendint(&buf, 0, 4); + pq_sendint(&buf, 0, 2); + pq_endmessage(&buf); /* Send a DataRow message */ pq_beginmessage(&buf, 'D'); ! pq_sendint(&buf, 4, 2); /* # of columns */ pq_sendint(&buf, strlen(sysid), 4); /* col1 len */ pq_sendbytes(&buf, (char *) &sysid, strlen(sysid)); pq_sendint(&buf, strlen(tli), 4); /* col2 len */ pq_sendbytes(&buf, (char *) tli, strlen(tli)); pq_sendint(&buf, strlen(xpos), 4); /* col3 len */ pq_sendbytes(&buf, (char *) xpos, strlen(xpos)); + pq_sendint(&buf, strlen(xlp_magic), 4); /* col4 len */ + pq_sendbytes(&buf, (char *) xlp_magic, strlen(xlp_magic)); pq_endmessage(&buf);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers