From: | Tomas Vondra <tomas(dot)vondra(at)enterprisedb(dot)com> |
---|---|
To: | Peter Eisentraut <peter(at)eisentraut(dot)org>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: pg_combinebackup --clone doesn't work |
Date: | 2024-06-20 09:31:09 |
Message-ID: | c8b9959e-db27-4dc7-be65-7a32570f0a84@enterprisedb.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | 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
From | Date | Subject | |
---|---|---|---|
Next Message | Amit Langote | 2024-06-20 09:46:37 | Re: SQL/JSON query functions context_item doc entry and type requirement |
Previous Message | Amit Langote | 2024-06-20 09:19:09 | Re: ON ERROR in json_query and the like |