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

Robin Dong robin.k.dong at gmail.com
Mon Dec 9 08:45:35 CET 2013


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



-- 
--
Best Regard
Robin Dong
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.wpkg.org/pipermail/sheepdog/attachments/20131209/f07a6afb/attachment-0004.html>


More information about the sheepdog mailing list