Обсуждение: teach pg_upgrade to handle in-place tablespaces
(Creating new thread from https://postgr.es/m/Z-MaPREQvH5YB0af%40nathan.) On Tue, Mar 25, 2025 at 04:03:57PM -0500, Nathan Bossart wrote: > I also wanted to draw attention to this note in 0003: > > /* > * XXX: The below line is a hack to deal with the fact that we > * presently don't have an easy way to find the corresponding new > * tablespace's path. This will need to be fixed if/when we add > * pg_upgrade support for in-place tablespaces. > */ > new_tablespace = old_tablespace; > > I intend to address this in v19, primarily to enable same-version > pg_upgrade testing with non-default tablespaces. My current thinking is > that we should have pg_upgrade also gather the new cluster tablespace > information and map them to the corresponding tablespaces on the old > cluster. This might require some refactoring in pg_upgrade. In any case, > I didn't feel this should block the feature for v18. Patch attached. -- nathan
Вложения
On Mon, Apr 28, 2025 at 04:07:16PM -0500, Nathan Bossart wrote: > On Tue, Mar 25, 2025 at 04:03:57PM -0500, Nathan Bossart wrote: >> I also wanted to draw attention to this note in 0003: >> >> /* >> * XXX: The below line is a hack to deal with the fact that we >> * presently don't have an easy way to find the corresponding new >> * tablespace's path. This will need to be fixed if/when we add >> * pg_upgrade support for in-place tablespaces. >> */ >> new_tablespace = old_tablespace; >> >> I intend to address this in v19, primarily to enable same-version >> pg_upgrade testing with non-default tablespaces. My current thinking is >> that we should have pg_upgrade also gather the new cluster tablespace >> information and map them to the corresponding tablespaces on the old >> cluster. This might require some refactoring in pg_upgrade. In any case, >> I didn't feel this should block the feature for v18. > > Patch attached. And here is a new version of the patch that should hopefully build on Windows. -- nathan
Вложения
On Tue, Jul 1, 2025 at 4:06 PM Nathan Bossart <nathandbossart@gmail.com> wrote:
rebased
--
nathan
Everything here makes sense to me, but I do have one question:
In src/bin/pg_upgrade/info.c
@@ -616,11 +630,21 @@ process_rel_infos(DbInfo *dbinfo, PGresult *res, void *arg)
+ if (inplace)
+ tablespace = psprintf("%s/%s",
+ os_info.running_cluster->pgdata,
+ PQgetvalue(res, relnum, i_spclocation));
+ else
+ tablespace = PQgetvalue(res, relnum, i_spclocation);
On Mon, Jul 21, 2025 at 08:16:12PM -0400, Corey Huinker wrote: > Everything here makes sense to me, but I do have one question: Thanks for reviewing. > In src/bin/pg_upgrade/info.c > @@ -616,11 +630,21 @@ process_rel_infos(DbInfo *dbinfo, PGresult *res, void > *arg) > + if (inplace) > + tablespace = psprintf("%s/%s", > + os_info.running_cluster->pgdata, > + PQgetvalue(res, relnum, i_spclocation)); > + else > + tablespace = PQgetvalue(res, relnum, i_spclocation); > > I'm sure it's no big deal, but we've already PQgetvalue() fetched that once > for spcloc, and we're going to fetch it again no matter what the value of > inplace is. Is there a reason to not reuse spcloc? I can't think of any reason. Fixed in v4. -- nathan
Вложения
On Mon, Jul 21, 2025 at 07:57:32PM -0500, Nathan Bossart wrote: + if (!defined($ENV{oldinstall})) + { + $new->append_conf('postgresql.conf', + "allow_in_place_tablespaces = true"); + $old->append_conf('postgresql.conf', + "allow_in_place_tablespaces = true"); + } This would not choke as long as the old cluster is at least at v10, but well why not. - # For cross-version tests, we can also check that pg_upgrade handles - # tablespaces. + my $tblspc = ''; if (defined($ENV{oldinstall})) { - my $tblspc = PostgreSQL::Test::Utils::tempdir_short(); - $old->safe_psql('postgres', - "CREATE TABLESPACE test_tblspc LOCATION '$tblspc'"); - $old->safe_psql('postgres', - "CREATE DATABASE testdb2 TABLESPACE test_tblspc"); - $old->safe_psql('postgres', - "CREATE TABLE test3 TABLESPACE test_tblspc AS SELECT generate_series(300, 401)" - ); - $old->safe_psql('testdb2', - "CREATE TABLE test4 AS SELECT generate_series(400, 502)"); + $tblspc = PostgreSQL::Test::Utils::tempdir_short(); } + $old->safe_psql('postgres', + "CREATE TABLESPACE test_tblspc LOCATION '$tblspc'"); + $old->safe_psql('postgres', + "CREATE DATABASE testdb2 TABLESPACE test_tblspc"); + $old->safe_psql('postgres', + "CREATE TABLE test3 TABLESPACE test_tblspc AS SELECT generate_series(300, 401)" + ); + $old->safe_psql('testdb2', + "CREATE TABLE test4 AS SELECT generate_series(400, 502)"); $old->stop; I would vote for having a total of two tablespaces when we can do so safely: one non-inplace and one inplace, strengthening the cross-checks for the prefixes assigned in the new paths when doing a swap of the tablespace paths, even when an old installation is tested. + /* + * For now, we do not expect non-in-place tablespaces to move during + * upgrade. If that changes, it will likely become necessary to run + * the above query on the new cluster, too. + */ Curiosity matter: has this ever been discussed? Spoiler: I don't recall so and why it would ever matter as tbspace OIDs should be fixed across upgrades these days (right?). @@ -53,19 +63,44 @@ get_tablespace_paths(void) [...] + if (is_absolute_path(PQgetvalue(res, tblnum, i_spclocation))) + { This use of is_absolute_path() should document that it is for in-place tablespaces? + if (strcmp(new_tablespace, new_cluster.pgdata) == 0) + new_tblspc_suffix = "/base"; This knowledge is encapsulated in GetDatabasePath() currently. Not new, just saying that it could be nice to reduce the footprint of this knowledge in pg_upgrade. Perhaps not something to worry about here, though. -- Michael
Вложения
On Tue, Jul 22, 2025 at 10:37:05AM +0900, Michael Paquier wrote: > On Mon, Jul 21, 2025 at 07:57:32PM -0500, Nathan Bossart wrote: > + if (!defined($ENV{oldinstall})) > + { > + $new->append_conf('postgresql.conf', > + "allow_in_place_tablespaces = true"); > + $old->append_conf('postgresql.conf', > + "allow_in_place_tablespaces = true"); > + } > > This would not choke as long as the old cluster is at least at v10, > but well why not. I'm not sure what you mean. allow_in_place_tablespaces was added in v15, right? > I would vote for having a total of two tablespaces when we can do so > safely: one non-inplace and one inplace, strengthening the > cross-checks for the prefixes assigned in the new paths when doing a > swap of the tablespace paths, even when an old installation is tested. Seems reasonable, will add this. > + /* > + * For now, we do not expect non-in-place tablespaces to move during > + * upgrade. If that changes, it will likely become necessary to run > + * the above query on the new cluster, too. > + */ > > Curiosity matter: has this ever been discussed? Spoiler: I don't > recall so and why it would ever matter as tbspace OIDs should be fixed > across upgrades these days (right?). I'm not aware of any such discussion. I know there was a time before version-specific tablespace subdirectories were a thing, but that is long gone. And yeah, we've preserved tablespace OIDs since v15. > + if (is_absolute_path(PQgetvalue(res, tblnum, i_spclocation))) > + { > > This use of is_absolute_path() should document that it is for in-place > tablespaces? Yes. > + if (strcmp(new_tablespace, new_cluster.pgdata) == 0) > + new_tblspc_suffix = "/base"; > > This knowledge is encapsulated in GetDatabasePath() currently. Not > new, just saying that it could be nice to reduce the footprint of this > knowledge in pg_upgrade. Perhaps not something to worry about here, > though. I'll take a look and see what I can do. -- nathan
On Mon, Jul 21, 2025 at 09:06:59PM -0500, Nathan Bossart wrote: > On Tue, Jul 22, 2025 at 10:37:05AM +0900, Michael Paquier wrote: >> This would not choke as long as the old cluster is at least at v10, >> but well why not. > > I'm not sure what you mean. allow_in_place_tablespaces was added in v15, > right? Yes initially, not so these days. Here are the backpatches across v10~14: <16e7a8fd8e97> 2022-07-27 [Alvaro Herrera] Allow "in place" tablespaces. <961cab0a5a90> 2022-07-27 [Alvaro Herrera] Allow "in place" tablespaces. <7bdbbb87340f> 2022-07-27 [Alvaro Herrera] Allow "in place" tablespaces. <258c896418bf> 2022-07-27 [Alvaro Herrera] Allow "in place" tablespaces. <ca347f5433ed> 2022-07-27 [Alvaro Herrera] Allow "in place" tablespaces. -- Michael
Вложения
On Tue, Jul 22, 2025 at 11:17:42AM +0900, Michael Paquier wrote: > On Mon, Jul 21, 2025 at 09:06:59PM -0500, Nathan Bossart wrote: >> On Tue, Jul 22, 2025 at 10:37:05AM +0900, Michael Paquier wrote: >>> This would not choke as long as the old cluster is at least at v10, >>> but well why not. >> >> I'm not sure what you mean. allow_in_place_tablespaces was added in v15, >> right? > > Yes initially, not so these days. Here are the backpatches across > v10~14: Ah, I see. Here's a new patch that should address all your feedback except for the part about "/base". I figure we can leave that for another patch. -- nathan
Вложения
Committed. -- nathan