diff options
| author | Magnus Hagander <magnus@hagander.net> | 2012-05-27 10:54:31 +0200 |
|---|---|---|
| committer | Magnus Hagander <magnus@hagander.net> | 2012-05-27 10:58:48 +0200 |
| commit | 785b8d6ab312e5bee0846094fe06982c1d4c07f2 (patch) | |
| tree | 8590e6571d190147539be625b0690f884f21197a | |
| parent | 2ce097e6e8989028ce18fdca010351b8fcc9dfd0 (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.
| -rw-r--r-- | contrib/pg_stat_statements/pg_stat_statements.c | 22 |
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 eb89aeca801..66a949c6044 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -418,6 +418,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: @@ -459,7 +466,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; @@ -485,16 +492,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"); } /* |
