[Sheepdog] [PATCH] sheep: use need_consistency_check consistently
Liu Yuan
namei.unix at gmail.com
Tue May 15 11:09:38 CEST 2012
On 05/15/2012 04:57 PM, Christoph Hellwig wrote:
> Move all remaining checks if we need a consistency check into
> need_consistency_check, which cleans up process_request_queue, and reduces
> the number of calls to object_is_cached which is more expensive than
> the other calls. Pass the request directly to need_consistency_check and
> set_consistency_check and thus avoid having to deal with the object header
> inside process_request_queue. Also remove the unused local copies variable
> while we're at it.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
>
> ---
> sheep/group.c | 48 +++++++++++++++++++++---------------------------
> 1 file changed, 21 insertions(+), 27 deletions(-)
>
> Index: sheepdog/sheep/group.c
> ===================================================================
> --- sheepdog.orig/sheep/group.c 2012-05-15 10:34:54.000000000 +0200
> +++ sheepdog/sheep/group.c 2012-05-15 10:35:58.519971818 +0200
> @@ -988,35 +988,44 @@ int is_access_to_busy_objects(uint64_t o
> return 0;
> }
>
> -static int need_consistency_check(uint8_t opcode, uint16_t flags)
> +static int need_consistency_check(struct request *req)
> {
> - if (flags & SD_FLAG_CMD_IO_LOCAL)
> + struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
> +
> + if (hdr->flags & SD_FLAG_CMD_IO_LOCAL)
> /* only gateway fixes data consistency */
> return 0;
>
> - if (opcode != SD_OP_READ_OBJ)
> + if (hdr->opcode != SD_OP_READ_OBJ)
> /* consistency is fixed when clients read data for the
> * first time */
> return 0;
>
> - if (flags & SD_FLAG_CMD_WEAK_CONSISTENCY)
> + if (hdr->flags & SD_FLAG_CMD_WEAK_CONSISTENCY)
> + return 0;
> +
> + if (is_vdi_obj(hdr->oid))
> + /* only check consistency for data objects */
> return 0;
>
> + if (object_is_cached(hdr->oid))
> + /* we don't check consistency for cached objects */
> + return 0;
> +
> return 1;
> }
>
> -static inline void set_consistency_check(struct request *req, uint64_t oid)
> +static inline void set_consistency_check(struct request *req)
> {
> - uint32_t vdi_id = oid_to_vid(oid);
> + struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
> + uint32_t vdi_id = oid_to_vid(hdr->oid);
> + uint32_t idx = data_oid_to_idx(hdr->oid);
> struct data_object_bmap *bmap;
>
> - if (is_vdi_obj(oid))
> - return;
> -
> req->check_consistency = 1;
> list_for_each_entry(bmap, &sys->consistent_obj_list, list) {
> if (bmap->vdi_id == vdi_id) {
> - if (test_bit(data_oid_to_idx(oid), bmap->dobjs))
> + if (test_bit(idx, bmap->dobjs))
> req->check_consistency = 0;
> break;
> }
> @@ -1031,27 +1040,12 @@ static void process_request_queue(void)
> list_del(&req->request_list);
>
> if (is_io_op(req->op)) {
> - struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
> - int copies = sys->nr_copies;
> -
> - if (copies > req->vnodes->nr_zones)
> - copies = req->vnodes->nr_zones;
> -
> list_add_tail(&req->request_list,
> &sys->outstanding_req_list);
> -
> - if (!(req->rq.flags & SD_FLAG_CMD_IO_LOCAL) &&
> - object_is_cached(hdr->oid)) {
> - /* If we have cache of it we are at its service. */
> - sys->nr_outstanding_io++;
> - queue_work(sys->gateway_wqueue, &req->work);
> - continue;
> - }
> -
> sys->nr_outstanding_io++;
>
> - if (need_consistency_check(req->rq.opcode, req->rq.flags))
> - set_consistency_check(req, hdr->oid);
> + if (need_consistency_check(req))
> + set_consistency_check(req);
>
> if (req->rq.flags & SD_FLAG_CMD_IO_LOCAL)
> queue_work(sys->io_wqueue, &req->work);
Applied, thanks.
Yuan
More information about the sheepdog
mailing list