aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/catalog/heap.c32
-rw-r--r--src/backend/commands/tablecmds.c4
-rw-r--r--src/include/catalog/heap.h2
3 files changed, 23 insertions, 15 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 384e90de7c5..8cb313ed856 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -1290,24 +1290,10 @@ heap_create_with_catalog(const char *relname,
if (oncommit != ONCOMMIT_NOOP)
register_on_commit_action(relid, oncommit);
- /*
- * If this is an unlogged relation, it needs an init fork so that it can
- * be correctly reinitialized on restart. Since we're going to do an
- * immediate sync, we only need to xlog this if archiving or streaming is
- * enabled. And the immediate sync is required, because otherwise there's
- * no guarantee that this will hit the disk before the next checkpoint
- * moves the redo pointer.
- */
if (relpersistence == RELPERSISTENCE_UNLOGGED)
{
Assert(relkind == RELKIND_RELATION || relkind == RELKIND_TOASTVALUE);
-
- RelationOpenSmgr(new_rel_desc);
- smgrcreate(new_rel_desc->rd_smgr, INIT_FORKNUM, false);
- if (XLogIsNeeded())
- log_smgrcreate(&new_rel_desc->rd_smgr->smgr_rnode.node,
- INIT_FORKNUM);
- smgrimmedsync(new_rel_desc->rd_smgr, INIT_FORKNUM);
+ heap_create_init_fork(new_rel_desc);
}
/*
@@ -1320,6 +1306,22 @@ heap_create_with_catalog(const char *relname,
return relid;
}
+/*
+ * Set up an init fork for an unlogged table so that it can be correctly
+ * reinitialized on restart. Since we're going to do an immediate sync, we
+ * only need to xlog this if archiving or streaming is enabled. And the
+ * immediate sync is required, because otherwise there's no guarantee that
+ * this will hit the disk before the next checkpoint moves the redo pointer.
+ */
+void
+heap_create_init_fork(Relation rel)
+{
+ RelationOpenSmgr(rel);
+ smgrcreate(rel->rd_smgr, INIT_FORKNUM, false);
+ if (XLogIsNeeded())
+ log_smgrcreate(&rel->rd_smgr->smgr_rnode.node, INIT_FORKNUM);
+ smgrimmedsync(rel->rd_smgr, INIT_FORKNUM);
+}
/*
* RelationRemoveInheritance
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 8f569ed0bd6..11f57b2758d 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -1059,6 +1059,8 @@ ExecuteTruncate(TruncateStmt *stmt)
* deletion at commit.
*/
RelationSetNewRelfilenode(rel, RecentXmin);
+ if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED)
+ heap_create_init_fork(rel);
heap_relid = RelationGetRelid(rel);
toast_relid = rel->rd_rel->reltoastrelid;
@@ -1070,6 +1072,8 @@ ExecuteTruncate(TruncateStmt *stmt)
{
rel = relation_open(toast_relid, AccessExclusiveLock);
RelationSetNewRelfilenode(rel, RecentXmin);
+ if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED)
+ heap_create_init_fork(rel);
heap_close(rel, NoLock);
}
diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h
index c95e91303b8..213441e4cc2 100644
--- a/src/include/catalog/heap.h
+++ b/src/include/catalog/heap.h
@@ -65,6 +65,8 @@ extern Oid heap_create_with_catalog(const char *relname,
bool use_user_acl,
bool allow_system_table_mods);
+extern void heap_create_init_fork(Relation rel);
+
extern void heap_drop_with_catalog(Oid relid);
extern void heap_truncate(List *relids);