I noticed by the following report, PostgreSQL can share the same
directory as tablespaces of two servers with different


8.4 checked that the tablespace location is empty, but from 9.0,
the check is replaced with creating a PG_PGVER_CATVER
subdirectory. This works for multiple servers with the same
version, but don't for servers with different versions.

This is apparently a bug but doesn't cause any other problem
immediately. If we choose not to do this, the documentaion needs
to be edited instead.


| The location must be an existing, empty directory that is owned
| by the PostgreSQL operating system user.


Kyotaro Horiguchi
NTT Open Source Software Center
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index f9c2620..6a89be1 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -606,23 +606,21 @@ create_tablespace_directories(const char *location, const Oid tablespaceoid)
-	 * The creation of the version directory prevents more than one tablespace
-	 * in a single location.
+	 * Check the target directory is empty.
+	if (!directory_is_empty(location))
+		ereport(ERROR,
+				(errcode(ERRCODE_OBJECT_IN_USE),
+				 errmsg("directory \"%s\" is not empty",
+						location)));
 	if (mkdir(location_with_version_dir, S_IRWXU) < 0)
-	{
-		if (errno == EEXIST)
-			ereport(ERROR,
-					(errcode(ERRCODE_OBJECT_IN_USE),
-					 errmsg("directory \"%s\" already in use as a tablespace",
-							location_with_version_dir)));
-		else
-			ereport(ERROR,
-					(errcode_for_file_access(),
-					 errmsg("could not create directory \"%s\": %m",
-							location_with_version_dir)));
-	}
+		ereport(ERROR,
+				(errcode_for_file_access(),
+				 errmsg("could not create directory \"%s\": %m",
+						location_with_version_dir)));
 	 * In recovery, remove old symlink, in case it points to the wrong place.
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:

Reply via email to