Re: [PATCH 1/2] Track changes for confdb logging object

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



ACK

On 11/19/2012 2:34 PM, Jan Friesse wrote:
> 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,
> 

_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss


[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux