Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8801110

Browse files
committed
Move TablespaceCreateDbspace() call into smgrcreate(), which is where it
probably should have been to begin with; this is to cover cases likeneeding to recreate the per-db directory during WAL replay.Also, fix heap_create to force pg_class.reltablespace to be zero insteadof the database's default tablespace; this makes the world safe forCREATE DATABASE to handle all tables in the default tablespace alike,as per previous discussion. And force pg_class.reltablespace to zerowhen creating a relation without physical storage (eg, a view); thisavoids possibly having dangling references in this column after asubsequent DROP TABLESPACE.
1 parent94d4d24 commit8801110

File tree

5 files changed

+59
-40
lines changed

5 files changed

+59
-40
lines changed

‎src/backend/catalog/heap.c

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.271 2004/06/18 06:13:19 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.272 2004/07/11 19:52:48 tgl Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -43,7 +43,6 @@
4343
#include"catalog/pg_statistic.h"
4444
#include"catalog/pg_type.h"
4545
#include"commands/tablecmds.h"
46-
#include"commands/tablespace.h"
4746
#include"commands/trigger.h"
4847
#include"miscadmin.h"
4948
#include"nodes/makefuncs.h"
@@ -195,10 +194,6 @@ SystemAttributeByName(const char *attname, bool relhasoids)
195194
*and is mostly zeroes at return.
196195
*
197196
*Remove the system relation specific code to elsewhere eventually.
198-
*
199-
* If storage_create is TRUE then heap_storage_create is called here,
200-
* else caller must call heap_storage_create later (or not at all,
201-
* if the relation doesn't need physical storage).
202197
* ----------------------------------------------------------------
203198
*/
204199
Relation
@@ -207,7 +202,7 @@ heap_create(const char *relname,
207202
Oidreltablespace,
208203
TupleDesctupDesc,
209204
boolshared_relation,
210-
boolstorage_create,
205+
boolcreate_storage,
211206
boolallow_system_table_mods)
212207
{
213208
Oidrelid;
@@ -268,6 +263,25 @@ heap_create(const char *relname,
268263
else
269264
relid=newoid();
270265

266+
/*
267+
* Never allow a pg_class entry to explicitly specify the database's
268+
* default tablespace in reltablespace; force it to zero instead.
269+
* This ensures that if the database is cloned with a different
270+
* default tablespace, the pg_class entry will still match where
271+
* CREATE DATABASE will put the physically copied relation.
272+
*
273+
* Yes, this is a bit of a hack.
274+
*/
275+
if (reltablespace==MyDatabaseTableSpace)
276+
reltablespace=InvalidOid;
277+
278+
/*
279+
* Also, force reltablespace to zero if the relation has no physical
280+
* storage. This is mainly just for cleanliness' sake.
281+
*/
282+
if (!create_storage)
283+
reltablespace=InvalidOid;
284+
271285
/*
272286
* build the relcache entry.
273287
*/
@@ -280,33 +294,18 @@ heap_create(const char *relname,
280294
nailme);
281295

282296
/*
283-
* have the storage manager create the relation's disk file, if
284-
* wanted.
297+
* have the storage manager create the relation's disk file, if needed.
285298
*/
286-
if (storage_create)
287-
heap_storage_create(rel);
299+
if (create_storage)
300+
{
301+
Assert(rel->rd_smgr==NULL);
302+
rel->rd_smgr=smgropen(rel->rd_node);
303+
smgrcreate(rel->rd_smgr,rel->rd_istemp, false);
304+
}
288305

289306
returnrel;
290307
}
291308

292-
void
293-
heap_storage_create(Relationrel)
294-
{
295-
/*
296-
* We may be using the target table space for the first time in this
297-
* database, so create a per-database subdirectory if needed.
298-
*
299-
* XXX it might be better to do this right in smgrcreate...
300-
*/
301-
TablespaceCreateDbspace(rel->rd_node.spcNode,rel->rd_node.dbNode);
302-
/*
303-
* Now we can make the file.
304-
*/
305-
Assert(rel->rd_smgr==NULL);
306-
rel->rd_smgr=smgropen(rel->rd_node);
307-
smgrcreate(rel->rd_smgr,rel->rd_istemp, false);
308-
}
309-
310309
/* ----------------------------------------------------------------
311310
*heap_create_with_catalog- Create a cataloged relation
312311
*

‎src/backend/commands/tablespace.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
*
4646
*
4747
* IDENTIFICATION
48-
* $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.5 2004/07/02 18:59:22 joe Exp $
48+
* $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.6 2004/07/11 19:52:49 tgl Exp $
4949
*
5050
*-------------------------------------------------------------------------
5151
*/
@@ -85,9 +85,13 @@ static bool directory_is_empty(const char *path);
8585
*
8686
* If tablespaces are not supported, this is just a no-op; CREATE DATABASE
8787
* is expected to create the default subdirectory for the database.
88+
*
89+
* isRedo indicates that we are creating an object during WAL replay;
90+
* we can skip doing locking in that case (and should do so to avoid
91+
* any possible problems with pg_tablespace not being valid).
8892
*/
8993
void
90-
TablespaceCreateDbspace(OidspcNode,OiddbNode)
94+
TablespaceCreateDbspace(OidspcNode,OiddbNode,boolisRedo)
9195
{
9296
#ifdefHAVE_SYMLINK
9397
structstatst;
@@ -116,7 +120,10 @@ TablespaceCreateDbspace(Oid spcNode, Oid dbNode)
116120
*/
117121
Relationrel;
118122

119-
rel=heap_openr(TableSpaceRelationName,ExclusiveLock);
123+
if (!isRedo)
124+
rel=heap_openr(TableSpaceRelationName,ExclusiveLock);
125+
else
126+
rel=NULL;
120127

121128
/*
122129
* Recheck to see if someone created the directory while
@@ -137,7 +144,8 @@ TablespaceCreateDbspace(Oid spcNode, Oid dbNode)
137144
}
138145

139146
/* OK to drop the exclusive lock */
140-
heap_close(rel,ExclusiveLock);
147+
if (!isRedo)
148+
heap_close(rel,ExclusiveLock);
141149
}
142150
else
143151
{

‎src/backend/storage/smgr/smgr.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.75 2004/07/01 00:51:07 tgl Exp $
14+
* $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.76 2004/07/11 19:52:51 tgl Exp $
1515
*
1616
*-------------------------------------------------------------------------
1717
*/
1818
#include"postgres.h"
1919

20+
#include"commands/tablespace.h"
2021
#include"storage/bufmgr.h"
2122
#include"storage/freespace.h"
2223
#include"storage/ipc.h"
@@ -309,6 +310,19 @@ smgrcreate(SMgrRelation reln, bool isTemp, bool isRedo)
309310
PendingRelDelete*pending;
310311
MemoryContextold_cxt;
311312

313+
/*
314+
* We may be using the target table space for the first time in this
315+
* database, so create a per-database subdirectory if needed.
316+
*
317+
* XXX this is a fairly ugly violation of module layering, but this seems
318+
* to be the best place to put the check. Maybe TablespaceCreateDbspace
319+
* should be here and not in commands/tablespace.c? But that would imply
320+
* importing a lot of stuff that smgr.c oughtn't know, either.
321+
*/
322+
TablespaceCreateDbspace(reln->smgr_rnode.spcNode,
323+
reln->smgr_rnode.dbNode,
324+
isRedo);
325+
312326
if (! (*(smgrsw[reln->smgr_which].smgr_create)) (reln,isRedo))
313327
ereport(ERROR,
314328
(errcode_for_file_access(),

‎src/include/catalog/heap.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/catalog/heap.h,v 1.67 2004/06/18 06:14:05 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/catalog/heap.h,v 1.68 2004/07/11 19:52:51 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -40,11 +40,9 @@ extern Relation heap_create(const char *relname,
4040
Oidreltablespace,
4141
TupleDesctupDesc,
4242
boolshared_relation,
43-
boolstorage_create,
43+
boolcreate_storage,
4444
boolallow_system_table_mods);
4545

46-
externvoidheap_storage_create(Relationrel);
47-
4846
externOidheap_create_with_catalog(constchar*relname,
4947
Oidrelnamespace,
5048
Oidreltablespace,

‎src/include/commands/tablespace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/commands/tablespace.h,v 1.2 2004/06/25 21:55:58 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/commands/tablespace.h,v 1.3 2004/07/11 19:52:52 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -20,7 +20,7 @@ extern void CreateTableSpace(CreateTableSpaceStmt *stmt);
2020

2121
externvoidDropTableSpace(DropTableSpaceStmt*stmt);
2222

23-
externvoidTablespaceCreateDbspace(OidspcNode,OiddbNode);
23+
externvoidTablespaceCreateDbspace(OidspcNode,OiddbNode,boolisRedo);
2424

2525
externOidget_tablespace_oid(constchar*tablespacename);
2626

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp