libceph: keep request lists in tid order
authorAlex Elder <elder@inktank.com>
Mon, 25 Mar 2013 23:16:11 +0000 (18:16 -0500)
committerSage Weil <sage@inktank.com>
Thu, 2 May 2013 04:17:19 +0000 (21:17 -0700)
In __map_request(), when adding a request to an osd client's unsent
list, add it to the tail rather than the head.  That way the newest
entries (with the highest tid value) will be last.

Maintain an osd's request list in order of increasing tid also.

Finally--to be consistent--maintain an osd client's "notarget" list
in that order as well.

This partially resolves:
    http://tracker.ceph.com/issues/4392

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-off-by: Sage Weil <sage@inktank.com>
net/ceph/osd_client.c

index 8b84fb4980ba34169de23de00a216ee7a23a1353..356f7bc4ae4b92cf0e69038d690e903ace7e5076 100644 (file)
@@ -619,7 +619,7 @@ static void __kick_osd_requests(struct ceph_osd_client *osdc,
                BUG_ON(!list_empty(&req->r_req_lru_item));
                __register_request(osdc, req);
                list_add_tail(&req->r_req_lru_item, &osdc->req_unsent);
-               list_add(&req->r_osd_item, &req->r_osd->o_requests);
+               list_add_tail(&req->r_osd_item, &req->r_osd->o_requests);
                __unregister_linger_request(osdc, req);
                dout("requeued lingering %p tid %llu osd%d\n", req, req->r_tid,
                     osd->o_osd);
@@ -1035,10 +1035,10 @@ static int __map_request(struct ceph_osd_client *osdc,
 
        if (req->r_osd) {
                __remove_osd_from_lru(req->r_osd);
-               list_add(&req->r_osd_item, &req->r_osd->o_requests);
-               list_move(&req->r_req_lru_item, &osdc->req_unsent);
+               list_add_tail(&req->r_osd_item, &req->r_osd->o_requests);
+               list_move_tail(&req->r_req_lru_item, &osdc->req_unsent);
        } else {
-               list_move(&req->r_req_lru_item, &osdc->req_notarget);
+               list_move_tail(&req->r_req_lru_item, &osdc->req_notarget);
        }
        err = 1;   /* osd or pg changed */