This makes possible to track changes in logging object (and it's sub objects) for changes, so reload is no longer needed. Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx> --- exec/mainconfig.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 91 insertions(+), 8 deletions(-) diff --git a/exec/mainconfig.c b/exec/mainconfig.c index d15dd49..7961876 100644 --- a/exec/mainconfig.c +++ b/exec/mainconfig.c @@ -631,31 +631,114 @@ static int gid_determine (const char *req_group) return ais_gid; } +static unsigned int logging_handle_find ( + struct objdb_iface_ver0 *objdb, + hdb_handle_t *logging_find_handle) +{ + hdb_handle_t object_find_handle; + unsigned int res; + + objdb->object_find_create ( + OBJECT_PARENT_HANDLE, + "logging", + strlen ("logging"), + &object_find_handle); + + res = objdb->object_find_next ( + object_find_handle, + logging_find_handle); + + objdb->object_find_destroy (object_find_handle); + + if (res == -1) { + return (-1); + } + + return (0); +} + +static void logsys_objdb_key_change_notify(object_change_type_t change_type, + hdb_handle_t parent_object_handle, + hdb_handle_t object_handle, + const void *object_name_pt, size_t object_name_len, + const void *key_name_pt, size_t key_len, + const void *key_value_pt, size_t key_value_len, + void *priv_data_pt) +{ + const char *error_string; + + if (logsys_format_set(NULL) == -1) { + fprintf (stderr, "Unable to setup logging format.\n"); + } + corosync_main_config_read_logging(global_objdb, + &error_string); +} static void main_objdb_reload_notify(objdb_reload_notify_type_t type, int flush, void *priv_data_pt) { const char *error_string; + hdb_handle_t logsys_object_handle; - if (type == OBJDB_RELOAD_NOTIFY_END) { + /* + * A new logsys {} key might exist, cancel the + * existing notification at the start of reload, + * and start a new one on the new object when + * it's all settled. + */ + if (type == OBJDB_RELOAD_NOTIFY_START) { + global_objdb->object_track_stop( + logsys_objdb_key_change_notify, + NULL, + NULL, + NULL, + NULL); + } - /* - * Reload the logsys configuration - */ - if (logsys_format_set(NULL) == -1) { - fprintf (stderr, "Unable to setup logging format.\n"); + if (type == OBJDB_RELOAD_NOTIFY_END || type == OBJDB_RELOAD_NOTIFY_FAILED) { + if (!logging_handle_find(global_objdb, &logsys_object_handle)) { + /* + * Reload the logsys configuration + */ + if (logsys_format_set(NULL) == -1) { + fprintf (stderr, "Unable to setup logging format.\n"); + } + corosync_main_config_read_logging(global_objdb, + &error_string); + + global_objdb->object_track_start(logsys_object_handle, + 1, + logsys_objdb_key_change_notify, + NULL, // object_create_notify, + NULL, // object_destroy_notify, + NULL, // object_reload_notify + NULL); // priv_data + } else { + log_printf(LOGSYS_LEVEL_ERROR, "logsys objdb tracking stopped, cannot find logsys{} handle on objdb\n"); } - corosync_main_config_read_logging(global_objdb, - &error_string); } } + static void add_logsys_config_notification( struct objdb_iface_ver0 *objdb) { + hdb_handle_t logsys_object_handle; global_objdb = objdb; + if (!logging_handle_find(global_objdb, &logsys_object_handle)) { + objdb->object_track_start(logsys_object_handle, + 1, + logsys_objdb_key_change_notify, + NULL, // object_create_notify, + NULL, // object_destroy_notify, + NULL, // object_reload_notify + NULL); // priv_data + } else { + log_printf(LOGSYS_LEVEL_ERROR, "logsys objdb tracking stopped, cannot find logsys{} handle on objdb\n"); + } + objdb->object_track_start(OBJECT_PARENT_HANDLE, 1, NULL, -- 1.7.1 _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss