mirror of
https://github.com/postgres/postgres.git
synced 2025-08-28 18:48:04 +03:00
Fix pg_rewind when pg_xlog is a symlink.
pg_xlog is often a symlink, typically to a different filesystem. Don't get confused and comlain about by that, and just always pretend that it's a normal directory, even if it's really a symlink. Also add a test case for this. Backpatch to 9.5.
This commit is contained in:
@@ -78,6 +78,14 @@ process_source_file(const char *path, file_type_t type, size_t newsize,
|
||||
strcmp(path, "postmaster.opts") == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Pretend that pg_xlog is a directory, even if it's really a symlink.
|
||||
* We don't want to mess with the symlink itself, nor complain if it's a
|
||||
* symlink in source but not in target or vice versa.
|
||||
*/
|
||||
if (strcmp(path, "pg_xlog") == 0 && type == FILE_TYPE_SYMLINK)
|
||||
type = FILE_TYPE_DIRECTORY;
|
||||
|
||||
/*
|
||||
* Skip temporary files, .../pgsql_tmp/... and .../pgsql_tmp.* in source.
|
||||
* This has the effect that all temporary files in the destination will be
|
||||
@@ -112,7 +120,7 @@ process_source_file(const char *path, file_type_t type, size_t newsize,
|
||||
switch (type)
|
||||
{
|
||||
case FILE_TYPE_DIRECTORY:
|
||||
if (exists && !S_ISDIR(statbuf.st_mode))
|
||||
if (exists && !S_ISDIR(statbuf.st_mode) && strcmp(path, "pg_xlog") != 0)
|
||||
{
|
||||
/* it's a directory in source, but not in target. Strange.. */
|
||||
pg_fatal("\"%s\" is not a directory\n", localpath);
|
||||
@@ -285,6 +293,12 @@ process_target_file(const char *path, file_type_t type, size_t oldsize,
|
||||
strcmp(path, "postmaster.opts") == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Like in process_source_file, pretend that xlog is always a directory.
|
||||
*/
|
||||
if (strcmp(path, "pg_xlog") == 0 && type == FILE_TYPE_SYMLINK)
|
||||
type = FILE_TYPE_DIRECTORY;
|
||||
|
||||
key.path = (char *) path;
|
||||
key_ptr = &key;
|
||||
exists = (bsearch(&key_ptr, map->array, map->narray, sizeof(file_entry_t *),
|
||||
|
Reference in New Issue
Block a user