mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Remove spclocation field from pg_tablespace
Instead, add a function pg_tablespace_location(oid) used to return the same information, and do this by reading the symbolic link. Doing it this way makes it possible to relocate a tablespace when the database is down by simply changing the symbolic link.
This commit is contained in:
@ -314,8 +314,6 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
|
||||
DirectFunctionCall1(namein, CStringGetDatum(stmt->tablespacename));
|
||||
values[Anum_pg_tablespace_spcowner - 1] =
|
||||
ObjectIdGetDatum(ownerId);
|
||||
values[Anum_pg_tablespace_spclocation - 1] =
|
||||
CStringGetTextDatum(location);
|
||||
nulls[Anum_pg_tablespace_spcacl - 1] = true;
|
||||
nulls[Anum_pg_tablespace_spcoptions - 1] = true;
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <signal.h>
|
||||
#include <dirent.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "catalog/catalog.h"
|
||||
#include "catalog/pg_tablespace.h"
|
||||
@ -261,6 +262,44 @@ pg_tablespace_databases(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* pg_tablespace_location - get location for a tablespace
|
||||
*/
|
||||
Datum
|
||||
pg_tablespace_location(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid tablespaceOid = PG_GETARG_OID(0);
|
||||
char sourcepath[MAXPGPATH];
|
||||
char targetpath[MAXPGPATH];
|
||||
int rllen;
|
||||
|
||||
/*
|
||||
* Return empty string for our two default tablespace
|
||||
*/
|
||||
if (tablespaceOid == DEFAULTTABLESPACE_OID ||
|
||||
tablespaceOid == GLOBALTABLESPACE_OID)
|
||||
PG_RETURN_TEXT_P(cstring_to_text(""));
|
||||
|
||||
#if defined(HAVE_READLINK) || defined(WIN32)
|
||||
/*
|
||||
* Find the location of the tablespace by reading the symbolic link that is
|
||||
* in pg_tblspc/<oid>.
|
||||
*/
|
||||
snprintf(sourcepath, sizeof(sourcepath), "pg_tblspc/%u", tablespaceOid);
|
||||
rllen =readlink(sourcepath, targetpath, sizeof(targetpath));
|
||||
if (rllen < 0 || rllen >= sizeof(targetpath))
|
||||
ereport(ERROR,
|
||||
(errmsg("could not read symbolic link \"%s\": %m", sourcepath)));
|
||||
targetpath[rllen] = '\0';
|
||||
|
||||
PG_RETURN_TEXT_P(cstring_to_text(targetpath));
|
||||
#else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("tablespaces are not supported on this platform")));
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* pg_sleep - delay for N seconds
|
||||
*/
|
||||
|
@ -997,7 +997,16 @@ dumpTablespaces(PGconn *conn)
|
||||
* Get all tablespaces except built-in ones (which we assume are named
|
||||
* pg_xxx)
|
||||
*/
|
||||
if (server_version >= 90000)
|
||||
if (server_version >= 90200)
|
||||
res = executeQuery(conn, "SELECT oid, spcname, "
|
||||
"pg_catalog.pg_get_userbyid(spcowner) AS spcowner, "
|
||||
"pg_catalog.pg_tablespace_location(oid), spcacl, "
|
||||
"array_to_string(spcoptions, ', '),"
|
||||
"pg_catalog.shobj_description(oid, 'pg_tablespace') "
|
||||
"FROM pg_catalog.pg_tablespace "
|
||||
"WHERE spcname !~ '^pg_' "
|
||||
"ORDER BY 1");
|
||||
else if (server_version >= 90000)
|
||||
res = executeQuery(conn, "SELECT oid, spcname, "
|
||||
"pg_catalog.pg_get_userbyid(spcowner) AS spcowner, "
|
||||
"spclocation, spcacl, "
|
||||
|
@ -139,13 +139,22 @@ describeTablespaces(const char *pattern, bool verbose)
|
||||
|
||||
initPQExpBuffer(&buf);
|
||||
|
||||
printfPQExpBuffer(&buf,
|
||||
"SELECT spcname AS \"%s\",\n"
|
||||
" pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n"
|
||||
" spclocation AS \"%s\"",
|
||||
gettext_noop("Name"),
|
||||
gettext_noop("Owner"),
|
||||
gettext_noop("Location"));
|
||||
if (pset.sversion >= 90200)
|
||||
printfPQExpBuffer(&buf,
|
||||
"SELECT spcname AS \"%s\",\n"
|
||||
" pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n"
|
||||
" pg_catalog.pg_tablespace_location(oid) AS \"%s\"",
|
||||
gettext_noop("Name"),
|
||||
gettext_noop("Owner"),
|
||||
gettext_noop("Location"));
|
||||
else
|
||||
printfPQExpBuffer(&buf,
|
||||
"SELECT spcname AS \"%s\",\n"
|
||||
" pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n"
|
||||
" spclocation AS \"%s\"",
|
||||
gettext_noop("Name"),
|
||||
gettext_noop("Owner"),
|
||||
gettext_noop("Location"));
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
|
@ -53,6 +53,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 201112061
|
||||
#define CATALOG_VERSION_NO 201112071
|
||||
|
||||
#endif
|
||||
|
@ -2686,6 +2686,9 @@ DESCR("statistics: reset collected statistics for a single table or index in the
|
||||
DATA(insert OID = 3777 ( pg_stat_reset_single_function_counters PGNSP PGUID 12 1 0 0 0 f f f f f v 1 0 2278 "26" _null_ _null_ _null_ _null_ pg_stat_reset_single_function_counters _null_ _null_ _null_ ));
|
||||
DESCR("statistics: reset collected statistics for a single function in the current database");
|
||||
|
||||
DATA(insert OID = 3778 ( pg_tablespace_location PGNSP PGUID 12 1 0 0 0 f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ pg_tablespace_location _null_ _null_ _null_ ));
|
||||
DESCR("tablespace location");
|
||||
|
||||
DATA(insert OID = 1946 ( encode PGNSP PGUID 12 1 0 0 0 f f f t f i 2 0 25 "17 25" _null_ _null_ _null_ _null_ binary_encode _null_ _null_ _null_ ));
|
||||
DESCR("convert bytea value into some ascii-only text string");
|
||||
DATA(insert OID = 1947 ( decode PGNSP PGUID 12 1 0 0 0 f f f t f i 2 0 17 "25 25" _null_ _null_ _null_ _null_ binary_decode _null_ _null_ _null_ ));
|
||||
|
@ -32,7 +32,6 @@ CATALOG(pg_tablespace,1213) BKI_SHARED_RELATION
|
||||
{
|
||||
NameData spcname; /* tablespace name */
|
||||
Oid spcowner; /* owner of tablespace */
|
||||
text spclocation; /* physical location (VAR LENGTH) */
|
||||
aclitem spcacl[1]; /* access permissions (VAR LENGTH) */
|
||||
text spcoptions[1]; /* per-tablespace options */
|
||||
} FormData_pg_tablespace;
|
||||
@ -49,15 +48,14 @@ typedef FormData_pg_tablespace *Form_pg_tablespace;
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
#define Natts_pg_tablespace 5
|
||||
#define Natts_pg_tablespace 4
|
||||
#define Anum_pg_tablespace_spcname 1
|
||||
#define Anum_pg_tablespace_spcowner 2
|
||||
#define Anum_pg_tablespace_spclocation 3
|
||||
#define Anum_pg_tablespace_spcacl 4
|
||||
#define Anum_pg_tablespace_spcoptions 5
|
||||
#define Anum_pg_tablespace_spcacl 3
|
||||
#define Anum_pg_tablespace_spcoptions 4
|
||||
|
||||
DATA(insert OID = 1663 ( pg_default PGUID "" _null_ _null_ ));
|
||||
DATA(insert OID = 1664 ( pg_global PGUID "" _null_ _null_ ));
|
||||
DATA(insert OID = 1663 ( pg_default PGUID _null_ _null_ ));
|
||||
DATA(insert OID = 1664 ( pg_global PGUID _null_ _null_ ));
|
||||
|
||||
#define DEFAULTTABLESPACE_OID 1663
|
||||
#define GLOBALTABLESPACE_OID 1664
|
||||
|
@ -469,6 +469,7 @@ extern Datum pg_cancel_backend(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_terminate_backend(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_reload_conf(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_tablespace_location(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_sleep(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_get_keywords(PG_FUNCTION_ARGS);
|
||||
|
Reference in New Issue
Block a user