diff options
author | Fujii Masao <fujii@postgresql.org> | 2014-02-03 23:19:49 +0900 |
---|---|---|
committer | Fujii Masao <fujii@postgresql.org> | 2014-02-03 23:19:49 +0900 |
commit | 3e8554a54a95425e93fe49025ccda499a1a93173 (patch) | |
tree | 34e67dfa66f2f84adbde3b69a72c326729d5d4aa /src | |
parent | 47aaebaac95c9000549d1a6de809e15b729231f5 (diff) | |
download | postgresql-3e8554a54a95425e93fe49025ccda499a1a93173.tar.gz postgresql-3e8554a54a95425e93fe49025ccda499a1a93173.zip |
Make pg_basebackup skip temporary statistics files.
The temporary statistics files don't need to be included in the backup
because they are always reset at the beginning of the archive recovery.
This patch changes pg_basebackup so that it skips all files located in
$PGDATA/pg_stat_tmp or the directory specified by stats_temp_directory
parameter.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/replication/basebackup.c | 31 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 2 | ||||
-rw-r--r-- | src/include/pgstat.h | 3 |
3 files changed, 34 insertions, 2 deletions
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 781f678097d..06e54bc530e 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -25,6 +25,7 @@ #include "libpq/pqformat.h" #include "miscadmin.h" #include "nodes/pg_list.h" +#include "pgstat.h" #include "replication/basebackup.h" #include "replication/walsender.h" #include "replication/walsender_private.h" @@ -63,6 +64,9 @@ static int compareWalFileNames(const void *a, const void *b); /* Was the backup currently in-progress initiated in recovery mode? */ static bool backup_started_in_recovery = false; +/* Relative path of temporary statistics directory */ +static char *statrelpath = NULL; + /* * Size of each block sent into the tar stream for larger files. */ @@ -111,6 +115,18 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir) &labelfile); SendXlogRecPtrResult(startptr, starttli); + /* + * Calculate the relative path of temporary statistics directory + * in order to skip the files which are located in that directory later. + */ + if (is_absolute_path(pgstat_stat_directory) && + strncmp(pgstat_stat_directory, DataDir, datadirpathlen) == 0) + statrelpath = psprintf("./%s", pgstat_stat_directory + datadirpathlen + 1); + else if (strncmp(pgstat_stat_directory, "./", 2) != 0) + statrelpath = psprintf("./%s", pgstat_stat_directory); + else + statrelpath = pgstat_stat_directory; + PG_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0); { List *tablespaces = NIL; @@ -838,7 +854,6 @@ sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces) sizeof(PG_AUTOCONF_FILENAME) + 4) == 0) continue; - /* * If there's a backup_label file, it belongs to a backup started by * the user with pg_start_backup(). It is *not* correct for this @@ -892,6 +907,20 @@ sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces) } /* + * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped + * even when stats_temp_directory is set because PGSS_TEXT_FILE is + * always created there. + */ + if ((statrelpath != NULL && strcmp(pathbuf, statrelpath) == 0) || + strncmp(de->d_name, PG_STAT_TMP_DIR, strlen(PG_STAT_TMP_DIR)) == 0) + { + if (!sizeonly) + _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf); + size += 512; + continue; + } + + /* * We can skip pg_xlog, the WAL segments need to be fetched from the * WAL archive anyway. But include it as an empty directory anyway, so * we get permissions right. diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 70d73d9898e..2812a73d545 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -3174,7 +3174,7 @@ static struct config_string ConfigureNamesString[] = GUC_SUPERUSER_ONLY }, &pgstat_temp_directory, - "pg_stat_tmp", + PG_STAT_TMP_DIR, check_canonical_path, assign_pgstat_temp_directory, NULL }, diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 2024b7994a4..5b2e4609f65 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -20,6 +20,9 @@ #include "utils/relcache.h" +/* Default directory to store temporary statistics data in */ +#define PG_STAT_TMP_DIR "pg_stat_tmp" + /* Values for track_functions GUC variable --- order is significant! */ typedef enum TrackFunctionsLevel { |