On Thu, Jun 12, 2014 at 11:46:25AM +0900, Hitoshi Mitake wrote:
> At Wed, 11 Jun 2014 17:14:10 +0800,
> Robin Dong wrote:
> > 
> > From: Robin Dong <san...@taobao.com>
> > 
> > In disk mode, we calculate number of md vnode by using "nr = disk_space / 
> > WEIGHT_MIN",
> > when disk_space is smaller than WEIGHT_MIN (4G currently), the 'nr' will be 
> > zero.
> > 
> > Imaging a sheep daemon who has two data paths. One data path has 8GB space, 
> > but
> > another data path has only 1GB space. The nr_disk is 2 and all the vnode in 
> > md.vroot
> > is for the 8GB data path. Then the larger data path get a disk fail and be 
> > removed
> > from md hashing ring, now the md.vroot has no vnode but nr_disk is 1. When 
> > the code
> > routine comes to md_get_object_dir_nolock(), it will call oid_to_vdisk() 
> > and get NULL
> > result which will make sheep daemon coredump.
> > To fix this problem, we should calculate number of vnode by DIV_ROUND_UP in 
> > disk mode.
> > 
> > Signed-off-by: Robin Dong <san...@taobao.com>
> > ---
> >  include/sheep.h | 2 +-
> >  sheep/md.c      | 4 ++--
> >  2 files changed, 3 insertions(+), 3 deletions(-)
> 
> This series looks good to me.
> Reviewed-by: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp>
> 
> Thanks,
> Hitoshi
> 
> > 
> > diff --git a/include/sheep.h b/include/sheep.h
> > index 785883e..e062372 100644
> > --- a/include/sheep.h
> > +++ b/include/sheep.h
> > @@ -216,7 +216,7 @@ node_disk_to_vnodes(const struct sd_node *n, struct 
> > rb_root *vroot)
> >             if (!n->disks[j].disk_id)
> >                     continue;
> >             hval = fnv_64a_64(node_hval, n->disks[j].disk_id);
> > -           disk_vnodes = n->disks[j].disk_space / WEIGHT_MIN;
> > +           disk_vnodes = DIV_ROUND_UP(n->disks[j].disk_space, WEIGHT_MIN);
> >             total += disk_vnodes;
> >             for (int k = 0; k < disk_vnodes; k++) {
> >                     hval = sd_hash_next(hval);
> > diff --git a/sheep/md.c b/sheep/md.c
> > index b95e032..7d45213 100644
> > --- a/sheep/md.c
> > +++ b/sheep/md.c
> > @@ -77,7 +77,7 @@ static void create_vdisks(const struct disk *disk)
> >     if (is_cluster_diskmode(&sys->cinfo)) {
> >             node_hval = sd_hash(&n->nid, offsetof(typeof(n->nid), io_addr));
> >             hval = fnv_64a_64(node_hval, hval);
> > -           nr = disk->space / WEIGHT_MIN;
> > +           nr = DIV_ROUND_UP(disk->space, WEIGHT_MIN);
> >             if (0 == n->nid.port)
> >                     return;
> >     } else
> > @@ -110,7 +110,7 @@ static void remove_vdisks(const struct disk *disk)
> >     if (is_cluster_diskmode(&sys->cinfo)) {
> >             node_hval = sd_hash(&n->nid, offsetof(typeof(n->nid), io_addr));
> >             hval = fnv_64a_64(node_hval, hval);
> > -           nr = disk->space / WEIGHT_MIN;
> > +           nr = DIV_ROUND_UP(disk->space, WEIGHT_MIN);
> >     } else
> >             nr = vdisk_number(disk);
> >  
> > -- 
> > 1.7.12.4
> > 
> > -- 
> > sheepdog mailing list
> > sheepdog@lists.wpkg.org
> > http://lists.wpkg.org/mailman/listinfo/sheepdog
> -- 
> sheepdog mailing list
> sheepdog@lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog

Applied thanks

Yuan
-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to