Hi, currently, the backup_label and (I think) the tablespace_map files are (by design) conveniently located at the beginning of the main tablespace tarball when making a basebackup. However, (by accident or also by design?) the main tablespace is the last tarball[1] to be streamed via the BASE_BACKUP replication protocol command.
For pg_basebackup, this is not a real problem, as either each tablespace is its own tarfile (in tar format mode), or the files are extracted anyway (in plain mode). However, third party tools using the BASE_BACKUP command might want to extract the backup_label, e.g. in order to figure out the START WAL LOCATION. If they make a big tarball for the whole cluster potentially including all external tablespaces, then the backup_label file is somewhere in the middle of it and it takes a long time for tar to extract it. So I am proposing the attached patch, which sends the base tablespace first, and then all the other external tablespaces afterwards, thus having base_backup be the first file in the tar in all cases. Does anybody see a problem with that? Michael [1] Chapter 52.3 of the documentation says "one or more CopyResponse results will be sent, one for the main data directory and one for each additional tablespace other than pg_default and pg_global.", which makes it sound like the main data directory is first, but in my testing, this is not the case. -- Michael Banck Projektleiter / Senior Berater Tel.: +49 2166 9901-171 Fax: +49 2166 9901-100 Email: michael.ba...@credativ.de credativ GmbH, HRB Mönchengladbach 12080 USt-ID-Nummer: DE204566209 Trompeterallee 108, 41189 Mönchengladbach Geschäftsführung: Dr. Michael Meskes, Jörg Folz, Sascha Heuer
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 09ecc15..a5a96b7 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -230,10 +230,10 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir) else statrelpath = pgstat_stat_directory; - /* Add a node for the base directory at the end */ + /* Add a node for the base directory at the beginning */ ti = palloc0(sizeof(tablespaceinfo)); ti->size = opt->progress ? sendDir(".", 1, true, tablespaces, true) : -1; - tablespaces = lappend(tablespaces, ti); + tablespaces = lcons(ti, tablespaces); /* Send tablespace header */ SendBackupHeader(tablespaces);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers