mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Tablespaces. Alternate database locations are dead, long live tablespaces.
There are various things left to do: contrib dbsize and oid2name modules need work, and so does the documentation. Also someone should think about COMMENT ON TABLESPACE and maybe RENAME TABLESPACE. Also initlocation is dead, it just doesn't know it yet. Gavin Sherry and Tom Lane.
This commit is contained in:
27
src/backend/utils/cache/inval.c
vendored
27
src/backend/utils/cache/inval.c
vendored
@ -74,7 +74,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/cache/inval.c,v 1.61 2004/05/06 16:10:57 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/cache/inval.c,v 1.62 2004/06/18 06:13:52 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -308,7 +308,7 @@ AddRelcacheInvalidationMessage(InvalidationListHeader *hdr,
|
||||
/* We assume dbId need not be checked because it will never change */
|
||||
/* relfilenode fields must be checked to support reassignment */
|
||||
ProcessMessageList(hdr->rclist,
|
||||
if (msg->rc.relId == relId &&
|
||||
if (msg->rc.relId == relId &&
|
||||
RelFileNodeEquals(msg->rc.physId, physId)) return);
|
||||
|
||||
/* OK, add the item */
|
||||
@ -555,14 +555,18 @@ PrepareForTupleInvalidation(Relation relation, HeapTuple tuple,
|
||||
databaseId = InvalidOid;
|
||||
else
|
||||
databaseId = MyDatabaseId;
|
||||
rnode.tblNode = databaseId; /* XXX change for tablespaces */
|
||||
if (classtup->reltablespace)
|
||||
rnode.spcNode = classtup->reltablespace;
|
||||
else
|
||||
rnode.spcNode = MyDatabaseTableSpace;
|
||||
rnode.dbNode = databaseId;
|
||||
rnode.relNode = classtup->relfilenode;
|
||||
/*
|
||||
* Note: during a pg_class row update that assigns a new relfilenode
|
||||
* value, we will be called on both the old and new tuples, and thus
|
||||
* will broadcast invalidation messages showing both the old and new
|
||||
* relfilenode values. This ensures that other backends will close
|
||||
* smgr references to the old relfilenode file.
|
||||
* or reltablespace value, we will be called on both the old and new
|
||||
* tuples, and thus will broadcast invalidation messages showing both
|
||||
* the old and new RelFileNode values. This ensures that other
|
||||
* backends will close smgr references to the old file.
|
||||
*/
|
||||
}
|
||||
else if (tupleRelId == RelOid_pg_attribute)
|
||||
@ -580,7 +584,8 @@ PrepareForTupleInvalidation(Relation relation, HeapTuple tuple,
|
||||
*/
|
||||
databaseId = MyDatabaseId;
|
||||
/* We assume no smgr cache flush is needed, either */
|
||||
rnode.tblNode = InvalidOid;
|
||||
rnode.spcNode = InvalidOid;
|
||||
rnode.dbNode = InvalidOid;
|
||||
rnode.relNode = InvalidOid;
|
||||
}
|
||||
else
|
||||
@ -760,7 +765,11 @@ CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
|
||||
databaseId = InvalidOid;
|
||||
else
|
||||
databaseId = MyDatabaseId;
|
||||
rnode.tblNode = databaseId; /* XXX change for tablespaces */
|
||||
if (classtup->reltablespace)
|
||||
rnode.spcNode = classtup->reltablespace;
|
||||
else
|
||||
rnode.spcNode = MyDatabaseTableSpace;
|
||||
rnode.dbNode = databaseId;
|
||||
rnode.relNode = classtup->relfilenode;
|
||||
|
||||
RegisterRelcacheInvalidation(databaseId, relationId, rnode);
|
||||
|
58
src/backend/utils/cache/lsyscache.c
vendored
58
src/backend/utils/cache/lsyscache.c
vendored
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.113 2004/06/06 00:41:27 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.114 2004/06/18 06:13:52 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Eventually, the index information should go through here, too.
|
||||
@ -985,6 +985,34 @@ get_rel_namespace(Oid relid)
|
||||
return InvalidOid;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_rel_tablespace
|
||||
* Returns the pg_tablespace OID associated with a given relation.
|
||||
*
|
||||
* Note: failure return is InvalidOid, which cannot be distinguished from
|
||||
* "default tablespace for this database", but that seems OK.
|
||||
*/
|
||||
Oid
|
||||
get_rel_tablespace(Oid relid)
|
||||
{
|
||||
HeapTuple tp;
|
||||
|
||||
tp = SearchSysCache(RELOID,
|
||||
ObjectIdGetDatum(relid),
|
||||
0, 0, 0);
|
||||
if (HeapTupleIsValid(tp))
|
||||
{
|
||||
Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
|
||||
Oid result;
|
||||
|
||||
result = reltup->reltablespace;
|
||||
ReleaseSysCache(tp);
|
||||
return result;
|
||||
}
|
||||
else
|
||||
return InvalidOid;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_rel_type_id
|
||||
*
|
||||
@ -1980,6 +2008,34 @@ get_namespace_name(Oid nspid)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_namespace_tablespace
|
||||
* Returns the default tablespace of a given namespace
|
||||
*
|
||||
* Note: failure return is InvalidOid, which cannot be distinguished from
|
||||
* "default tablespace for this database", but that seems OK.
|
||||
*/
|
||||
Oid
|
||||
get_namespace_tablespace(Oid nspid)
|
||||
{
|
||||
HeapTuple tp;
|
||||
|
||||
tp = SearchSysCache(NAMESPACEOID,
|
||||
ObjectIdGetDatum(nspid),
|
||||
0, 0, 0);
|
||||
if (HeapTupleIsValid(tp))
|
||||
{
|
||||
Form_pg_namespace nsptup = (Form_pg_namespace) GETSTRUCT(tp);
|
||||
Oid result;
|
||||
|
||||
result = nsptup->nsptablespace;
|
||||
ReleaseSysCache(tp);
|
||||
return result;
|
||||
}
|
||||
else
|
||||
return InvalidOid;
|
||||
}
|
||||
|
||||
/* ---------- PG_SHADOW CACHE ---------- */
|
||||
|
||||
/*
|
||||
|
73
src/backend/utils/cache/relcache.c
vendored
73
src/backend/utils/cache/relcache.c
vendored
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.204 2004/05/30 23:40:37 neilc Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.205 2004/06/18 06:13:52 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -260,6 +260,7 @@ static void RelationBuildTupleDesc(RelationBuildDescInfo buildinfo,
|
||||
Relation relation);
|
||||
static Relation RelationBuildDesc(RelationBuildDescInfo buildinfo,
|
||||
Relation oldrelation);
|
||||
static void RelationInitPhysicalAddr(Relation relation);
|
||||
static void AttrDefaultFetch(Relation relation);
|
||||
static void CheckConstraintFetch(Relation relation);
|
||||
static List *insert_ordered_oid(List *list, Oid datum);
|
||||
@ -873,11 +874,10 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo,
|
||||
*/
|
||||
RelationInitLockInfo(relation); /* see lmgr.c */
|
||||
|
||||
if (relation->rd_rel->relisshared)
|
||||
relation->rd_node.tblNode = InvalidOid;
|
||||
else
|
||||
relation->rd_node.tblNode = MyDatabaseId;
|
||||
relation->rd_node.relNode = relation->rd_rel->relfilenode;
|
||||
/*
|
||||
* initialize physical addressing information for the relation
|
||||
*/
|
||||
RelationInitPhysicalAddr(relation);
|
||||
|
||||
/* make sure relation is marked as having no open file yet */
|
||||
relation->rd_smgr = NULL;
|
||||
@ -892,6 +892,23 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo,
|
||||
return relation;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the physical addressing info (RelFileNode) for a relcache entry
|
||||
*/
|
||||
static void
|
||||
RelationInitPhysicalAddr(Relation relation)
|
||||
{
|
||||
if (relation->rd_rel->reltablespace)
|
||||
relation->rd_node.spcNode = relation->rd_rel->reltablespace;
|
||||
else
|
||||
relation->rd_node.spcNode = MyDatabaseTableSpace;
|
||||
if (relation->rd_rel->relisshared)
|
||||
relation->rd_node.dbNode = InvalidOid;
|
||||
else
|
||||
relation->rd_node.dbNode = MyDatabaseId;
|
||||
relation->rd_node.relNode = relation->rd_rel->relfilenode;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize index-access-method support data for an index relation
|
||||
*/
|
||||
@ -1343,18 +1360,17 @@ formrdesc(const char *relationName,
|
||||
* initialize relation id from info in att array (my, this is ugly)
|
||||
*/
|
||||
RelationGetRelid(relation) = relation->rd_att->attrs[0]->attrelid;
|
||||
relation->rd_rel->relfilenode = RelationGetRelid(relation);
|
||||
|
||||
/*
|
||||
* initialize the relation's lock manager and RelFileNode information
|
||||
* initialize the relation lock manager information
|
||||
*/
|
||||
RelationInitLockInfo(relation); /* see lmgr.c */
|
||||
|
||||
if (relation->rd_rel->relisshared)
|
||||
relation->rd_node.tblNode = InvalidOid;
|
||||
else
|
||||
relation->rd_node.tblNode = MyDatabaseId;
|
||||
relation->rd_node.relNode =
|
||||
relation->rd_rel->relfilenode = RelationGetRelid(relation);
|
||||
/*
|
||||
* initialize physical addressing information for the relation
|
||||
*/
|
||||
RelationInitPhysicalAddr(relation);
|
||||
|
||||
/*
|
||||
* initialize the rel-has-index flag, using hardwired knowledge
|
||||
@ -1570,7 +1586,8 @@ RelationReloadClassinfo(Relation relation)
|
||||
relation->rd_id);
|
||||
relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
|
||||
memcpy((char *) relation->rd_rel, (char *) relp, CLASS_TUPLE_SIZE);
|
||||
relation->rd_node.relNode = relp->relfilenode;
|
||||
/* Now we can recalculate physical address */
|
||||
RelationInitPhysicalAddr(relation);
|
||||
heap_freetuple(pg_class_tuple);
|
||||
relation->rd_targblock = InvalidBlockNumber;
|
||||
/* Okay, now it's valid again */
|
||||
@ -2040,8 +2057,9 @@ Relation
|
||||
RelationBuildLocalRelation(const char *relname,
|
||||
Oid relnamespace,
|
||||
TupleDesc tupDesc,
|
||||
Oid relid, Oid dbid,
|
||||
RelFileNode rnode,
|
||||
Oid relid,
|
||||
Oid reltablespace,
|
||||
bool shared_relation,
|
||||
bool nailit)
|
||||
{
|
||||
Relation rel;
|
||||
@ -2125,20 +2143,23 @@ RelationBuildLocalRelation(const char *relname,
|
||||
|
||||
/*
|
||||
* Insert relation physical and logical identifiers (OIDs) into the
|
||||
* right places.
|
||||
* right places. Note that the physical ID (relfilenode) is initially
|
||||
* the same as the logical ID (OID).
|
||||
*/
|
||||
rel->rd_rel->relisshared = (dbid == InvalidOid);
|
||||
rel->rd_rel->relisshared = shared_relation;
|
||||
|
||||
RelationGetRelid(rel) = relid;
|
||||
|
||||
for (i = 0; i < natts; i++)
|
||||
rel->rd_att->attrs[i]->attrelid = relid;
|
||||
|
||||
rel->rd_node = rnode;
|
||||
rel->rd_rel->relfilenode = rnode.relNode;
|
||||
rel->rd_rel->relfilenode = relid;
|
||||
rel->rd_rel->reltablespace = reltablespace;
|
||||
|
||||
RelationInitLockInfo(rel); /* see lmgr.c */
|
||||
|
||||
RelationInitPhysicalAddr(rel);
|
||||
|
||||
/*
|
||||
* Okay to insert into the relcache hash tables.
|
||||
*/
|
||||
@ -3053,16 +3074,12 @@ load_relcache_init_file(void)
|
||||
MemSet(&rel->pgstat_info, 0, sizeof(rel->pgstat_info));
|
||||
|
||||
/*
|
||||
* Make sure database ID is correct. This is needed in case the
|
||||
* pg_internal.init file was copied from some other database by
|
||||
* CREATE DATABASE.
|
||||
* Recompute lock and physical addressing info. This is needed in
|
||||
* case the pg_internal.init file was copied from some other database
|
||||
* by CREATE DATABASE.
|
||||
*/
|
||||
if (rel->rd_rel->relisshared)
|
||||
rel->rd_node.tblNode = InvalidOid;
|
||||
else
|
||||
rel->rd_node.tblNode = MyDatabaseId;
|
||||
|
||||
RelationInitLockInfo(rel);
|
||||
RelationInitPhysicalAddr(rel);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user