> 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
-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to