Expose new function get_controlfile_by_exact_path().
authorRobert Haas <[email protected]>
Wed, 13 Mar 2024 16:06:44 +0000 (12:06 -0400)
committerRobert Haas <[email protected]>
Wed, 13 Mar 2024 16:06:44 +0000 (12:06 -0400)
This works just like get_controlfile(), but expects the path to the
control file rather than the path to the data directory that contains
the control file. This makes more sense in cases where the caller
has already constructed the path to the control file itself.

Amul Sul and Robert Haas, reviewed by Michael Paquier

src/bin/pg_combinebackup/pg_combinebackup.c
src/common/controldata_utils.c
src/include/common/controldata_utils.h

index 60e62d03b19ce6ea5b58e4e2d1025d4ae7f77c95..4197cfeadef420d9f5cb41ad7f6ce5508613dc8c 100644 (file)
@@ -534,7 +534,7 @@ check_control_files(int n_backups, char **backup_dirs)
 
        controlpath = psprintf("%s/%s", backup_dirs[i], "global/pg_control");
        pg_log_debug("reading \"%s\"", controlpath);
-       control_file = get_controlfile(backup_dirs[i], &crc_ok);
+       control_file = get_controlfile_by_exact_path(controlpath, &crc_ok);
 
        /* Control file contents not meaningful if CRC is bad. */
        if (!crc_ok)
index 92e8fed6b2eb2124cb0775a75fb84a32fd399bc9..82309b25107716db8d7b0fbb966f493b27fdf020 100644 (file)
  */
 ControlFileData *
 get_controlfile(const char *DataDir, bool *crc_ok_p)
+{
+   char        ControlFilePath[MAXPGPATH];
+
+   snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir);
+
+   return get_controlfile_by_exact_path(ControlFilePath, crc_ok_p);
+}
+
+/*
+ * get_controlfile_by_exact_path()
+ *
+ * As above, but the caller specifies the path to the control file itself,
+ * rather than the path to the data directory.
+ */
+ControlFileData *
+get_controlfile_by_exact_path(const char *ControlFilePath, bool *crc_ok_p)
 {
    ControlFileData *ControlFile;
    int         fd;
-   char        ControlFilePath[MAXPGPATH];
    pg_crc32c   crc;
    int         r;
 #ifdef FRONTEND
@@ -64,7 +79,6 @@ get_controlfile(const char *DataDir, bool *crc_ok_p)
    Assert(crc_ok_p);
 
    ControlFile = palloc_object(ControlFileData);
-   snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir);
 
 #ifdef FRONTEND
    INIT_CRC32C(last_crc);
index 04da70e87b234468def4591ad8f2966c22f94249..6e263ce0de0ce762f13029e5aff2f381dd514f58 100644 (file)
@@ -13,6 +13,8 @@
 #include "catalog/pg_control.h"
 
 extern ControlFileData *get_controlfile(const char *DataDir, bool *crc_ok_p);
+extern ControlFileData *get_controlfile_by_exact_path(const char *ControlFilePath,
+                                                     bool *crc_ok_p);
 extern void update_controlfile(const char *DataDir,
                               ControlFileData *ControlFile, bool do_sync);