diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2018-03-27 16:14:40 +0300 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2018-03-27 16:14:40 +0300 |
commit | 920a5e500a119b03356fb1fb64a677eb1aa5fc6f (patch) | |
tree | 8830b4fe2fd32cbc6b81787d3aa70c4410044499 | |
parent | 3ad55863e9392bff73377911ebbf9760027ed405 (diff) | |
download | postgresql-920a5e500a119b03356fb1fb64a677eb1aa5fc6f.tar.gz postgresql-920a5e500a119b03356fb1fb64a677eb1aa5fc6f.zip |
Skip temp tables from basebackup.
Do not store temp tables in basebackup, they will not be visible anyway, so,
there are not reasons to store them.
Author: David Steel
Reviewed by: me
Discussion: https://www.postgresql.org/message-id/flat/5ea4d26a-a453-c1b7-eff9-5a3ef8f8aceb@pgmasters.net
-rw-r--r-- | doc/src/sgml/protocol.sgml | 2 | ||||
-rw-r--r-- | src/backend/replication/basebackup.c | 10 | ||||
-rw-r--r-- | src/backend/storage/file/fd.c | 3 | ||||
-rw-r--r-- | src/bin/pg_basebackup/t/010_pg_basebackup.pl | 49 | ||||
-rw-r--r-- | src/include/storage/fd.h | 1 |
5 files changed, 61 insertions, 4 deletions
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 472bd3ef693..8c488506fad 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2565,7 +2565,7 @@ The commands accepted in replication mode are: <para> Various temporary files and directories created during the operation of the PostgreSQL server, such as any file or directory beginning - with <filename>pgsql_tmp</filename>. + with <filename>pgsql_tmp</filename> and temporary relations. </para> </listitem> <listitem> diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index e4c45c50256..654d0832da2 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -1072,6 +1072,16 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, } } + /* Exclude temporary relations */ + if (isDbDir && looks_like_temp_rel_name(de->d_name)) + { + elog(DEBUG2, + "temporary relation file \"%s\" excluded from backup", + de->d_name); + + continue; + } + snprintf(pathbuf, sizeof(pathbuf), "%s/%s", path, de->d_name); /* Skip pg_control here to back up it last */ diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 2a18e94ff49..d30a725f900 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -325,7 +325,6 @@ static void RemovePgTempFilesInDir(const char *tmpdirname, bool missing_ok, bool unlink_all); static void RemovePgTempRelationFiles(const char *tsdirname); static void RemovePgTempRelationFilesInDbspace(const char *dbspacedirname); -static bool looks_like_temp_rel_name(const char *name); static void walkdir(const char *path, void (*action) (const char *fname, bool isdir, int elevel), @@ -3192,7 +3191,7 @@ RemovePgTempRelationFilesInDbspace(const char *dbspacedirname) } /* t<digits>_<digits>, or t<digits>_<digits>_<forkname> */ -static bool +bool looks_like_temp_rel_name(const char *name) { int pos; diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 455c7fca0df..e6018de0543 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -2,9 +2,10 @@ use strict; use warnings; use Cwd; use Config; +use File::Basename qw(basename dirname); use PostgresNode; use TestLib; -use Test::More tests => 87; +use Test::More tests => 93; program_help_ok('pg_basebackup'); program_version_ok('pg_basebackup'); @@ -76,6 +77,18 @@ my $baseUnloggedPath = $node->safe_psql('postgres', ok(-f "$pgdata/${baseUnloggedPath}_init", 'unlogged init fork in base'); ok(-f "$pgdata/$baseUnloggedPath", 'unlogged main fork in base'); +# Create files that look like temporary relations to ensure they are ignored. +my $postgresOid = $node->safe_psql('postgres', + q{select oid from pg_database where datname = 'postgres'}); + +my @tempRelationFiles = qw(t999_999 t9999_999.1 t999_9999_vm t99999_99999_vm.1); + +foreach my $filename (@tempRelationFiles) +{ + append_to_file("$pgdata/base/$postgresOid/$filename", 'TEMP_RELATION'); +} + +# Run base backup. $node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backup", '-X', 'none' ], 'pg_basebackup runs'); ok(-f "$tempdir/backup/PG_VERSION", 'backup was created'); @@ -112,6 +125,13 @@ ok(-f "$tempdir/backup/${baseUnloggedPath}_init", ok(!-f "$tempdir/backup/$baseUnloggedPath", 'unlogged main fork not in backup'); +# Temp relations should not be copied. +foreach my $filename (@tempRelationFiles) +{ + ok(!-f "$tempdir/backup/base/$postgresOid/$filename", + "base/$postgresOid/$filename not copied"); +} + # Make sure existing backup_label was ignored. isnt(slurp_file("$tempdir/backup/backup_label"), 'DONOTCOPY', 'existing backup_label not copied'); @@ -206,6 +226,19 @@ SKIP: ok(-f "$pgdata/$tblspc1UnloggedPath", 'unlogged main fork in tablespace'); + # Create files that look like temporary relations to ensure they are ignored + # in a tablespace. + my @tempRelationFiles = qw(t888_888 t888888_888888_vm.1); + my $tblSpc1Id = basename(dirname(dirname($node->safe_psql('postgres', + q{select pg_relation_filepath('test1')})))); + + foreach my $filename (@tempRelationFiles) + { + append_to_file( + "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename", + 'TEMP_RELATION'); + } + $node->command_fails( [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ], 'plain format with tablespaces fails without tablespace mapping'); @@ -232,6 +265,20 @@ SKIP: ok(!-f "$tempdir/tbackup/tblspc1/$tblspc1UnloggedBackupPath", 'unlogged main fork not in tablespace backup'); + # Temp relations should not be copied. + foreach my $filename (@tempRelationFiles) + { + ok(!-f "$tempdir/tbackup/tblspc1/$tblSpc1Id/$postgresOid/$filename", + "[tblspc1]/$postgresOid/$filename not copied"); + + # Also remove temp relation files or tablespace drop will fail. + my $filepath = + "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename"; + + unlink($filepath) + or BAIL_OUT("unable to unlink $filepath"); + } + ok( -d "$tempdir/backup1/pg_replslot", 'pg_replslot symlink copied as directory'); diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index 4244e7b1fd8..e49b42ce867 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -124,6 +124,7 @@ extern void AtEOXact_Files(void); extern void AtEOSubXact_Files(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid); extern void RemovePgTempFiles(void); +extern bool looks_like_temp_rel_name(const char *name); extern int pg_fsync(int fd); extern int pg_fsync_no_writethrough(int fd); |