mirror of https://github.com/postgres/postgres
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
pull/128/head
parent
d2ea2d310d
commit
35739b87dc
@ -0,0 +1,18 @@ |
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Makefile--
|
||||
# Makefile for src/backend/archive
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# src/backend/archive/Makefile
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
subdir = src/backend/archive
|
||||
top_builddir = ../../..
|
||||
include $(top_builddir)/src/Makefile.global |
||||
|
||||
OBJS = \
|
||||
shell_archive.o
|
||||
|
||||
include $(top_srcdir)/src/backend/common.mk |
||||
@ -0,0 +1,5 @@ |
||||
# Copyright (c) 2023, PostgreSQL Global Development Group |
||||
|
||||
backend_sources += files( |
||||
'shell_archive.c' |
||||
) |
||||
@ -0,0 +1,59 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* archive_module.h |
||||
* Exports for archive modules. |
||||
* |
||||
* Copyright (c) 2022-2023, PostgreSQL Global Development Group |
||||
* |
||||
* src/include/archive/archive_module.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef _ARCHIVE_MODULE_H |
||||
#define _ARCHIVE_MODULE_H |
||||
|
||||
/*
|
||||
* The value of the archive_library GUC. |
||||
*/ |
||||
extern PGDLLIMPORT char *XLogArchiveLibrary; |
||||
|
||||
typedef struct ArchiveModuleState |
||||
{ |
||||
/*
|
||||
* Private data pointer for use by an archive module. This can be used to |
||||
* store state for the module that will be passed to each of its |
||||
* callbacks. |
||||
*/ |
||||
void *private_data; |
||||
} ArchiveModuleState; |
||||
|
||||
/*
|
||||
* Archive module callbacks |
||||
* |
||||
* These callback functions should be defined by archive libraries and returned |
||||
* via _PG_archive_module_init(). ArchiveFileCB is the only required callback. |
||||
* For more information about the purpose of each callback, refer to the |
||||
* archive modules documentation. |
||||
*/ |
||||
typedef void (*ArchiveStartupCB) (ArchiveModuleState *state); |
||||
typedef bool (*ArchiveCheckConfiguredCB) (ArchiveModuleState *state); |
||||
typedef bool (*ArchiveFileCB) (ArchiveModuleState *state, const char *file, const char *path); |
||||
typedef void (*ArchiveShutdownCB) (ArchiveModuleState *state); |
||||
|
||||
typedef struct ArchiveModuleCallbacks |
||||
{ |
||||
ArchiveStartupCB startup_cb; |
||||
ArchiveCheckConfiguredCB check_configured_cb; |
||||
ArchiveFileCB archive_file_cb; |
||||
ArchiveShutdownCB shutdown_cb; |
||||
} ArchiveModuleCallbacks; |
||||
|
||||
/*
|
||||
* Type of the shared library symbol _PG_archive_module_init that is looked |
||||
* up when loading an archive library. |
||||
*/ |
||||
typedef const ArchiveModuleCallbacks *(*ArchiveModuleInit) (void); |
||||
|
||||
extern PGDLLEXPORT const ArchiveModuleCallbacks *_PG_archive_module_init(void); |
||||
|
||||
#endif /* _ARCHIVE_MODULE_H */ |
||||
@ -0,0 +1,24 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* shell_archive.h |
||||
* Exports for archiving via shell. |
||||
* |
||||
* Copyright (c) 2022-2023, PostgreSQL Global Development Group |
||||
* |
||||
* src/include/archive/shell_archive.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef _SHELL_ARCHIVE_H |
||||
#define _SHELL_ARCHIVE_H |
||||
|
||||
#include "archive/archive_module.h" |
||||
|
||||
/*
|
||||
* Since the logic for archiving via a shell command is in the core server |
||||
* and does not need to be loaded via a shared library, it has a special |
||||
* initialization function. |
||||
*/ |
||||
extern const ArchiveModuleCallbacks *shell_archive_init(void); |
||||
|
||||
#endif /* _SHELL_ARCHIVE_H */ |
||||
Loading…
Reference in new issue