Re: pgsql: Map basebackup tablespaces using a tablespace_map file

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: pgsql: Map basebackup tablespaces using a tablespace_map file
Дата
Msg-id 55520F33.401@iki.fi
обсуждение исходный текст
Ответ на pgsql: Map basebackup tablespaces using a tablespace_map file  (Andrew Dunstan <andrew@dunslane.net>)
Ответы Re: pgsql: Map basebackup tablespaces using a tablespace_map file  (Andrew Dunstan <andrew@dunslane.net>)
Список pgsql-committers
On 05/12/2015 04:42 PM, Andrew Dunstan wrote:
> +
> +               /*
> +                * Remove the existing symlink if any and Create the symlink
> +                * under PGDATA.  We need to use rmtree instead of rmdir as
> +                * the link location might contain directories or files
> +                * corresponding to the actual path. Some tar utilities do
> +                * things that way while extracting symlinks.
> +                */
> +               if (lstat(linkloc, &st) == 0 && S_ISDIR(st.st_mode))
> +               {
> +                   if (!rmtree(linkloc,true))
> +                       ereport(ERROR,
> +                               (errcode_for_file_access(),
> +                                errmsg("could not remove directory \"%s\": %m",
> +                                       linkloc)));
> +               }
> +               else
> +               {
> +                   if (unlink(linkloc) < 0 && errno != ENOENT)
> +                       ereport(ERROR,
> +                               (errcode_for_file_access(),
> +                                errmsg("could not remove symbolic link \"%s\": %m",
> +                                       linkloc)));
> +               }
> +

That's scary. What tar utilitiy replaces the symlink with a non-empty
directory?

What if you call pg_start_backup() and take the backup with a utility
that follows symlinks? I wouldn't recommend using such a tool, but with
this patch, it will zap all the tablespaces. Before this, you at least
got a working database and could read out all the data or fix the
symlinks afterwards.

Why is the RelationCacheInitFileRemove() call moved?

>  XLogRecPtr
>  do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p,
> -                  char **labelfile)
> +                  char **labelfile, DIR *tblspcdir, List **tablespaces,
> +                  char **tblspcmapfile, bool infotbssize,
> +                  bool needtblspcmapfile)

Why does this need to take tblspcdir as argument? Wouldn't it make more
sense to open the directory inside do_pg_start_backup?

In the BASE_BACKUP command, is there any reason to not always include
the tablespace map? IOW, do we really need the TABLESPACE_MAP option?

- Heikki



В списке pgsql-committers по дате отправления:

Предыдущее
От: Andrew Dunstan
Дата:
Сообщение: Re: pgsql: Allow on-the-fly capture of DDL event details
Следующее
От: Bruce Momjian
Дата:
Сообщение: pgsql: doc: prevent SGML 'make check' from building temp install