GQuarks does not work correctly across threads, which can cause misattribution to log domains, e.g.
[status] notice: members: 1/2116, 2/2454111 [status] notice: starting data syncronisation [status] notice: members: 1/2116, 2/2454111 [status] notice: starting data syncronisation [dcdb] notice: received sync request (epoch 1/2116/00000036) [status] notice: received sync request (epoch 1/2116/00000036) [dcdb] notice: received all states [dcdb] notice: leader is 1/2116 [dcdb] notice: synced members: 1/2116, 2/2454111 [dcdb] notice: all data is up to date [status] notice: received all states [status] notice: all data is up to date gets logged instead of [dcdb] notice: members: 1/2116, 2/2454111, 3/1254 [dcdb] notice: starting data syncronisation [status] notice: members: 1/2116, 2/2454111, 3/1254 [status] notice: starting data syncronisation [dcdb] notice: received sync request (epoch 1/2116/00000035) [status] notice: received sync request (epoch 1/2116/00000035) [dcdb] notice: received all states [dcdb] notice: leader is 1/2116 [dcdb] notice: synced members: 1/2116, 2/2454111 [dcdb] notice: all data is up to date [status] notice: received all states [status] notice: all data is up to date this only happens with threaded logging (not yet enabled). Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> --- not entirely happy with this approach - open for more elegant suggestions ;) data/src/cfs-utils.h | 36 ++++++++++++++++++++++++++++++++---- data/src/dfsm.h | 6 +++--- data/src/loop.h | 2 +- data/src/cfs-utils.c | 4 ++-- data/src/confdb.c | 2 +- data/src/dcdb.c | 2 +- data/src/dfsm.c | 4 ++-- data/src/loop.c | 10 +++++----- data/src/pmxcfs.c | 14 +++++--------- data/src/quorum.c | 2 +- data/src/status.c | 2 +- 11 files changed, 54 insertions(+), 30 deletions(-) diff --git a/data/src/cfs-utils.h b/data/src/cfs-utils.h index eb86379..51cfef0 100644 --- a/data/src/cfs-utils.h +++ b/data/src/cfs-utils.h @@ -37,6 +37,34 @@ #define CFS_MAX(a, b) (((a) > (b)) ? (a) : (b)) #define CFS_MIN(a, b) (((a) < (b)) ? (a) : (b)) +typedef enum { + CFS_LOG_MAIN = 0, + CFS_LOG_LOOP = 1, + CFS_LOG_IPCS = 2, + CFS_LOG_GLIB = 3, + CFS_LOG_CONFDB = 4, + CFS_LOG_QUORUM = 5, + CFS_LOG_DB = 6, + CFS_LOG_STATUS = 7, + CFS_LOG_DCDB = 8, + CFS_LOG_UNKNOWN = 9, + CFS_LOG_LAST_VALUE = 10, +} cfs_log_domain_t; + +static const char * const cfs_log_domain_strings[] = { + "main", + "loop", + "ipcs", + "glib", + "confdb", + "quorum", + "database", + "status", + "dcdb", + "unknown", + "invalid", +}; + typedef struct { char *nodename; char *ip; @@ -55,7 +83,7 @@ utf8_to_ascii( void cfs_log( - const gchar *log_domain, + cfs_log_domain_t log_domain, GLogLevelFlags log_level, const char *file, int line, @@ -72,7 +100,7 @@ void ipc_log_fn( #define cfs_debug(...) G_STMT_START { \ if (cfs.debug) \ - cfs_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__); \ + cfs_log(CFS_LOG_UNKNOWN, G_LOG_LEVEL_DEBUG, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__); \ } G_STMT_END #define cfs_dom_debug(domain, ...) G_STMT_START { \ @@ -80,9 +108,9 @@ void ipc_log_fn( cfs_log(domain, G_LOG_LEVEL_DEBUG, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__); \ } G_STMT_END -#define cfs_critical(...) cfs_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__) +#define cfs_critical(...) cfs_log(CFS_LOG_UNKNOWN, G_LOG_LEVEL_CRITICAL, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__) #define cfs_dom_critical(domain, ...) cfs_log(domain, G_LOG_LEVEL_CRITICAL, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__) -#define cfs_message(...) cfs_log(G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__) +#define cfs_message(...) cfs_log(CFS_LOG_UNKNOWN, G_LOG_LEVEL_MESSAGE, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__) #define cfs_dom_message(domain, ...) cfs_log(domain, G_LOG_LEVEL_MESSAGE, __FILE__, __LINE__, G_STRFUNC, __VA_ARGS__) guint64 diff --git a/data/src/dfsm.h b/data/src/dfsm.h index 858127f..79d20a4 100644 --- a/data/src/dfsm.h +++ b/data/src/dfsm.h @@ -120,9 +120,9 @@ typedef struct { dfsm_t * dfsm_new( gpointer data, - const char *group_name, - const char *log_domain, - guint32 protocol_version, + const char *group_name, + cfs_log_domain_t log_domain, + guint32 protocol_version, dfsm_callbacks_t *callbacks); void diff --git a/data/src/loop.h b/data/src/loop.h index 68b783c..b1e39e2 100644 --- a/data/src/loop.h +++ b/data/src/loop.h @@ -58,7 +58,7 @@ typedef struct { cfs_service_t *cfs_service_new( cfs_service_callbacks_t *callbacks, - const char *log_domain, + cfs_log_domain_t log_domain, gpointer context); gpointer cfs_service_get_context( diff --git a/data/src/cfs-utils.c b/data/src/cfs-utils.c index 5770833..134c1cb 100644 --- a/data/src/cfs-utils.c +++ b/data/src/cfs-utils.c @@ -108,7 +108,7 @@ utf8_to_ascii( void cfs_log( - const gchar *log_domain, + cfs_log_domain_t log_domain, GLogLevelFlags log_level, const char *file, int line, @@ -152,7 +152,7 @@ cfs_log( char msg[8192]; utf8_to_ascii(msg, sizeof(msg), orgmsg, FALSE); - uint32_t tag = g_quark_from_string(log_domain); + uint32_t tag = (uint32_t) log_domain; qb_log_from_external_source(func, file, "%s", level, line, tag, msg); diff --git a/data/src/confdb.c b/data/src/confdb.c index 839f576..7c4c992 100644 --- a/data/src/confdb.c +++ b/data/src/confdb.c @@ -344,7 +344,7 @@ service_confdb_new(void) if (!private) return NULL; - service = cfs_service_new(&cfs_confdb_callbacks, G_LOG_DOMAIN, private); + service = cfs_service_new(&cfs_confdb_callbacks, CFS_LOG_CONFDB, private); return service; } diff --git a/data/src/dcdb.c b/data/src/dcdb.c index b690355..b4f4359 100644 --- a/data/src/dcdb.c +++ b/data/src/dcdb.c @@ -949,6 +949,6 @@ dfsm_t *dcdb_new(memdb_t *memdb) { g_return_val_if_fail(memdb != NULL, NULL); - return dfsm_new(memdb, DCDB_CPG_GROUP_NAME, G_LOG_DOMAIN, + return dfsm_new(memdb, DCDB_CPG_GROUP_NAME, CFS_LOG_DCDB, DCDB_PROTOCOL_VERSION, &dcdb_dfsm_callbacks); } diff --git a/data/src/dfsm.c b/data/src/dfsm.c index ddfcc23..ab761e1 100644 --- a/data/src/dfsm.c +++ b/data/src/dfsm.c @@ -103,7 +103,7 @@ typedef struct { } dfsm_queued_message_t; struct dfsm { - const char *log_domain; + cfs_log_domain_t log_domain; cpg_callbacks_t *cpg_callbacks; dfsm_callbacks_t *dfsm_callbacks; cpg_handle_t cpg_handle; @@ -1223,7 +1223,7 @@ dfsm_t * dfsm_new( gpointer data, const char *group_name, - const char *log_domain, + cfs_log_domain_t log_domain, guint32 protocol_version, dfsm_callbacks_t *callbacks) { diff --git a/data/src/loop.c b/data/src/loop.c index a80fc66..09c8590 100644 --- a/data/src/loop.c +++ b/data/src/loop.c @@ -40,8 +40,8 @@ #include "loop.h" struct cfs_service { - qb_loop_t *qbloop; - const char *log_domain; + qb_loop_t *qbloop; + cfs_log_domain_t log_domain; cfs_service_callbacks_t *callbacks; gboolean restartable; gpointer context; @@ -98,7 +98,7 @@ cfs_service_set_restartable( cfs_service_t * cfs_service_new( cfs_service_callbacks_t *callbacks, - const char *log_domain, + cfs_log_domain_t log_domain, gpointer context) { g_return_val_if_fail(callbacks != NULL, NULL); @@ -113,7 +113,7 @@ cfs_service_new( if (log_domain) service->log_domain = log_domain; else - service->log_domain = G_LOG_DOMAIN; + service->log_domain = CFS_LOG_LOOP; service->callbacks = callbacks; @@ -170,7 +170,7 @@ cfs_loop_add_service( { g_return_val_if_fail(loop != NULL, FALSE); g_return_val_if_fail(service != NULL, FALSE); - g_return_val_if_fail(service->log_domain != NULL, FALSE); + g_return_val_if_fail(service->log_domain < CFS_LOG_LAST_VALUE, FALSE); service->priority = priority; service->qbloop = loop->qbloop; diff --git a/data/src/pmxcfs.c b/data/src/pmxcfs.c index b6d6576..d5a3aac 100644 --- a/data/src/pmxcfs.c +++ b/data/src/pmxcfs.c @@ -81,7 +81,7 @@ static void glib_log_handler(const gchar *log_domain, gpointer user_data) { - cfs_log(log_domain, log_level, NULL, 0, NULL, "%s", message); + cfs_log(CFS_LOG_GLIB, log_level, NULL, 0, NULL, "%s - %s", log_domain, message); } static gboolean write_pidfile(pid_t pid) @@ -760,15 +760,11 @@ static const char* log_tags_stringify(uint32_t tags) { if (qb_bit_is_set(tags, QB_LOG_TAG_LIBQB_MSG_BIT)) { return "libqb"; + } else if (tags >= CFS_LOG_LAST_VALUE) { + return cfs_log_domain_strings[CFS_LOG_MAIN]; } else { - GQuark quark = tags; - const char *domain = g_quark_to_string(quark); - if (domain != NULL) { - return domain; - } else { - return "main"; - } - } + return cfs_log_domain_strings[tags]; + } } int main(int argc, char *argv[]) diff --git a/data/src/quorum.c b/data/src/quorum.c index 9df0e90..0a75f7f 100644 --- a/data/src/quorum.c +++ b/data/src/quorum.c @@ -202,7 +202,7 @@ cfs_service_t *service_quorum_new(void) if (!private) return NULL; - service = cfs_service_new(&cfs_quorum_callbacks, G_LOG_DOMAIN, private); + service = cfs_service_new(&cfs_quorum_callbacks, CFS_LOG_QUORUM, private); return service; } diff --git a/data/src/status.c b/data/src/status.c index e15a257..004f02e 100644 --- a/data/src/status.c +++ b/data/src/status.c @@ -1834,7 +1834,7 @@ cfs_status_dfsm_new(void) { g_mutex_lock (&mutex); - cfs_status.kvstore = dfsm_new(NULL, KVSTORE_CPG_GROUP_NAME, G_LOG_DOMAIN, + cfs_status.kvstore = dfsm_new(NULL, KVSTORE_CPG_GROUP_NAME, CFS_LOG_STATUS, 0, &kvstore_dfsm_callbacks); g_mutex_unlock (&mutex); -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel