Fix unobvious interaction between -X switch and subdirectory creation.

Turns out the only reason initdb -X worked is that pg_mkdir_p won't
whine if you point it at something that's a symlink to a directory.
Otherwise, the attempt to create pg_xlog/ just like all the other
subdirectories would have failed.  Let's be a little more explicit
about what's happening.  Oversight in my patch for bug #13853
(mea culpa for not testing -X ...)
This commit is contained in:
Tom Lane 2016-01-07 18:20:57 -05:00
parent fa838b555f
commit b41fb65056
1 changed files with 24 additions and 13 deletions

View File

@ -193,7 +193,6 @@ static const char *backend_options = "--single -F -O -j -c search_path=pg_catalo
static const char *const subdirs[] = { static const char *const subdirs[] = {
"global", "global",
"pg_xlog",
"pg_xlog/archive_status", "pg_xlog/archive_status",
"pg_clog", "pg_clog",
"pg_commit_ts", "pg_commit_ts",
@ -280,7 +279,7 @@ void setup_locale_encoding(void);
void setup_signals(void); void setup_signals(void);
void setup_text_search(void); void setup_text_search(void);
void create_data_directory(void); void create_data_directory(void);
void create_xlog_symlink(void); void create_xlog_or_symlink(void);
void warn_on_mount_point(int error); void warn_on_mount_point(int error);
void initialize_data_directory(void); void initialize_data_directory(void);
@ -2948,13 +2947,17 @@ create_data_directory(void)
} }
/* Create transaction log directory, and symlink if required */
void void
create_xlog_symlink(void) create_xlog_or_symlink(void)
{ {
/* Create transaction log symlink, if required */ char *subdirloc;
/* form name of the place for the subdirectory or symlink */
subdirloc = psprintf("%s/pg_xlog", pg_data);
if (strcmp(xlog_dir, "") != 0) if (strcmp(xlog_dir, "") != 0)
{ {
char *linkloc;
int ret; int ret;
/* clean up xlog directory name, check it's absolute */ /* clean up xlog directory name, check it's absolute */
@ -3027,22 +3030,30 @@ create_xlog_symlink(void)
exit_nicely(); exit_nicely();
} }
/* form name of the place where the symlink must go */
linkloc = psprintf("%s/pg_xlog", pg_data);
#ifdef HAVE_SYMLINK #ifdef HAVE_SYMLINK
if (symlink(xlog_dir, linkloc) != 0) if (symlink(xlog_dir, subdirloc) != 0)
{ {
fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"), fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"),
progname, linkloc, strerror(errno)); progname, subdirloc, strerror(errno));
exit_nicely(); exit_nicely();
} }
#else #else
fprintf(stderr, _("%s: symlinks are not supported on this platform")); fprintf(stderr, _("%s: symlinks are not supported on this platform"));
exit_nicely(); exit_nicely();
#endif #endif
free(linkloc);
} }
else
{
/* Without -X option, just make the subdirectory normally */
if (mkdir(subdirloc, S_IRWXU) < 0)
{
fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"),
progname, subdirloc, strerror(errno));
exit_nicely();
}
}
free(subdirloc);
} }
@ -3074,9 +3085,9 @@ initialize_data_directory(void)
create_data_directory(); create_data_directory();
create_xlog_symlink(); create_xlog_or_symlink();
/* Create required subdirectories */ /* Create required subdirectories (other than pg_xlog) */
printf(_("creating subdirectories ... ")); printf(_("creating subdirectories ... "));
fflush(stdout); fflush(stdout);