[sheepdog] [PATCH] erasure: allow x nodes to serve write request with x:y policy

Liu Yuan namei.unix at gmail.com
Mon Dec 9 08:48:39 CET 2013


On Mon, Dec 09, 2013 at 03:45:35PM +0800, Robin Dong wrote:
> Reviewed-by: Robin Dong <sanbai at taobao.com>
> 
> 
> 2013/12/7 Liu Yuan <namei.unix at gmail.com>
> 
> > There is no technical reason that prvent us from serving the both read and
> > write
> > requests if there are x nodes alove in the cluster with x:y policy.
> >
> > E.g, with 4 nodes alive with 4:2 formated, the cluster will be still
> > operational
> > instead of denial of service with this patch.
> >
> > This patch also fixes a memory leak in erorr case.
> >
> > Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> > ---
> >  sheep/gateway.c |   27 ++++++++++++++++++++-------
> >  1 file changed, 20 insertions(+), 7 deletions(-)
> >
> > diff --git a/sheep/gateway.c b/sheep/gateway.c
> > index f0cb514..0806edd 100644
> > --- a/sheep/gateway.c
> > +++ b/sheep/gateway.c
> > @@ -498,7 +498,7 @@ static int gateway_forward_request(struct request *req)
> >         struct forward_info fi;
> >         struct sd_req hdr;
> >         const struct sd_node *target_nodes[SD_MAX_NODES];
> > -       int nr_copies = get_req_copy_number(req), nr_to_send = 0;
> > +       int nr_copies = get_req_copy_number(req), nr_reqs, nr_to_send = 0;
> >         struct req_iter *reqs = NULL;
> >
> >         sd_debug("%"PRIx64, oid);
> > @@ -510,11 +510,24 @@ static int gateway_forward_request(struct request
> > *req)
> >         if (!reqs)
> >                 return SD_RES_NETWORK_ERROR;
> >
> > -       /* avoid out range of target_nodes[] */
> > +       /*
> > +        * For replication, we send number of available zones copies.
> > +        *
> > +        * For erasure, we need at least number of data strips to send to
> > avoid
> > +        * overflow of target_nodes.
> > +        */
> > +       nr_reqs = nr_to_send;
> >         if (nr_to_send > nr_copies) {
> > -               sd_err("There isn't enough copies(%d) to send out (%d)",
> > -                      nr_copies, nr_to_send);
> > -               return SD_RES_SYSTEM_ERROR;
> > +               int ds;
> > +               /* Only for erasure code, nr_to_send might > nr_copies */
> > +               ec_policy_to_dp(req->rq.obj.copy_policy, &ds, NULL);
> > +               if (nr_copies < ds) {
> > +                       sd_err("There isn't enough copies(%d) to send out
> > (%d)",
> > +                              nr_copies, nr_to_send);
> > +                       err_ret = SD_RES_SYSTEM_ERROR;
> > +                       goto out;
> > +               }
> > +               nr_to_send = ds;
> >         }
> >
> >         for (i = 0; i < nr_to_send; i++) {
> > @@ -551,8 +564,8 @@ static int gateway_forward_request(struct request *req)
> >                 if (ret != SD_RES_SUCCESS)
> >                         err_ret = ret;
> >         }
> > -
> > -       finish_requests(req, reqs, nr_to_send);
> > +out:
> > +       finish_requests(req, reqs, nr_reqs);
> >         return err_ret;
> >  }
> >

Applied

Yuan



More information about the sheepdog mailing list