aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/dbcommands.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/dbcommands.c')
-rw-r--r--src/backend/commands/dbcommands.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index 37c2f45c727..1efe0c3777b 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -13,7 +13,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.213 2008/09/30 10:52:12 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.214 2008/10/09 10:34:06 heikki Exp $
*
*-------------------------------------------------------------------------
*/
@@ -539,10 +539,15 @@ createdb(const CreatedbStmt *stmt)
copyTemplateDependencies(src_dboid, dboid);
/*
- * Force dirty buffers out to disk, to ensure source database is
- * up-to-date for the copy.
+ * Force a checkpoint before starting the copy. This will force dirty
+ * buffers out to disk, to ensure source database is up-to-date on disk
+ * for the copy. FlushDatabaseBuffers() would suffice for that, but we
+ * also want to process any pending unlink requests. Otherwise, if a
+ * checkpoint happened while we're copying files, a file might be deleted
+ * just when we're about to copy it, causing the lstat() call in copydir()
+ * to fail with ENOENT.
*/
- FlushDatabaseBuffers(src_dboid);
+ RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT);
/*
* Once we start copying subdirectories, we need to be able to clean 'em