summaryrefslogtreecommitdiff
path: root/contrib/pg_stat_statements/pg_stat_statements.c
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2012-05-27 10:54:31 +0200
committerMagnus Hagander <magnus@hagander.net>2012-05-27 10:58:14 +0200
commit2791f2180d8e7c469fac2a4d88fc449689e4c970 (patch)
treef42123965177d69ec4bcce2ffbbe5ee04a477b41 /contrib/pg_stat_statements/pg_stat_statements.c
parent6c1bf45ea50a652d2b8efa778cabb63fdf422e70 (diff)
Fix handling of pg_stat_statements.stat temporary file
Write the file to a temporary name and then rename() it into the permanent name, to ensure it can't end up half-written and corrupt in case of a crash during shutdown. Unlink the file after it has been read so it's removed from the data directory and not included in base backups going to replication slaves.
Diffstat (limited to 'contrib/pg_stat_statements/pg_stat_statements.c')
-rw-r--r--contrib/pg_stat_statements/pg_stat_statements.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c
index 0236b87498f..590512fdcdb 100644
--- a/contrib/pg_stat_statements/pg_stat_statements.c
+++ b/contrib/pg_stat_statements/pg_stat_statements.c
@@ -427,6 +427,13 @@ pgss_shmem_startup(void)
pfree(buffer);
FreeFile(file);
+
+ /*
+ * Remove the file so it's not included in backups/replication
+ * slaves, etc. A new file will be written on next shutdown.
+ */
+ unlink(PGSS_DUMP_FILE);
+
return;
error:
@@ -468,7 +475,7 @@ pgss_shmem_shutdown(int code, Datum arg)
if (!pgss_save)
return;
- file = AllocateFile(PGSS_DUMP_FILE, PG_BINARY_W);
+ file = AllocateFile(PGSS_DUMP_FILE ".tmp", PG_BINARY_W);
if (file == NULL)
goto error;
@@ -494,16 +501,25 @@ pgss_shmem_shutdown(int code, Datum arg)
goto error;
}
+ /*
+ * Rename file into place, so we atomically replace the old one.
+ */
+ if (rename(PGSS_DUMP_FILE ".tmp", PGSS_DUMP_FILE) != 0)
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not rename pg_stat_statement file \"%s\": %m",
+ PGSS_DUMP_FILE ".tmp")));
+
return;
error:
ereport(LOG,
(errcode_for_file_access(),
errmsg("could not write pg_stat_statement file \"%s\": %m",
- PGSS_DUMP_FILE)));
+ PGSS_DUMP_FILE ".tmp")));
if (file)
FreeFile(file);
- unlink(PGSS_DUMP_FILE);
+ unlink(PGSS_DUMP_FILE ".tmp");
}
/*