aboutsummaryrefslogtreecommitdiff
path: root/src/backend/postmaster/shell_archive.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2022-02-03 13:57:27 -0500
committerRobert Haas <rhaas@postgresql.org>2022-02-03 14:05:02 -0500
commit5ef1eefd76f404ddc59b885d50340e602b70f05f (patch)
tree85146bd90a7039c50498ff09aedbc501468afb65 /src/backend/postmaster/shell_archive.c
parent7c1aead6cbe7dcc6c216715fed7a1fb60684c5dc (diff)
downloadpostgresql-5ef1eefd76f404ddc59b885d50340e602b70f05f.tar.gz
postgresql-5ef1eefd76f404ddc59b885d50340e602b70f05f.zip
Allow archiving via loadable modules.
Running a shell command for each file to be archived has a lot of overhead and may not offer as much error checking as you want, or the exact semantics that you want. So, offer the option to call a loadable module for each file to be archived, rather than running a shell command. Also, add a 'basic_archive' contrib module as an example implementation that archives to a local directory. Nathan Bossart, with a little bit of kibitzing by me. Discussion: http://postgr.es/m/20220202224433.GA1036711@nathanxps13
Diffstat (limited to 'src/backend/postmaster/shell_archive.c')
-rw-r--r--src/backend/postmaster/shell_archive.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/postmaster/shell_archive.c b/src/backend/postmaster/shell_archive.c
index b54e701da4d..19e240c2053 100644
--- a/src/backend/postmaster/shell_archive.c
+++ b/src/backend/postmaster/shell_archive.c
@@ -2,6 +2,10 @@
*
* shell_archive.c
*
+ * This archiving function uses a user-specified shell command (the
+ * archive_command GUC) to copy write-ahead log files. It is used as the
+ * default, but other modules may define their own custom archiving logic.
+ *
* Copyright (c) 2022, PostgreSQL Global Development Group
*
* IDENTIFICATION
@@ -17,7 +21,25 @@
#include "pgstat.h"
#include "postmaster/pgarch.h"
-bool
+static bool shell_archive_configured(void);
+static bool shell_archive_file(const char *file, const char *path);
+
+void
+shell_archive_init(ArchiveModuleCallbacks *cb)
+{
+ AssertVariableIsOfType(&shell_archive_init, ArchiveModuleInit);
+
+ cb->check_configured_cb = shell_archive_configured;
+ cb->archive_file_cb = shell_archive_file;
+}
+
+static bool
+shell_archive_configured(void)
+{
+ return XLogArchiveCommand[0] != '\0';
+}
+
+static bool
shell_archive_file(const char *file, const char *path)
{
char xlogarchcmd[MAXPGPATH];