Re: pg_combinebackup --clone doesn't work - Mailing list pgsql-hackers

From Tomas Vondra
Subject Re: pg_combinebackup --clone doesn't work
Date
Msg-id c8b9959e-db27-4dc7-be65-7a32570f0a84@enterprisedb.com
Whole thread Raw
In response to pg_combinebackup --clone doesn't work  (Peter Eisentraut <peter@eisentraut.org>)
Responses Re: pg_combinebackup --clone doesn't work
List pgsql-hackers
On 6/20/24 07:55, Peter Eisentraut wrote:
> The pg_combinebackup --clone option currently doesn't work at all.  Even
> on systems where it should it be supported, you'll always get a "file
> cloning not supported on this platform" error.
> 
> The reason is this checking code in pg_combinebackup.c:
> 
> #if (defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)) || \
>     (defined(__linux__) && defined(FICLONE))
> 
>         if (opt.dry_run)
>             pg_log_debug("would use cloning to copy files");
>         else
>             pg_log_debug("will use cloning to copy files");
> 
> #else
>         pg_fatal("file cloning not supported on this platform");
> #endif
> 
> The problem is that this file does not include the appropriate OS header
> files that would define COPYFILE_CLONE_FORCE or FICLONE, respectively.
> 
> The same problem also exists in copy_file.c.  (That one has the right
> header file for macOS but still not for Linux.)
> 

Seems like my bug, I guess :-( Chances are the original patches had the
include, but it got lost during refactoring or something. Anyway, will
fix shortly.

> This should be pretty easy to fix up, and we should think about some
> ways to refactor this to avoid repeating all these OS-specific things a
> few times.  (The code was copied from pg_upgrade originally.)
> 

Yeah. The ifdef forest got rather hard to navigate.

> But in the short term, how about some test coverage?  You can exercise
> the different pg_combinebackup copy modes like this:
> 
> diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm
> b/src/test/perl/PostgreSQL/Test/Cluster.pm
> index 83f385a4870..7e8dd024c82 100644
> --- a/src/test/perl/PostgreSQL/Test/Cluster.pm
> +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
> @@ -848,7 +848,7 @@ sub init_from_backup
>         }
> 
>         local %ENV = $self->_get_env();
> -       my @combineargs = ('pg_combinebackup', '-d');
> +       my @combineargs = ('pg_combinebackup', '-d', '--clone');
>         if (exists $params{tablespace_map})
>         {
>             while (my ($olddir, $newdir) = each %{
> $params{tablespace_map} })
> 

For ad hoc testing? Sure, but that won't work on platforms without the
clone support, right?

> We could do something like what we have for pg_upgrade, where we can use
> the environment variable PG_TEST_PG_UPGRADE_MODE to test the different
> copy modes.  We could turn this into a global option.  (This might also
> be useful for future work to use file cloning elsewhere, like in CREATE
> DATABASE?)
> 

Yeah, this sounds like a good way to do this. Is there a good reason to
have multiple different variables, one for each tool, or should we have
a single PG_TEST_COPY_MODE affecting all the places?

> Also, I think it would be useful for consistency if pg_combinebackup had
> a --copy option to select the default mode, like pg_upgrade does.
> 

I vaguely recall this might have been discussed in the thread about
adding cloning to pg_combinebackup, but I don't recall the details why
we didn't adopt the pg_uprade way. But we can revisit that, IMO.


regards

-- 
Tomas Vondra
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



pgsql-hackers by date:

Previous
From: Amit Langote
Date:
Subject: Re: ON ERROR in json_query and the like
Next
From: Amit Langote
Date:
Subject: Re: SQL/JSON query functions context_item doc entry and type requirement