Hi,
This trivial patch moves a misplaced tablespace.c call from smgr.c into
the newly created storage.c. This is appropriate because smgr.c is
supposed to be bare metal, and storage.c has the high-level calls.
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/access/heap/visibilitymap.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/access/heap/visibilitymap.c,v
retrieving revision 1.3
diff -c -p -r1.3 visibilitymap.c
*** src/backend/access/heap/visibilitymap.c 1 Jan 2009 17:23:35 -0000 1.3
--- src/backend/access/heap/visibilitymap.c 15 Jan 2009 13:03:31 -0000
***************
*** 88,97 ****
#include "postgres.h"
#include "access/visibilitymap.h"
#include "storage/bufmgr.h"
#include "storage/bufpage.h"
#include "storage/lmgr.h"
- #include "storage/smgr.h"
#include "utils/inval.h"
/*#define TRACE_VISIBILITYMAP */
--- 88,97 ----
#include "postgres.h"
#include "access/visibilitymap.h"
+ #include "catalog/storage.h"
#include "storage/bufmgr.h"
#include "storage/bufpage.h"
#include "storage/lmgr.h"
#include "utils/inval.h"
/*#define TRACE_VISIBILITYMAP */
*************** vm_extend(Relation rel, BlockNumber vm_n
*** 454,460 ****
if ((rel->rd_vm_nblocks == 0 || rel->rd_vm_nblocks == InvalidBlockNumber)
&& !smgrexists(rel->rd_smgr, VISIBILITYMAP_FORKNUM))
{
! smgrcreate(rel->rd_smgr, VISIBILITYMAP_FORKNUM, false);
vm_nblocks_now = 0;
}
else
--- 454,460 ----
if ((rel->rd_vm_nblocks == 0 || rel->rd_vm_nblocks == InvalidBlockNumber)
&& !smgrexists(rel->rd_smgr, VISIBILITYMAP_FORKNUM))
{
! StorageCreate(rel->rd_smgr, VISIBILITYMAP_FORKNUM, false);
vm_nblocks_now = 0;
}
else
Index: src/backend/access/transam/xlogutils.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/access/transam/xlogutils.c,v
retrieving revision 1.66
diff -c -p -r1.66 xlogutils.c
*** src/backend/access/transam/xlogutils.c 1 Jan 2009 17:23:36 -0000 1.66
--- src/backend/access/transam/xlogutils.c 15 Jan 2009 12:14:42 -0000
*************** XLogReadBufferExtended(RelFileNode rnode
*** 273,279 ****
* filesystem loses an inode during a crash. Better to write the data
* until we are actually told to delete the file.)
*/
! smgrcreate(smgr, forknum, true);
lastblock = smgrnblocks(smgr, forknum);
--- 273,279 ----
* filesystem loses an inode during a crash. Better to write the data
* until we are actually told to delete the file.)
*/
! StorageCreate(smgr, forknum, true);
lastblock = smgrnblocks(smgr, forknum);
Index: src/backend/catalog/storage.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/catalog/storage.c,v
retrieving revision 1.4
diff -c -p -r1.4 storage.c
*** src/backend/catalog/storage.c 4 Jan 2009 14:59:22 -0000 1.4
--- src/backend/catalog/storage.c 15 Jan 2009 13:14:26 -0000
***************
*** 24,29 ****
--- 24,30 ----
#include "access/xlogutils.h"
#include "catalog/catalog.h"
#include "catalog/storage.h"
+ #include "commands/tablespace.h"
#include "storage/freespace.h"
#include "storage/smgr.h"
#include "utils/memutils.h"
*************** RelationCreateStorage(RelFileNode rnode,
*** 104,110 ****
SMgrRelation srel;
srel = smgropen(rnode);
! smgrcreate(srel, MAIN_FORKNUM, false);
if (!istemp)
{
--- 105,111 ----
SMgrRelation srel;
srel = smgropen(rnode);
! StorageCreate(srel, MAIN_FORKNUM, false);
if (!istemp)
{
*************** RelationCreateStorage(RelFileNode rnode,
*** 134,139 ****
--- 135,171 ----
}
/*
+ * StorageCreate
+ *
+ * Given an already-created (but presumably unused) SMgrRelation,
+ * cause the underlying disk file or other storage for the fork
+ * to be created.
+ *
+ * This is the non-transactional, low-level counterpart to
+ * RelationCreateStorage.
+ */
+ void
+ StorageCreate(SMgrRelation srel, ForkNumber forknum, bool isRedo)
+ {
+ /*
+ * Exit quickly in WAL replay mode if we've already opened the file.
+ * If it's open, it surely must exist.
+ */
+ if (isRedo && srel->md_fd[forknum] != NULL)
+ return;
+
+ /*
+ * We may be using the target table space for the first time in this
+ * database, so create a per-database subdirectory if needed.
+ */
+ TablespaceCreateDbspace(srel->smgr_rnode.spcNode,
+ srel->smgr_rnode.dbNode,
+ isRedo);
+
+ smgrcreate(srel, forknum, isRedo);
+ }
+
+ /*
* RelationDropStorage
* Schedule unlinking of physical storage at transaction commit.
*/
*************** smgr_redo(XLogRecPtr lsn, XLogRecord *re
*** 407,413 ****
SMgrRelation reln;
reln = smgropen(xlrec->rnode);
! smgrcreate(reln, MAIN_FORKNUM, true);
}
else if (info == XLOG_SMGR_TRUNCATE)
{
--- 439,445 ----
SMgrRelation reln;
reln = smgropen(xlrec->rnode);
! StorageCreate(reln, MAIN_FORKNUM, true);
}
else if (info == XLOG_SMGR_TRUNCATE)
{
*************** smgr_redo(XLogRecPtr lsn, XLogRecord *re
*** 422,428 ****
* XLogOpenRelation, we prefer to recreate the rel and replay the log
* as best we can until the drop is seen.
*/
! smgrcreate(reln, MAIN_FORKNUM, true);
smgrtruncate(reln, MAIN_FORKNUM, xlrec->blkno, false);
--- 454,460 ----
* XLogOpenRelation, we prefer to recreate the rel and replay the log
* as best we can until the drop is seen.
*/
! StorageCreate(reln, MAIN_FORKNUM, true);
smgrtruncate(reln, MAIN_FORKNUM, xlrec->blkno, false);
Index: src/backend/commands/tablecmds.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/commands/tablecmds.c,v
retrieving revision 1.277
diff -c -p -r1.277 tablecmds.c
*** src/backend/commands/tablecmds.c 12 Jan 2009 08:54:26 -0000 1.277
--- src/backend/commands/tablecmds.c 15 Jan 2009 13:05:00 -0000
***************
*** 65,71 ****
#include "rewrite/rewriteHandler.h"
#include "storage/bufmgr.h"
#include "storage/lmgr.h"
- #include "storage/smgr.h"
#include "utils/acl.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
--- 65,70 ----
*************** ATExecSetTableSpace(Oid tableOid, Oid ne
*** 6622,6628 ****
{
if (smgrexists(rel->rd_smgr, forkNum))
{
! smgrcreate(dstrel, forkNum, false);
copy_relation_data(rel->rd_smgr, dstrel, forkNum, rel->rd_istemp);
}
}
--- 6621,6627 ----
{
if (smgrexists(rel->rd_smgr, forkNum))
{
! StorageCreate(dstrel, forkNum, false);
copy_relation_data(rel->rd_smgr, dstrel, forkNum, rel->rd_istemp);
}
}
Index: src/backend/storage/freespace/freespace.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/storage/freespace/freespace.c,v
retrieving revision 1.71
diff -c -p -r1.71 freespace.c
*** src/backend/storage/freespace/freespace.c 1 Jan 2009 17:23:47 -0000 1.71
--- src/backend/storage/freespace/freespace.c 15 Jan 2009 13:03:10 -0000
***************
*** 25,37 ****
#include "access/htup.h"
#include "access/xlogutils.h"
#include "storage/bufpage.h"
#include "storage/bufmgr.h"
#include "storage/freespace.h"
#include "storage/fsm_internals.h"
#include "storage/lmgr.h"
#include "storage/lwlock.h"
- #include "storage/smgr.h"
#include "utils/rel.h"
#include "utils/inval.h"
#include "miscadmin.h"
--- 25,37 ----
#include "access/htup.h"
#include "access/xlogutils.h"
+ #include "catalog/storage.h"
#include "storage/bufpage.h"
#include "storage/bufmgr.h"
#include "storage/freespace.h"
#include "storage/fsm_internals.h"
#include "storage/lmgr.h"
#include "storage/lwlock.h"
#include "utils/rel.h"
#include "utils/inval.h"
#include "miscadmin.h"
*************** fsm_extend(Relation rel, BlockNumber fsm
*** 564,570 ****
if ((rel->rd_fsm_nblocks == 0 || rel->rd_fsm_nblocks == InvalidBlockNumber)
&& !smgrexists(rel->rd_smgr, FSM_FORKNUM))
{
! smgrcreate(rel->rd_smgr, FSM_FORKNUM, false);
fsm_nblocks_now = 0;
}
else
--- 564,570 ----
if ((rel->rd_fsm_nblocks == 0 || rel->rd_fsm_nblocks == InvalidBlockNumber)
&& !smgrexists(rel->rd_smgr, FSM_FORKNUM))
{
! StorageCreate(rel->rd_smgr, FSM_FORKNUM, false);
fsm_nblocks_now = 0;
}
else
Index: src/backend/storage/smgr/smgr.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/storage/smgr/smgr.c,v
retrieving revision 1.116
diff -c -p -r1.116 smgr.c
*** src/backend/storage/smgr/smgr.c 12 Jan 2009 05:10:44 -0000 1.116
--- src/backend/storage/smgr/smgr.c 15 Jan 2009 12:15:24 -0000
***************
*** 19,25 ****
#include "access/xlogutils.h"
#include "catalog/catalog.h"
- #include "commands/tablespace.h"
#include "storage/bufmgr.h"
#include "storage/ipc.h"
#include "storage/smgr.h"
--- 19,24 ----
*************** smgrclosenode(RelFileNode rnode)
*** 281,310 ****
*
* If isRedo is true, it is okay for the underlying file to exist
* already because we are in a WAL replay sequence.
*/
void
smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
{
- /*
- * Exit quickly in WAL replay mode if we've already opened the file.
- * If it's open, it surely must exist.
- */
- if (isRedo && reln->md_fd[forknum] != NULL)
- return;
-
- /*
- * We may be using the target table space for the first time in this
- * database, so create a per-database subdirectory if needed.
- *
- * XXX this is a fairly ugly violation of module layering, but this seems
- * to be the best place to put the check. Maybe TablespaceCreateDbspace
- * should be here and not in commands/tablespace.c? But that would imply
- * importing a lot of stuff that smgr.c oughtn't know, either.
- */
- TablespaceCreateDbspace(reln->smgr_rnode.spcNode,
- reln->smgr_rnode.dbNode,
- isRedo);
-
(*(smgrsw[reln->smgr_which].smgr_create)) (reln, forknum, isRedo);
}
--- 280,291 ----
*
* If isRedo is true, it is okay for the underlying file to exist
* already because we are in a WAL replay sequence.
+ *
+ * This shouldn't be called directly -- see StorageCreate instead.
*/
void
smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
{
(*(smgrsw[reln->smgr_which].smgr_create)) (reln, forknum, isRedo);
}
Index: src/include/catalog/storage.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/catalog/storage.h,v
retrieving revision 1.3
diff -c -p -r1.3 storage.h
*** src/include/catalog/storage.h 1 Jan 2009 17:23:58 -0000 1.3
--- src/include/catalog/storage.h 15 Jan 2009 13:02:33 -0000
***************
*** 14,25 ****
#ifndef STORAGE_H
#define STORAGE_H
- #include "access/xlog.h"
#include "lib/stringinfo.h"
! #include "storage/block.h"
! #include "storage/relfilenode.h"
#include "utils/relcache.h"
extern void RelationCreateStorage(RelFileNode rnode, bool istemp);
extern void RelationDropStorage(Relation rel);
extern void RelationTruncate(Relation rel, BlockNumber nblocks);
--- 14,25 ----
#ifndef STORAGE_H
#define STORAGE_H
#include "lib/stringinfo.h"
! #include "storage/smgr.h"
#include "utils/relcache.h"
+
+ extern void StorageCreate(SMgrRelation srel, ForkNumber forknum, bool isRedo);
extern void RelationCreateStorage(RelFileNode rnode, bool istemp);
extern void RelationDropStorage(Relation rel);
extern void RelationTruncate(Relation rel, BlockNumber nblocks);
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers