Re: pg_receivewal starting position - Mailing list pgsql-hackers
From | Bharath Rupireddy |
---|---|
Subject | Re: pg_receivewal starting position |
Date | |
Msg-id | CALj2ACU0B-4HhQ7ooWO+m3tSewdRjsxEtmLC3b5H0B7-r6oZAw@mail.gmail.com Whole thread Raw |
In response to | Re: pg_receivewal starting position (Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>) |
List | pgsql-hackers |
On Tue, Aug 31, 2021 at 4:47 PM Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com> wrote: > > On Mon, Aug 30, 2021 at 3:26 PM Ronan Dunklau <ronan.dunklau@aiven.io> wrote: > > Thank you for this review ! Please see the other side of the thread where I > > answered Michael Paquier with a new patchset, which includes some of your > > proposed modifications. > > Thanks for the updated patches. Here are some comments on v3-0001 > patch. I will continue to review 0002 and 0003. Continuing my review on the v3 patch set: 0002: 1) I think the following message "could not fetch replication slot LSN: got %d rows and %d fields, expected %d rows and %d or more fields" should be: "could not read replication slot: got %d rows and %d fields, expected %d rows and %d or more fields" 2) Why GetSlotInformation is returning InvalidXLogRecPtr? Change it to return false instead. 3) Alignment issue: Change below 2 lines: + appendPQExpBuffer(query, "READ_REPLICATION_SLOT %s", + slot_name); To 1 line, as it will be under 80 char limit: + appendPQExpBuffer(query, "READ_REPLICATION_SLOT %s", slot_name); 4) Shouldn't your GetSlotInformation return what ever the READ_REPLICATION_SLOT gets as output columns to be more generic? Callers would pass non-null/null pointers to the inputs required/not required for them. Please refer to RunIdentifySystem how it does that. GetSlotInformation can just read the tuples that are interested for the callers. bool GetSlotInformation(PGconn *conn, const char *slot_name, char **slot_type, XLogRecPtr *restart_lsn, uint32 *restart_lsn_tli, XLogRecPtr *confirmed_lsn, XLogRecPtr *confirmed_lsn_tli) { if (slot_type) { /* get the slot_type value from the received tuple */ } if (restart_lsn) { /* get the restart_lsn value from the received tuple */ } if (restart_lsn_tli) { /* get the restart_lsn_tli value from the received tuple */ } if (confirmed_lsn) { /* get the confirmed_lsn value from the received tuple */ } if (confirmed_lsn_tli) { /* get the confirmed_lsn_tli value from the received tuple */ } } 5) How about below as GetSlotInformation function comment? /* * Run READ_REPLICATION_SLOT through a given connection and give back to caller * following information of the slot if requested: * - type * - restart lsn * - restart lsn timeline * - confirmed lsn * - confirmed lsn timeline */ 6) Do you need +#include "pqexpbuffer.h" in pg_receivewal.c? 7) Missing "," after information and it is not required to use "the" in the messages. Change below + pg_log_warning("could not fetch the replication_slot \"%s\" information " + "resuming from the current server position instead", replication_slot); to: + pg_log_warning("could not fetch replication_slot \"%s\" information, " + "resuming from current server position instead", replication_slot); 8) A typo "suport". Ignore this comment, if you incorporate review comment #10. Change below pg_log_warning("server does not suport fetching the slot's position, " "resuming from the current server position instead"); to: pg_log_warning("server does not support getting start LSN from replication slot, " "resuming from current server position instead"); 9) I think you should do free the memory allocated to slot_type by GetSlotInformation: + if (strcmp(slot_type, "physical") != 0) + { + pg_log_error("slot \"%s\" is not a physical replication slot", + replication_slot); + exit(1); + } + + pg_free(slot_type); 10) Isn't it PQclear(res);? + PQclear(0); 11) I don't think you need to check for the null value of replication_slot. In the StreamLog it can't be null, so you can safely remove the below if condition. + if (replication_slot) + { 12) How about /* Try to get start position from server's replication slot information */ insted of + /* Try to get it from the slot if any, and the server supports it */ 13) When you say that the server supports the new READ_REPLICATION_SLOT command only if version >= 15000, then isn't it the function GetSlotInformation doing the following: bool GetSlotInformation(PGconn *conn,....,bool *is_supported) { if (PQserverVersion(conn) < 15000) { *is_supported = false; return false; } *is_supported = true; } So, the callers will just do: /* Try to get start position from server's replication slot information */ char *slot_type = NULL; bool is_supported; if (!GetSlotInformation(conn, replication_slot, &stream.startpos, &stream.timeline, &slot_type, &is_supported)) { if (!is_supported) pg_log_warning("server does not support getting start LSN from replication slot, " "resuming from current server position instead"); else pg_log_warning("could not fetch replication_slot \"%s\" information, " "resuming from current server position instead", replication_slot); } if (slot_type && strcmp(slot_type, "physical") != 0) { pg_log_error("slot \"%s\" is not a physical replication slot", replication_slot); exit(1); } pg_free(slot_type); } 14) Instead of just + if (strcmp(slot_type, "physical") != 0) do + if (slot_type && strcmp(slot_type, "physical") != 0) 0003: 1) The message should start with lower case: "slot \"%s\" is not a physical replication slot". + pg_log_error("Slot \"%s\" is not a physical replication slot", 2) + if (strcmp(slot_type, "physical") != 0) do + if (slot_type && strcmp(slot_type, "physical") != 0) Regards, Bharath Rupireddy.
pgsql-hackers by date: