mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Redesign archive modules
A new callback named startup_cb, called shortly after a module is loaded, is added. This makes possible the initialization of any additional state data required by a module. This initial state data can be saved in a ArchiveModuleState, that is now passed down to all the callbacks that can be defined in a module. With this design, it is possible to have a per-module state, aimed at opening the door to the support of more than one archive module. The initialization of the callbacks is changed so as _PG_archive_module_init() does not anymore give in input a ArchiveModuleCallbacks that a module has to fill in with callback definitions. Instead, a module now needs to return a const ArchiveModuleCallbacks. All the structure and callback definitions of archive modules are moved into their own header, named archive_module.h, from pgarch.h. Command-based archiving follows the same line, with a new set of files named shell_archive.{c,h}. There are a few more items that are under discussion to improve the design of archive modules, like the fact that basic_archive calls sigsetjmp() by itself to define its own error handling flow. These will be adjusted later, the changes done here cover already a good portion of what has been discussed. Any modules created for v15 will need to be adjusted to this new design. Author: Nathan Bossart Reviewed-by: Andres Freund Discussion: https://postgr.es/m/20230130194810.6fztfgbn32e7qarj@awork3.anarazel.de
This commit is contained in:
@ -47,18 +47,22 @@
|
||||
normal library search path is used to locate the library. To provide the
|
||||
required archive module callbacks and to indicate that the library is
|
||||
actually an archive module, it needs to provide a function named
|
||||
<function>_PG_archive_module_init</function>. This function is passed a
|
||||
struct that needs to be filled with the callback function pointers for
|
||||
individual actions.
|
||||
<function>_PG_archive_module_init</function>. The result of the function
|
||||
must be a pointer to a struct of type
|
||||
<structname>ArchiveModuleCallbacks</structname>, which contains everything
|
||||
that the core code needs to know how to make use of the archive module. The
|
||||
return value needs to be of server lifetime, which is typically achieved by
|
||||
defining it as a <literal>static const</literal> variable in global scope.
|
||||
|
||||
<programlisting>
|
||||
typedef struct ArchiveModuleCallbacks
|
||||
{
|
||||
ArchiveStartupCB startup_cb;
|
||||
ArchiveCheckConfiguredCB check_configured_cb;
|
||||
ArchiveFileCB archive_file_cb;
|
||||
ArchiveShutdownCB shutdown_cb;
|
||||
} ArchiveModuleCallbacks;
|
||||
typedef void (*ArchiveModuleInit) (struct ArchiveModuleCallbacks *cb);
|
||||
typedef const ArchiveModuleCallbacks *(*ArchiveModuleInit) (void);
|
||||
</programlisting>
|
||||
|
||||
Only the <function>archive_file_cb</function> callback is required. The
|
||||
@ -73,6 +77,20 @@ typedef void (*ArchiveModuleInit) (struct ArchiveModuleCallbacks *cb);
|
||||
The server will call them as required to process each individual WAL file.
|
||||
</para>
|
||||
|
||||
<sect2 id="archive-module-startup">
|
||||
<title>Startup Callback</title>
|
||||
<para>
|
||||
The <function>startup_cb</function> callback is called shortly after the
|
||||
module is loaded. This callback can be used to perform any additional
|
||||
initialization required. If the archive module has a state, it can use
|
||||
<structfield>state->private_data</structfield> to store it.
|
||||
|
||||
<programlisting>
|
||||
typedef void (*ArchiveStartupCB) (ArchiveModuleState *state);
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="archive-module-check">
|
||||
<title>Check Callback</title>
|
||||
<para>
|
||||
@ -83,7 +101,7 @@ typedef void (*ArchiveModuleInit) (struct ArchiveModuleCallbacks *cb);
|
||||
assumes the module is configured.
|
||||
|
||||
<programlisting>
|
||||
typedef bool (*ArchiveCheckConfiguredCB) (void);
|
||||
typedef bool (*ArchiveCheckConfiguredCB) (ArchiveModuleState *state);
|
||||
</programlisting>
|
||||
|
||||
If <literal>true</literal> is returned, the server will proceed with
|
||||
@ -105,7 +123,7 @@ WARNING: archive_mode enabled, yet archiving is not configured
|
||||
single WAL file.
|
||||
|
||||
<programlisting>
|
||||
typedef bool (*ArchiveFileCB) (const char *file, const char *path);
|
||||
typedef bool (*ArchiveFileCB) (ArchiveModuleState *state, const char *file, const char *path);
|
||||
</programlisting>
|
||||
|
||||
If <literal>true</literal> is returned, the server proceeds as if the file
|
||||
@ -125,10 +143,11 @@ typedef bool (*ArchiveFileCB) (const char *file, const char *path);
|
||||
process exits (e.g., after an error) or the value of
|
||||
<xref linkend="guc-archive-library"/> changes. If no
|
||||
<function>shutdown_cb</function> is defined, no special action is taken in
|
||||
these situations.
|
||||
these situations. If the archive module has a state, this callback should
|
||||
free it to avoid leaks.
|
||||
|
||||
<programlisting>
|
||||
typedef void (*ArchiveShutdownCB) (void);
|
||||
typedef void (*ArchiveShutdownCB) (ArchiveModuleState *state);
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect2>
|
||||
|
Reference in New Issue
Block a user