Fix calculation related to temporary WAL segment name in basic_archive
authorMichael Paquier <[email protected]>
Mon, 17 Oct 2022 02:40:14 +0000 (11:40 +0900)
committerMichael Paquier <[email protected]>
Mon, 17 Oct 2022 02:40:14 +0000 (11:40 +0900)
The file name used for its temporary destination, before renaming it to
the real deal, has been using a microseconds in a timestamp aimed to be
originally in milli-seconds.  This is harmless as this is aimed at being
a safeguard against name collisions (note MyProcPid in the name), but
let's be correct with the maths.

While on it, add a note in the module's makefile to document why
installcheck is not supported.

Author: Nathan Bossart
Reviewed-by: Bharath Rupireddy
Discussion: https://postgr.es/m/20221014044106.GA1673343@nathanxps13
Backpatch-through: 15

contrib/basic_archive/Makefile
contrib/basic_archive/basic_archive.c

index 14d036e1c421cfb0425b8603fad74c7330dba601..55d299d650c280ebdc691fddd228bac253fc88c9 100644 (file)
@@ -5,7 +5,8 @@ PGFILEDESC = "basic_archive - basic archive module"
 
 REGRESS = basic_archive
 REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/basic_archive/basic_archive.conf
-
+# Disabled because these tests require "shared_preload_libraries=basic_archive",
+# which typical installcheck users do not have (e.g. buildfarm clients).
 NO_INSTALLCHECK = 1
 
 ifdef USE_PGXS
index 776a386e35254438c4ea4d2a41a33c8fab92e56d..9f221816bb4691a7f931769cfe1a7d2ef126f0f6 100644 (file)
@@ -218,7 +218,7 @@ basic_archive_file_internal(const char *file, const char *path)
    char        temp[MAXPGPATH + 256];
    struct stat st;
    struct timeval tv;
-   uint64      epoch;
+   uint64      epoch;          /* milliseconds */
 
    ereport(DEBUG3,
            (errmsg("archiving \"%s\" via basic_archive", file)));
@@ -265,7 +265,7 @@ basic_archive_file_internal(const char *file, const char *path)
     */
    gettimeofday(&tv, NULL);
    if (pg_mul_u64_overflow((uint64) 1000, (uint64) tv.tv_sec, &epoch) ||
-       pg_add_u64_overflow(epoch, (uint64) tv.tv_usec, &epoch))
+       pg_add_u64_overflow(epoch, (uint64) (tv.tv_usec / 1000), &epoch))
        elog(ERROR, "could not generate temporary file name for archiving");
 
    snprintf(temp, sizeof(temp), "%s/%s.%s.%d." UINT64_FORMAT,