Re: [PATCH] Store config_version of other nodes

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

 



ACK


On 10/02/2012 05:27 PM, Jan Friesse wrote:
> Config version of other nodes is stored in
> runtime.totem.pg.mrp.srp.members.NODEID.config_version key. Also when
> local config_version is changed, all nodes are informed.
> 
> Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx>
> ---
>  exec/cmap.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 66 insertions(+), 2 deletions(-)
> 
> diff --git a/exec/cmap.c b/exec/cmap.c
> index f6ec2c7..5debf04 100644
> --- a/exec/cmap.c
> +++ b/exec/cmap.c
> @@ -82,6 +82,7 @@ enum cmap_message_req_types {
>  
>  enum cmap_mcast_reason {
>  	CMAP_MCAST_REASON_SYNC = 0,
> +	CMAP_MCAST_REASON_NEW_CONFIG_VERSION = 1,
>  };
>  
>  static struct corosync_api_v1 *api;
> @@ -134,6 +135,13 @@ static int cmap_sync_process (void);
>  static void cmap_sync_activate (void);
>  static void cmap_sync_abort (void);
>  
> +static void cmap_config_version_track_cb(
> +	int32_t event,
> +	const char *key_name,
> +	struct icmap_notify_value new_value,
> +	struct icmap_notify_value old_value,
> +	void *user_data);
> +
>  /*
>   * Library Handler Definition
>   */
> @@ -234,17 +242,60 @@ static size_t cmap_sync_member_list_entries = 0;
>  static uint64_t cmap_highest_config_version_received = 0;
>  static uint64_t cmap_my_config_version = 0;
>  static int cmap_first_sync = 1;
> +static icmap_track_t cmap_config_version_track;
> +
> +static void cmap_config_version_track_cb(
> +	int32_t event,
> +	const char *key_name,
> +	struct icmap_notify_value new_value,
> +	struct icmap_notify_value old_value,
> +	void *user_data)
> +{
> +	const char *key = "totem.config_version";
> +	cs_error_t ret;
> +
> +	ENTER();
> +
> +	if (icmap_get_uint64("totem.config_version", &cmap_my_config_version) != CS_OK) {
> +		cmap_my_config_version = 0;
> +	}
> +
> +
> +	ret = cmap_mcast_send(CMAP_MCAST_REASON_NEW_CONFIG_VERSION, 1, (char **)&key);
> +	if (ret != CS_OK) {
> +		log_printf(LOGSYS_LEVEL_ERROR, "Can't inform other nodes about new config version");
> +	}
> +
> +	LEAVE();
> +}
>  
>  static int cmap_exec_exit_fn(void)
>  {
> +
> +	if (icmap_track_delete(cmap_config_version_track) != CS_OK) {
> +		log_printf(LOGSYS_LEVEL_ERROR, "Can't delete config_version icmap tracker");
> +	}
> +
>  	return 0;
>  }
>  
>  static char *cmap_exec_init_fn (
>  	struct corosync_api_v1 *corosync_api)
>  {
> +	cs_error_t ret;
> +
>  	api = corosync_api;
>  
> +	ret = icmap_track_add("totem.config_version",
> +	    ICMAP_TRACK_ADD | ICMAP_TRACK_DELETE | ICMAP_TRACK_MODIFY,
> +	    cmap_config_version_track_cb,
> +	    NULL,
> +	    &cmap_config_version_track);
> +
> +	if (ret != CS_OK) {
> +		return ((char *)"Can't add config_version icmap tracker");
> +	}
> +
>  	return (NULL);
>  }
>  
> @@ -855,10 +906,12 @@ static struct req_exec_cmap_mcast_item *cmap_mcast_item_find(
>  	return (NULL);
>  }
>  
> -static void message_handler_req_exec_cmap_mcast_reason_sync(
> +static void message_handler_req_exec_cmap_mcast_reason_sync_nv(
> +		enum cmap_mcast_reason reason,
>  		const void *message,
>  		unsigned int nodeid)
>  {
> +	char member_config_version[ICMAP_KEYNAME_MAXLEN];
>  	uint64_t config_version = 0;
>  	struct req_exec_cmap_mcast_item *item;
>  	mar_size_t value_len;
> @@ -885,6 +938,10 @@ static void message_handler_req_exec_cmap_mcast_reason_sync(
>  		cmap_highest_config_version_received = config_version;
>  	}
>  
> +	snprintf(member_config_version, ICMAP_KEYNAME_MAXLEN,
> +		"runtime.totem.pg.mrp.srp.members.%u.config_version", nodeid);
> +	icmap_set_uint64(member_config_version, config_version);
> +
>  	LEAVE();
>  }
>  
> @@ -898,7 +955,14 @@ static void message_handler_req_exec_cmap_mcast(
>  
>  	switch (req_exec_cmap_mcast->reason) {
>  	case CMAP_MCAST_REASON_SYNC:
> -		message_handler_req_exec_cmap_mcast_reason_sync(message, nodeid);
> +		message_handler_req_exec_cmap_mcast_reason_sync_nv(req_exec_cmap_mcast->reason,
> +		    message, nodeid);
> +
> +		break;
> +	case CMAP_MCAST_REASON_NEW_CONFIG_VERSION:
> +		message_handler_req_exec_cmap_mcast_reason_sync_nv(req_exec_cmap_mcast->reason,
> +		    message, nodeid);
> +
>  		break;
>  	default:
>  		qb_log(LOG_TRACE, "Received mcast with unknown reason %u", req_exec_cmap_mcast->reason);
> 

_______________________________________________
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