[Sheepdog] [PATCH v2 1/5] sheep: refactor get_cluster_status()

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Mon Oct 17 07:27:47 CEST 2011


At Sun, 16 Oct 2011 18:35:11 +0800,
Liu Yuan wrote:
> 
> From: Liu Yuan <tailai.ly at taobao.com>
> 
> And add a helper func to do the sanity check for cluster status.
> 
> Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
> ---
>  sheep/group.c |  138 +++++++++++++++++++++++++++++----------------------------
>  1 files changed, 70 insertions(+), 68 deletions(-)
> 
> diff --git a/sheep/group.c b/sheep/group.c
> index eb64207..a054c22 100644
> --- a/sheep/group.c
> +++ b/sheep/group.c
> @@ -526,101 +526,97 @@ err:
>  	return ret;
>  }
>  
> +static int cluster_sanity_check(struct sheepdog_node_list_entry *entries,
> +			     int nr_entries, uint64_t ctime, uint32_t epoch)
> +{
> +	int ret = SD_RES_SUCCESS, nr_local_entries;
> +	struct sheepdog_node_list_entry local_entries[SD_MAX_NODES];
> +	uint32_t lepoch;
> +
> +	if (sys->status == SD_STATUS_WAIT_FOR_FORMAT ||
> +	    sys->status == SD_STATUS_SHUTDOWN ||
> +		goto out;

Syntax error.

> +	/* When the joinning node is newly created, we need to check nothing. */
> +	if (nr_entries == 0)
> +		goto out;
> +
> +	if (ctime != get_cluster_ctime()) {
> +		ret = SD_RES_INVALID_CTIME;
> +		goto out;
> +	}
> +
> +	lepoch = get_latest_epoch();
> +	if (epoch > lepoch) {
> +		ret = SD_RES_OLD_NODE_VER;
> +		goto out;
> +	}
> +
> +	if (sys->status == SD_STATUS_OK)
> +		goto out;
> +
> +	if (epoch < lepoch) {
> +		ret = SD_RES_NEW_NODE_VER;
> +		goto out;
> +	}
> +
> +	nr_local_entries = epoch_log_read(epoch, (char *)local_entries,
> +			sizeof(local_entries));
> +	nr_local_entries /= sizeof(local_entries[0]);
> +
> +	if (nr_entries != nr_local_entries ||
> +	    memcmp(entries, local_entries, sizeof(entries[0]) * nr_entries) != 0) {
> +		ret = SD_RES_INVALID_EPOCH;
> +		goto out;
> +	}
> +
> +out:
> +	return ret;
> +}
> +
>  static int get_cluster_status(struct sheepdog_node_list_entry *from,
>  			      struct sheepdog_node_list_entry *entries,
>  			      int nr_entries, uint64_t ctime, uint32_t epoch,
>  			      uint32_t *status, uint8_t *inc_epoch)
>  {
> -	int i;
> -	int nr_local_entries, nr_leave_entries;
> +	int i, ret = SD_RES_SUCCESS;
> +	int nr, nr_local_entries, nr_leave_entries;
>  	struct sheepdog_node_list_entry local_entries[SD_MAX_NODES];
>  	struct node *node;
> -	uint32_t local_epoch;
>  	char str[256];
>  
>  	*status = sys->status;
>  	if (inc_epoch)
>  		*inc_epoch = 0;
>  
> +	ret = cluster_sanity_check(entries, nr_entries, ctime, epoch);
> +	if (ret)
> +		goto out;
> +
>  	switch (sys->status) {
>  	case SD_STATUS_OK:
>  		if (inc_epoch)
>  			*inc_epoch = 1;
> -
> -		if (nr_entries == 0)
> -			break;
> -
> -		if (ctime != get_cluster_ctime()) {
> -			eprintf("joining node has invalid ctime, %s\n",
> -				addr_to_str(str, sizeof(str), from->addr, from->port));
> -			return SD_RES_INVALID_CTIME;
> -		}
> -
> -		local_epoch = get_latest_epoch();
> -		if (epoch > local_epoch) {
> -			eprintf("sheepdog is running with older epoch, %"PRIu32" %"PRIu32" %s\n",
> -				epoch, local_epoch,
> -				addr_to_str(str, sizeof(str), from->addr, from->port));
> -			return SD_RES_OLD_NODE_VER;
> -		}
>  		break;
>  	case SD_STATUS_WAIT_FOR_FORMAT:
> -		if (nr_entries != 0) {
> -			eprintf("joining node is not clean, %s\n",
> -				addr_to_str(str, sizeof(str), from->addr, from->port));
> -			return SD_RES_NOT_FORMATTED;
> -		}
> +		if (nr_entries != 0)
> +			ret = SD_RES_NOT_FORMATTED;
>  		break;
>  	case SD_STATUS_WAIT_FOR_JOIN:
> -		if (ctime != get_cluster_ctime()) {
> -			eprintf("joining node has invalid ctime, %s\n",
> -				addr_to_str(str, sizeof(str), from->addr, from->port));
> -			return SD_RES_INVALID_CTIME;
> -		}
> -
> -		local_epoch = get_latest_epoch();
> -		if (epoch > local_epoch) {
> -			eprintf("sheepdog is waiting with older epoch, %"PRIu32" %"PRIu32" %s\n",
> -				epoch, local_epoch,
> -				addr_to_str(str, sizeof(str), from->addr, from->port));
> -			return SD_RES_OLD_NODE_VER;
> -		} else if (epoch < local_epoch) {
> -			eprintf("sheepdog is waiting with newer epoch, %"PRIu32" %"PRIu32" %s\n",
> -				epoch, local_epoch,
> -				addr_to_str(str, sizeof(str), from->addr, from->port));
> -			return SD_RES_NEW_NODE_VER;
> -		}
> -
> +		nr = get_nodes_nr_from(&sys->sd_node_list) + 1;
>  		nr_local_entries = epoch_log_read(epoch, (char *)local_entries,
>  						  sizeof(local_entries));
> -		nr_local_entries /= sizeof(local_entries[0]);

We can't remove this line because epoch_log_read() returns the number
of bytes read.  Perhaps, should we change epoch_log_read() to return
the number of nodes?

Thanks,

Kazutaka



More information about the sheepdog mailing list