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:
parent
e5bc9454e5
commit
2c29e7fc95
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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">
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user