datadirpathlen = strlen(DataDir);
/* Collect information about all tablespaces */
- tblspcdir = AllocateDir("pg_tblspc");
- while ((de = ReadDir(tblspcdir, "pg_tblspc")) != NULL)
+ tblspcdir = AllocateDir(PG_TBLSPC_DIR);
+ while ((de = ReadDir(tblspcdir, PG_TBLSPC_DIR)) != NULL)
{
- char fullpath[MAXPGPATH + 10];
+ char fullpath[MAXPGPATH + sizeof(PG_TBLSPC_DIR)];
char linkpath[MAXPGPATH];
char *relpath = NULL;
char *s;
if (*badp != '\0' || errno == EINVAL || errno == ERANGE)
continue;
- snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name);
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", PG_TBLSPC_DIR, de->d_name);
de_type = get_dirent_type(fullpath, de, false, ERROR);
* In this case, we store a relative path rather than an
* absolute path into the tablespaceinfo.
*/
- snprintf(linkpath, sizeof(linkpath), "pg_tblspc/%s",
- de->d_name);
+ snprintf(linkpath, sizeof(linkpath), "%s/%s",
+ PG_TBLSPC_DIR, de->d_name);
relpath = pstrdup(linkpath);
}
else
tablespaceinfo *ti = lfirst(lc);
char *linkloc;
- linkloc = psprintf("pg_tblspc/%u", ti->oid);
+ linkloc = psprintf("%s/%u", PG_TBLSPC_DIR, ti->oid);
/*
* Remove the existing symlink if any and Create the symlink
DIR *dir;
struct dirent *de;
- dir = AllocateDir("pg_tblspc");
- while ((de = ReadDir(dir, "pg_tblspc")) != NULL)
+ dir = AllocateDir(PG_TBLSPC_DIR);
+ while ((de = ReadDir(dir, PG_TBLSPC_DIR)) != NULL)
{
- char path[MAXPGPATH + 10];
+ char path[MAXPGPATH + sizeof(PG_TBLSPC_DIR)];
/* Skip entries of non-oid names */
if (strspn(de->d_name, "0123456789") != strlen(de->d_name))
continue;
- snprintf(path, sizeof(path), "pg_tblspc/%s", de->d_name);
+ snprintf(path, sizeof(path), "%s/%s", PG_TBLSPC_DIR, de->d_name);
if (get_dirent_type(path, de, false, ERROR) != PGFILETYPE_LNK)
ereport(allow_in_place_tablespaces ? WARNING : PANIC,
(errcode(ERRCODE_DATA_CORRUPTED),
errmsg("unexpected directory entry \"%s\" found in %s",
- de->d_name, "pg_tblspc/"),
- errdetail("All directory entries in pg_tblspc/ should be symbolic links."),
+ de->d_name, PG_TBLSPC_DIR),
+ errdetail("All directory entries in %s/ should be symbolic links.",
+ PG_TBLSPC_DIR),
errhint("Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete.")));
}
}
#include "access/xlog.h"
#include "backup/backup_manifest.h"
#include "backup/basebackup_sink.h"
+#include "common/relpath.h"
#include "mb/pg_wchar.h"
#include "utils/builtins.h"
#include "utils/json.h"
*/
if (OidIsValid(spcoid))
{
- snprintf(pathbuf, sizeof(pathbuf), "pg_tblspc/%u/%s", spcoid,
+ snprintf(pathbuf, sizeof(pathbuf), "%s/%u/%s", PG_TBLSPC_DIR, spcoid,
pathname);
pathname = pathbuf;
}
if (OidIsValid(spcoid))
{
relspcoid = spcoid;
- lookup_path = psprintf("pg_tblspc/%u/%s", spcoid,
+ lookup_path = psprintf("%s/%u/%s", PG_TBLSPC_DIR, spcoid,
tarfilename);
}
else
if (stat(path, &st) == 0)
return;
- if (only_tblspc && strstr(path, "pg_tblspc/") == NULL)
+ if (only_tblspc && strstr(path, PG_TBLSPC_DIR_SLASH) == NULL)
elog(PANIC, "requested to created invalid directory: %s", path);
if (reachedConsistency && !allow_in_place_tablespaces)
struct stat st;
bool in_place;
- linkloc = psprintf("pg_tblspc/%u", tablespaceoid);
+ linkloc = psprintf("%s/%u", PG_TBLSPC_DIR, tablespaceoid);
/*
* If we're asked to make an 'in place' tablespace, create the directory
char *subfile;
struct stat st;
- linkloc_with_version_dir = psprintf("pg_tblspc/%u/%s", tablespaceoid,
+ linkloc_with_version_dir = psprintf("%s/%u/%s", PG_TBLSPC_DIR, tablespaceoid,
TABLESPACE_VERSION_DIRECTORY);
/*
else
{
/* All other tablespaces are accessed via symlinks */
- snprintf(path, MAXPGPATH, "pg_tblspc/%u/%s/%s",
- tablespace, TABLESPACE_VERSION_DIRECTORY,
+ snprintf(path, MAXPGPATH, "%s/%u/%s/%s",
+ PG_TBLSPC_DIR, tablespace, TABLESPACE_VERSION_DIRECTORY,
PG_TEMP_FILES_DIR);
}
}
void
RemovePgTempFiles(void)
{
- char temp_path[MAXPGPATH + 10 + sizeof(TABLESPACE_VERSION_DIRECTORY) + sizeof(PG_TEMP_FILES_DIR)];
+ char temp_path[MAXPGPATH + sizeof(PG_TBLSPC_DIR) + sizeof(TABLESPACE_VERSION_DIRECTORY) + sizeof(PG_TEMP_FILES_DIR)];
DIR *spc_dir;
struct dirent *spc_de;
/*
* Cycle through temp directories for all non-default tablespaces.
*/
- spc_dir = AllocateDir("pg_tblspc");
+ spc_dir = AllocateDir(PG_TBLSPC_DIR);
- while ((spc_de = ReadDirExtended(spc_dir, "pg_tblspc", LOG)) != NULL)
+ while ((spc_de = ReadDirExtended(spc_dir, PG_TBLSPC_DIR, LOG)) != NULL)
{
if (strcmp(spc_de->d_name, ".") == 0 ||
strcmp(spc_de->d_name, "..") == 0)
continue;
- snprintf(temp_path, sizeof(temp_path), "pg_tblspc/%s/%s/%s",
- spc_de->d_name, TABLESPACE_VERSION_DIRECTORY, PG_TEMP_FILES_DIR);
+ snprintf(temp_path, sizeof(temp_path), "%s/%s/%s/%s",
+ PG_TBLSPC_DIR, spc_de->d_name, TABLESPACE_VERSION_DIRECTORY,
+ PG_TEMP_FILES_DIR);
RemovePgTempFilesInDir(temp_path, true, false);
- snprintf(temp_path, sizeof(temp_path), "pg_tblspc/%s/%s",
- spc_de->d_name, TABLESPACE_VERSION_DIRECTORY);
+ snprintf(temp_path, sizeof(temp_path), "%s/%s/%s",
+ PG_TBLSPC_DIR, spc_de->d_name, TABLESPACE_VERSION_DIRECTORY);
RemovePgTempRelationFiles(temp_path);
}
/* Sync the top level pgdata directory. */
do_syncfs(".");
/* If any tablespaces are configured, sync each of those. */
- dir = AllocateDir("pg_tblspc");
- while ((de = ReadDirExtended(dir, "pg_tblspc", LOG)))
+ dir = AllocateDir(PG_TBLSPC_DIR);
+ while ((de = ReadDirExtended(dir, PG_TBLSPC_DIR, LOG)))
{
char path[MAXPGPATH];
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
continue;
- snprintf(path, MAXPGPATH, "pg_tblspc/%s", de->d_name);
+ snprintf(path, MAXPGPATH, "%s/%s", PG_TBLSPC_DIR, de->d_name);
do_syncfs(path);
}
FreeDir(dir);
walkdir(".", pre_sync_fname, false, DEBUG1);
if (xlog_is_symlink)
walkdir("pg_wal", pre_sync_fname, false, DEBUG1);
- walkdir("pg_tblspc", pre_sync_fname, true, DEBUG1);
+ walkdir(PG_TBLSPC_DIR, pre_sync_fname, true, DEBUG1);
#endif
/* Prepare to report progress syncing the data directory via fsync. */
walkdir(".", datadir_fsync_fname, false, LOG);
if (xlog_is_symlink)
walkdir("pg_wal", datadir_fsync_fname, false, LOG);
- walkdir("pg_tblspc", datadir_fsync_fname, true, LOG);
+ walkdir(PG_TBLSPC_DIR, datadir_fsync_fname, true, LOG);
}
/*
void
ResetUnloggedRelations(int op)
{
- char temp_path[MAXPGPATH + 10 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
+ char temp_path[MAXPGPATH + sizeof(PG_TBLSPC_DIR) + sizeof(TABLESPACE_VERSION_DIRECTORY)];
DIR *spc_dir;
struct dirent *spc_de;
MemoryContext tmpctx,
/*
* Cycle through directories for all non-default tablespaces.
*/
- spc_dir = AllocateDir("pg_tblspc");
+ spc_dir = AllocateDir(PG_TBLSPC_DIR);
- while ((spc_de = ReadDir(spc_dir, "pg_tblspc")) != NULL)
+ while ((spc_de = ReadDir(spc_dir, PG_TBLSPC_DIR)) != NULL)
{
if (strcmp(spc_de->d_name, ".") == 0 ||
strcmp(spc_de->d_name, "..") == 0)
continue;
- snprintf(temp_path, sizeof(temp_path), "pg_tblspc/%s/%s",
- spc_de->d_name, TABLESPACE_VERSION_DIRECTORY);
+ snprintf(temp_path, sizeof(temp_path), "%s/%s/%s",
+ PG_TBLSPC_DIR, spc_de->d_name, TABLESPACE_VERSION_DIRECTORY);
ResetUnloggedRelationsInTablespaceDir(temp_path, op);
}
totalsize = db_dir_size(pathname);
/* Scan the non-default tablespaces */
- snprintf(dirpath, MAXPGPATH, "pg_tblspc");
+ snprintf(dirpath, MAXPGPATH, PG_TBLSPC_DIR);
dirdesc = AllocateDir(dirpath);
while ((direntry = ReadDir(dirdesc, dirpath)) != NULL)
strcmp(direntry->d_name, "..") == 0)
continue;
- snprintf(pathname, sizeof(pathname), "pg_tblspc/%s/%s/%u",
- direntry->d_name, TABLESPACE_VERSION_DIRECTORY, dbOid);
+ snprintf(pathname, sizeof(pathname), "%s/%s/%s/%u",
+ PG_TBLSPC_DIR, direntry->d_name, TABLESPACE_VERSION_DIRECTORY, dbOid);
totalsize += db_dir_size(pathname);
}
else if (tblspcOid == GLOBALTABLESPACE_OID)
snprintf(tblspcPath, MAXPGPATH, "global");
else
- snprintf(tblspcPath, MAXPGPATH, "pg_tblspc/%u/%s", tblspcOid,
+ snprintf(tblspcPath, MAXPGPATH, "%s/%u/%s", PG_TBLSPC_DIR, tblspcOid,
TABLESPACE_VERSION_DIRECTORY);
dirdesc = AllocateDir(tblspcPath);
if (tablespaceOid == DEFAULTTABLESPACE_OID)
location = "base";
else
- location = psprintf("pg_tblspc/%u/%s", tablespaceOid,
+ location = psprintf("%s/%u/%s", PG_TBLSPC_DIR, tablespaceOid,
TABLESPACE_VERSION_DIRECTORY);
dirdesc = AllocateDir(location);
* Find the location of the tablespace by reading the symbolic link that
* is in pg_tblspc/.
*/
- snprintf(sourcepath, sizeof(sourcepath), "pg_tblspc/%u", tablespaceOid);
+ snprintf(sourcepath, sizeof(sourcepath), "%s/%u", PG_TBLSPC_DIR, tablespaceOid);
/*
* Before reading the link, check if the source path is a link or a
void
RelationCacheInitFileRemove(void)
{
- const char *tblspcdir = "pg_tblspc";
+ const char *tblspcdir = PG_TBLSPC_DIR;
DIR *dir;
struct dirent *de;
- char path[MAXPGPATH + 10 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
+ char path[MAXPGPATH + sizeof(PG_TBLSPC_DIR) + sizeof(TABLESPACE_VERSION_DIRECTORY)];
snprintf(path, sizeof(path), "global/%s",
RELCACHE_INIT_FILENAME);
* is valid, resolving the linked locations and dive into them
* directly.
*/
- if (strncmp("pg_tblspc", subdir, strlen("pg_tblspc")) == 0)
+ if (strncmp(PG_TBLSPC_DIR, subdir, strlen(PG_TBLSPC_DIR)) == 0)
{
char tblspc_path[MAXPGPATH];
struct stat tblspc_st;
{
total_size = scan_directory(DataDir, "global", true);
total_size += scan_directory(DataDir, "base", true);
- total_size += scan_directory(DataDir, "pg_tblspc", true);
+ total_size += scan_directory(DataDir, PG_TBLSPC_DIR, true);
}
(void) scan_directory(DataDir, "global", false);
(void) scan_directory(DataDir, "base", false);
- (void) scan_directory(DataDir, "pg_tblspc", false);
+ (void) scan_directory(DataDir, PG_TBLSPC_DIR, false);
if (showprogress)
progress_report(true);
{
char linkpath[MAXPGPATH];
- snprintf(linkpath, MAXPGPATH, "%s/pg_tblspc/%u", opt.output,
+ snprintf(linkpath, MAXPGPATH, "%s/%s/%u", opt.output, PG_TBLSPC_DIR,
ts->oid);
if (opt.dry_run)
is_incremental_dir = true;
else if (relative_path != NULL)
{
- is_pg_tblspc = strcmp(relative_path, "pg_tblspc") == 0;
+ is_pg_tblspc = strcmp(relative_path, PG_TBLSPC_DIR) == 0;
is_pg_wal = (strcmp(relative_path, "pg_wal") == 0 ||
strncmp(relative_path, "pg_wal/", 7) == 0);
is_incremental_dir = strncmp(relative_path, "base/", 5) == 0 ||
strcmp(relative_path, "global") == 0 ||
- strncmp(relative_path, "pg_tblspc/", 10) == 0;
+ strncmp(relative_path, PG_TBLSPC_DIR_SLASH, 10) == 0;
}
/*
strlcpy(ifulldir, input_directory, MAXPGPATH);
strlcpy(ofulldir, output_directory, MAXPGPATH);
if (OidIsValid(tsoid))
- snprintf(manifest_prefix, MAXPGPATH, "pg_tblspc/%u/", tsoid);
+ snprintf(manifest_prefix, MAXPGPATH, "%s/%u/", PG_TBLSPC_DIR, tsoid);
else
manifest_prefix[0] = '\0';
}
snprintf(ofulldir, MAXPGPATH, "%s/%s", output_directory,
relative_path);
if (OidIsValid(tsoid))
- snprintf(manifest_prefix, MAXPGPATH, "pg_tblspc/%u/%s/",
- tsoid, relative_path);
+ snprintf(manifest_prefix, MAXPGPATH, "%s/%u/%s/",
+ PG_TBLSPC_DIR, tsoid, relative_path);
else
snprintf(manifest_prefix, MAXPGPATH, "%s/", relative_path);
}
struct dirent *de;
cb_tablespace *tslist = NULL;
- snprintf(pg_tblspc, MAXPGPATH, "%s/pg_tblspc", pathname);
+ snprintf(pg_tblspc, MAXPGPATH, "%s/%s", pathname, PG_TBLSPC_DIR);
pg_log_debug("scanning \"%s\"", pg_tblspc);
if ((dir = opendir(pg_tblspc)) == NULL)
* we just record the paths within the data directories.
*/
snprintf(ts->old_dir, MAXPGPATH, "%s/%s", pg_tblspc, de->d_name);
- snprintf(ts->new_dir, MAXPGPATH, "%s/pg_tblspc/%s", opt->output,
- de->d_name);
+ snprintf(ts->new_dir, MAXPGPATH, "%s/%s/%s", opt->output,
+ PG_TBLSPC_DIR, de->d_name);
ts->in_place = true;
}
* to process all the tablespaces. We also follow a symlink if
* it's for pg_wal. Symlinks elsewhere are ignored.
*/
- if ((parentpath && strcmp(parentpath, "pg_tblspc") == 0) ||
+ if ((parentpath && strcmp(parentpath, PG_TBLSPC_DIR) == 0) ||
strcmp(path, "pg_wal") == 0)
recurse_dir(datadir, path, callback);
}
check_single_dir(pg_data, "global");
check_single_dir(pg_data, "pg_multixact");
check_single_dir(pg_data, "pg_subtrans");
- check_single_dir(pg_data, "pg_tblspc");
+ check_single_dir(pg_data, PG_TBLSPC_DIR);
check_single_dir(pg_data, "pg_twophase");
/* pg_xlog has been renamed to pg_wal in v10 */
#ifdef FRONTEND
#include "common/logging.h"
#endif
+#include "common/relpath.h"
#include "port/pg_iovec.h"
#ifdef FRONTEND
/* handle renaming of pg_xlog to pg_wal in post-10 clusters */
snprintf(pg_wal, MAXPGPATH, "%s/%s", pg_data,
serverVersion < MINIMUM_VERSION_FOR_PG_WAL ? "pg_xlog" : "pg_wal");
- snprintf(pg_tblspc, MAXPGPATH, "%s/pg_tblspc", pg_data);
+ snprintf(pg_tblspc, MAXPGPATH, "%s/%s", pg_data, PG_TBLSPC_DIR);
/*
* If pg_wal is a symlink, we'll need to recurse into it separately,
else
{
/* All other tablespaces are accessed via symlinks */
- return psprintf("pg_tblspc/%u/%s/%u",
- spcOid, TABLESPACE_VERSION_DIRECTORY, dbOid);
+ return psprintf("%s/%u/%s/%u",
+ PG_TBLSPC_DIR, spcOid,
+ TABLESPACE_VERSION_DIRECTORY, dbOid);
}
}
if (procNumber == INVALID_PROC_NUMBER)
{
if (forkNumber != MAIN_FORKNUM)
- path = psprintf("pg_tblspc/%u/%s/%u/%u_%s",
- spcOid, TABLESPACE_VERSION_DIRECTORY,
+ path = psprintf("%s/%u/%s/%u/%u_%s",
+ PG_TBLSPC_DIR, spcOid,
+ TABLESPACE_VERSION_DIRECTORY,
dbOid, relNumber,
forkNames[forkNumber]);
else
- path = psprintf("pg_tblspc/%u/%s/%u/%u",
- spcOid, TABLESPACE_VERSION_DIRECTORY,
+ path = psprintf("%s/%u/%s/%u/%u",
+ PG_TBLSPC_DIR, spcOid,
+ TABLESPACE_VERSION_DIRECTORY,
dbOid, relNumber);
}
else
{
if (forkNumber != MAIN_FORKNUM)
- path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u_%s",
- spcOid, TABLESPACE_VERSION_DIRECTORY,
+ path = psprintf("%s/%u/%s/%u/t%d_%u_%s",
+ PG_TBLSPC_DIR, spcOid,
+ TABLESPACE_VERSION_DIRECTORY,
dbOid, procNumber, relNumber,
forkNames[forkNumber]);
else
- path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u",
- spcOid, TABLESPACE_VERSION_DIRECTORY,
+ path = psprintf("%s/%u/%s/%u/t%d_%u",
+ PG_TBLSPC_DIR, spcOid,
+ TABLESPACE_VERSION_DIRECTORY,
dbOid, procNumber, relNumber);
}
}
#define TABLESPACE_VERSION_DIRECTORY "PG_" PG_MAJORVERSION "_" \
CppAsString2(CATALOG_VERSION_NO)
+/*
+ * Tablespace path (relative to installation's $PGDATA).
+ *
+ * These values should not be changed as many tools rely on it.
+ */
+#define PG_TBLSPC_DIR "pg_tblspc"
+#define PG_TBLSPC_DIR_SLASH "pg_tblspc/" /* required for strings
+ * comparisons */
+
/* Characters to allow for an OID in a relation path */
#define OIDCHARS 10 /* max chars printed by %u */