[sheepdog] [PATCH] sheep: make epoch_log_read() clean

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Mon Mar 18 08:55:00 CET 2013


> diff --git a/include/internal_proto.h b/include/internal_proto.h
> index f237a86..6b3866d 100644
> --- a/include/internal_proto.h
> +++ b/include/internal_proto.h
> @@ -191,7 +191,7 @@ struct sd_node {
>  
>  struct epoch_log {
>  	uint64_t ctime;
> -	uint64_t time;
> +	time_t time;

Can this guarantee that struct epoch_log is aligned to 64 bit
boundaries?

> @@ -475,12 +481,16 @@ int epoch_log_read_remote(uint32_t epoch, struct sd_node *nodes, int len)
>  		hdr.data_length = len;
>  		hdr.obj.tgt_epoch = epoch;
>  		hdr.epoch = sys_epoch();
> -		ret = sheep_exec_req(&node->nid, &hdr, nodes);
> +		ret = sheep_exec_req(&node->nid, &hdr, buf);
>  		if (ret != SD_RES_SUCCESS)
>  			continue;
>  
> +		nodes_len = rsp->data_length - sizeof(timestamp);
> +		memcpy((void *)nodes, buf, nodes_len);
> +		memcpy(timestamp, buf + nodes_len, sizeof(timestamp));
> +

How about doing this copy only when timestamp is not NULL?  Then we
can pass NULL to the 4th argument of epoch_log_read_remote.


> -int epoch_log_read(uint32_t epoch, struct sd_node *nodes, int len)
> +static int do_epoch_log_read(uint32_t epoch, struct sd_node *nodes, int len,
> +			time_t *timestamp)
>  {
> -	int fd;
> +	int fd, ret, nr_nodes;
>  	char path[PATH_MAX];
> +	struct stat epoch_stat;
>  
>  	snprintf(path, sizeof(path), "%s%08u", epoch_path, epoch);
>  	fd = open(path, O_RDONLY);
> -	if (fd < 0) {
> -		sd_eprintf("failed to open epoch %"PRIu32" log", epoch);
> -		return -1;
> -	}
> +	if (fd < 0)
> +		goto err;
>  
> -	len = read(fd, nodes, len);
> +	memset(&epoch_stat, 0, sizeof(epoch_stat));
> +	ret = fstat(fd, &epoch_stat);
> +	if (ret < 0)
> +		goto err;
>  
> -	close(fd);
> +	if (len < epoch_stat.st_size - sizeof(time_t))
> +		goto err;
>  
> -	if (len < 0) {
> -		sd_eprintf("failed to read epoch %"PRIu32" log", epoch);
> -		return -1;
> -	}
> -	return len / sizeof(*nodes);
> +	ret = xread(fd, nodes, epoch_stat.st_size - sizeof(timestamp));
> +	if (ret < 0)
> +		goto err;
> +
> +	assert(ret % sizeof(struct sd_node) == 0);
> +	nr_nodes = ret / sizeof(struct sd_node);
> +
> +	ret = xread(fd, timestamp, sizeof(timestamp));
> +	if (ret != sizeof(timestamp))
> +		goto err;

Same here.  Actually, some callers of them don't need timestamp at
all.

Thanks,

Kazutaka



More information about the sheepdog mailing list