do_pg_start_backup() expects its callers to pass in an open DIR pointer
for the pg_tblspc directory, but there's no apparent advantage in that.
It complicates the callers without adding any flexibility, and there's no
robustness advantage, since we surely have to be prepared for errors during
the scan of pg_tblspc anyway. In fact, by holding an extra kernel resource
during operations like the preliminary checkpoint, we might be making
things a fraction more failure-prone not less. Hence, remove that argument
and open the directory just for the duration of the actual scan.
Discussion: https://postgr.es/m/28752.
1512413887@sss.pgh.pa.us
*/
XLogRecPtr
do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p,
- StringInfo labelfile, DIR *tblspcdir, List **tablespaces,
+ StringInfo labelfile, List **tablespaces,
StringInfo tblspcmapfile, bool infotbssize,
bool needtblspcmapfile)
{
PG_ENSURE_ERROR_CLEANUP(pg_start_backup_callback, (Datum) BoolGetDatum(exclusive));
{
bool gotUniqueStartpoint = false;
+ DIR *tblspcdir;
struct dirent *de;
tablespaceinfo *ti;
int datadirpathlen;
datadirpathlen = strlen(DataDir);
/* Collect information about all tablespaces */
+ tblspcdir = AllocateDir("pg_tblspc");
while ((de = ReadDir(tblspcdir, "pg_tblspc")) != NULL)
{
char fullpath[MAXPGPATH + 10];
appendStringInfoChar(&buflinkpath, *s++);
}
-
/*
* Relpath holds the relative path of the tablespace directory
* when it's located within PGDATA, or NULL if it's located
errmsg("tablespaces are not supported on this platform")));
#endif
}
+ FreeDir(tblspcdir);
/*
* Construct backup label file
bool exclusive = PG_GETARG_BOOL(2);
char *backupidstr;
XLogRecPtr startpoint;
- DIR *dir;
SessionBackupState status = get_backup_status();
backupidstr = text_to_cstring(backupid);
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("a backup is already in progress in this session")));
- /* Make sure we can open the directory with tablespaces in it */
- dir = AllocateDir("pg_tblspc");
- if (!dir)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not open directory \"%s\": %m",
- "pg_tblspc")));
-
if (exclusive)
{
startpoint = do_pg_start_backup(backupidstr, fast, NULL, NULL,
- dir, NULL, NULL, false, true);
+ NULL, NULL, false, true);
}
else
{
MemoryContextSwitchTo(oldcontext);
startpoint = do_pg_start_backup(backupidstr, fast, NULL, label_file,
- dir, NULL, tblspc_map_file, false, true);
+ NULL, tblspc_map_file, false, true);
before_shmem_exit(nonexclusive_base_backup_cleanup, (Datum) 0);
}
- FreeDir(dir);
-
PG_RETURN_LSN(startpoint);
}
static void send_int8_string(StringInfoData *buf, int64 intval);
static void SendBackupHeader(List *tablespaces);
static void base_backup_cleanup(int code, Datum arg);
-static void perform_base_backup(basebackup_options *opt, DIR *tblspcdir);
+static void perform_base_backup(basebackup_options *opt);
static void parse_basebackup_options(List *options, basebackup_options *opt);
static void SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli);
static int compareWalFileNames(const void *a, const void *b);
* clobbered by longjmp" from stupider versions of gcc.
*/
static void
-perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
+perform_base_backup(basebackup_options *opt)
{
XLogRecPtr startptr;
TimeLineID starttli;
tblspc_map_file = makeStringInfo();
startptr = do_pg_start_backup(opt->label, opt->fastcheckpoint, &starttli,
- labelfile, tblspcdir, &tablespaces,
+ labelfile, &tablespaces,
tblspc_map_file,
opt->progress, opt->sendtblspcmapfile);
void
SendBaseBackup(BaseBackupCmd *cmd)
{
- DIR *dir;
basebackup_options opt;
parse_basebackup_options(cmd->options, &opt);
set_ps_display(activitymsg, false);
}
- /* Make sure we can open the directory with tablespaces in it */
- dir = AllocateDir("pg_tblspc");
- if (!dir)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not open directory \"%s\": %m",
- "pg_tblspc")));
-
- perform_base_backup(&opt, dir);
-
- FreeDir(dir);
+ perform_base_backup(&opt);
}
static void
} SessionBackupState;
extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast,
- TimeLineID *starttli_p, StringInfo labelfile, DIR *tblspcdir,
+ TimeLineID *starttli_p, StringInfo labelfile,
List **tablespaces, StringInfo tblspcmapfile, bool infotbssize,
bool needtblspcmapfile);
extern XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive,