On 04/11/2012 02:50 PM, Li Wenpeng wrote: > From: levin li <xingke.lwp at taobao.com> > > In do_recover_object(), when recovery fail at some epoch, we need to go > back to the previous epoch, but get_vnodes_from_epoch() gives an incomplete > node list for the specified epoch, so the target node from which we will > recover the object is wrong sometime, in that case, recovery always fails, > the length we used to read epoch file was shorter than expected, now it's fixed. > > Signed-off-by: levin li <xingke.lwp at taobao.com> > --- > sheep/store.c | 6 +++--- > 1 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/sheep/store.c b/sheep/store.c > index 5d82e5a..739862c 100644 > --- a/sheep/store.c > +++ b/sheep/store.c > @@ -916,7 +916,7 @@ int epoch_log_read_remote(uint32_t epoch, char *buf, int len) > char host[128]; > struct sd_node nodes[SD_MAX_NODES]; > > - nr = epoch_log_read(le, (char *)nodes, ARRAY_SIZE(nodes)); > + nr = epoch_log_read(le, (char *)nodes, sizeof(nodes)); > nr /= sizeof(nodes[0]); > for (i = 0; i < nr; i++) { > if (is_myself(nodes[i].addr, nodes[i].port)) > @@ -1286,9 +1286,9 @@ static void *get_vnodes_from_epoch(int epoch, int *nr, int *copies) > struct sd_node nodes[SD_MAX_NODES]; > void *buf = xmalloc(len); > > - nodes_nr = epoch_log_read_nr(epoch, (void *)nodes, ARRAY_SIZE(nodes)); > + nodes_nr = epoch_log_read_nr(epoch, (void *)nodes, sizeof(nodes)); > if (nodes_nr < 0) { > - nodes_nr = epoch_log_read_remote(epoch, (void *)nodes, ARRAY_SIZE(nodes)); > + nodes_nr = epoch_log_read_remote(epoch, (void *)nodes, sizeof(nodes)); > if (nodes_nr == 0) { > free(buf); > return NULL; Applied, thanks. Yuan |