On Tue, Aug 12, 2014 at 10:59:16AM +0100, Russell Keane wrote:
> > The upgrade works all the way up until the final hurdle where, in the
> > pg_upgrade_utility.log the following statement appears:
> >
> > command: ""C:\Program Files (x86)\PostgreSQL\9.3\bin/initdb"
> > --sync-only "D:\ PostgreSQL\9.3\Data" >> "pg_upgrade_utility.log" 2>&1"
> >
> > syncing data to disk ... initdb: could not open file
> > "D:/PostgreSQL/9.3/Data/
> > pg_upgrade_utility.log": Permission denied
>
> Uh, it would appear you are running pg_upgrade from _inside_ the 9.3 data
> directory. That should work, but it would probably be better to run it in
> another directory where you also have write permission. I think the problem
> is that initdb --sync-only is syncing those files to disk as you are writing
> to the log file.
>
> We have had Windows problems of two processes writing to the same file, but
> that is usually a different error message, e.g.
>
> * For some reason, Windows issues a file-in-use error if we write data to
> * the log file from a non-primary thread just before we create a
> * subprocess that also writes to the same log file. One fix is to sleep
> * for 100ms. A cleaner fix is to write to the log file _after_ the
> * subprocess has completed, so we do this only when writing from a
> * non-primary thread. fflush(), running system() twice, and pre-creating
> * the file do not see to help.
>
> I think that returns a "share violation" error.
I have applied the attached patch for 9.5 which will generate a clearer
error in this case, attached.
--
Bruce Momjian <[email protected]> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ Everyone has their own god. +
diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c
new file mode 100644
index e0a3c6d..2e7c347
*** a/contrib/pg_upgrade/option.c
--- b/contrib/pg_upgrade/option.c
*************** parseCommandLine(int argc, char *argv[])
*** 229,234 ****
--- 229,254 ----
"PGDATAOLD", "-d", "old cluster data resides");
check_required_directory(&new_cluster.pgdata, &new_cluster.pgconfig,
"PGDATANEW", "-D", "new cluster data resides");
+
+ #ifndef WIN32
+ /*
+ * On Windows, initdb --sync-only will fail with a "Permission denied"
+ * error on file pg_upgrade_utility.log if pg_upgrade is run inside
+ * the new cluster directory, so we do a check here.
+ */
+ {
+ char cwd[MAXPGPATH], new_cluster_pgdata[MAXPGPATH];
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("cannot find current directory\n");
+ canonicalize_path(cwd);
+ if (path_is_prefix_of_path(new_cluster_pgdata, cwd))
+ pg_fatal("cannot run pg_upgrade from inside the new cluster data directory on Windows\n");
+ }
+ #endif
}
--
Sent via pgsql-general mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general