I've found and fixed a bug that causes recovery (crash recovery, PITR) to fail. Please find attached the patch against HEAD.

To reproduce the problem, do the following on Windows:

1. pg_ctl start
2. CREATE TABLESPACE tbs LOCATION 'some_tblspc_path';
3. pg_ctl stop -mi
4. pg_ctl start

The database server fails to start, leaving the below messages:

LOG: database system was interrupted; last known up at 2013-10-31 20:24:07 JST LOG: database system was not properly shut down; automatic recovery in progress
LOG:  redo starts at 0/1788938
FATAL:  could not remove symbolic link "pg_tblspc/16385": Permission denied
CONTEXT:  xlog redo create tablespace: 16385 "d:/tbs"
LOG:  startup process (PID 2724) exited with exit code 1
LOG:  aborting startup due to startup process failure

In redo, create_tablespace_directories() tries to remove the symbolic link for the tablespace using unlink(). However, unlink() on Windows fails with errno=13 (Permission denied). This is because junction points are directories on Windows.

Follow destroy_tablespace_directories() and use rmdir() to remove the junction point.

I've tested the patch. Could you review it and commit? I wish it to be backported to all major releases.


Attachment: remove_tblspc_symlink.patch
Description: Binary data

Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:

Reply via email to