Add macro for customizing an archiving WARNING message.

Presently, if an archive module's check_configured_cb callback
returns false, a generic WARNING message is emitted, which
unfortunately provides no actionable details about the reason why
the module is not configured.  This commit introduces a macro that
archive module authors can use to add a DETAIL line to this WARNING
message.

Co-authored-by: Tung Nguyen
Reviewed-by: Daniel Gustafsson, Álvaro Herrera
Discussion: https://postgr.es/m/4109578306242a7cd5661171647e11b2%40oss.nttdata.com
This commit is contained in:
Nathan Bossart 2024-03-04 15:41:42 -06:00
parent e5bc9454e5
commit 2c29e7fc95
5 changed files with 39 additions and 3 deletions

View File

@ -161,7 +161,12 @@ check_archive_directory(char **newval, void **extra, GucSource source)
static bool static bool
basic_archive_configured(ArchiveModuleState *state) basic_archive_configured(ArchiveModuleState *state)
{ {
return archive_directory != NULL && archive_directory[0] != '\0'; if (archive_directory != NULL && archive_directory[0] != '\0')
return true;
arch_module_check_errdetail("%s is not set.",
"basic_archive.archive_directory");
return false;
} }
/* /*

View File

@ -114,6 +114,18 @@ WARNING: archive_mode enabled, yet archiving is not configured
In the latter case, the server will periodically call this function, and In the latter case, the server will periodically call this function, and
archiving will proceed only when it returns <literal>true</literal>. archiving will proceed only when it returns <literal>true</literal>.
</para> </para>
<note>
<para>
When returning <literal>false</literal>, it may be useful to append some
additional information to the generic warning message. To do that, provide
a message to the <function>arch_module_check_errdetail</function> macro
before returning <literal>false</literal>. Like
<function>errdetail()</function>, this macro accepts a format string
followed by an optional list of arguments. The resulting string will be
emitted as the <literal>DETAIL</literal> line of the warning message.
</para>
</note>
</sect2> </sect2>
<sect2 id="archive-module-archive"> <sect2 id="archive-module-archive">

View File

@ -45,7 +45,12 @@ shell_archive_init(void)
static bool static bool
shell_archive_configured(ArchiveModuleState *state) shell_archive_configured(ArchiveModuleState *state)
{ {
return XLogArchiveCommand[0] != '\0'; if (XLogArchiveCommand[0] != '\0')
return true;
arch_module_check_errdetail("%s is not set.",
"archive_command");
return false;
} }
static bool static bool

View File

@ -88,6 +88,7 @@ typedef struct PgArchData
} PgArchData; } PgArchData;
char *XLogArchiveLibrary = ""; char *XLogArchiveLibrary = "";
char *arch_module_check_errdetail_string;
/* ---------- /* ----------
@ -401,12 +402,17 @@ pgarch_ArchiverCopyLoop(void)
*/ */
HandlePgArchInterrupts(); HandlePgArchInterrupts();
/* Reset variables that might be set by the callback */
arch_module_check_errdetail_string = NULL;
/* can't do anything if not configured ... */ /* can't do anything if not configured ... */
if (ArchiveCallbacks->check_configured_cb != NULL && if (ArchiveCallbacks->check_configured_cb != NULL &&
!ArchiveCallbacks->check_configured_cb(archive_module_state)) !ArchiveCallbacks->check_configured_cb(archive_module_state))
{ {
ereport(WARNING, ereport(WARNING,
(errmsg("archive_mode enabled, yet archiving is not configured"))); (errmsg("archive_mode enabled, yet archiving is not configured"),
arch_module_check_errdetail_string ?
errdetail_internal("%s", arch_module_check_errdetail_string) : 0));
return; return;
} }

View File

@ -56,4 +56,12 @@ typedef const ArchiveModuleCallbacks *(*ArchiveModuleInit) (void);
extern PGDLLEXPORT const ArchiveModuleCallbacks *_PG_archive_module_init(void); extern PGDLLEXPORT const ArchiveModuleCallbacks *_PG_archive_module_init(void);
/* Support for messages reported from archive module callbacks. */
extern PGDLLIMPORT char *arch_module_check_errdetail_string;
#define arch_module_check_errdetail \
pre_format_elog_string(errno, TEXTDOMAIN), \
arch_module_check_errdetail_string = format_elog_string
#endif /* _ARCHIVE_MODULE_H */ #endif /* _ARCHIVE_MODULE_H */