]> granicus.if.org Git - postgresql/commitdiff
Fix unobvious interaction between -X switch and subdirectory creation.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 7 Jan 2016 23:20:57 +0000 (18:20 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 7 Jan 2016 23:20:57 +0000 (18:20 -0500)
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 ...)

src/bin/initdb/initdb.c

index bfd29c0c60fb5ba46b2ec60b5f1a90602975b1cc..ed3ba7b6248156502e701aadb2e346c00e62c4dc 100644 (file)
@@ -193,7 +193,6 @@ static const char *backend_options = "--single -F -O -j -c search_path=pg_catalo
 
 static const char *const subdirs[] = {
        "global",
-       "pg_xlog",
        "pg_xlog/archive_status",
        "pg_clog",
        "pg_commit_ts",
@@ -280,7 +279,7 @@ void                setup_locale_encoding(void);
 void           setup_signals(void);
 void           setup_text_search(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           initialize_data_directory(void);
 
@@ -2948,13 +2947,17 @@ create_data_directory(void)
 }
 
 
+/* Create transaction log directory, and symlink if required */
 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)
        {
-               char       *linkloc;
                int                     ret;
 
                /* clean up xlog directory name, check it's absolute */
@@ -3027,22 +3030,30 @@ create_xlog_symlink(void)
                                exit_nicely();
                }
 
-               /* form name of the place where the symlink must go */
-               linkloc = psprintf("%s/pg_xlog", pg_data);
-
 #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"),
-                                       progname, linkloc, strerror(errno));
+                                       progname, subdirloc, strerror(errno));
                        exit_nicely();
                }
 #else
                fprintf(stderr, _("%s: symlinks are not supported on this platform"));
                exit_nicely();
 #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_xlog_symlink();
+       create_xlog_or_symlink();
 
-       /* Create required subdirectories */
+       /* Create required subdirectories (other than pg_xlog) */
        printf(_("creating subdirectories ... "));
        fflush(stdout);