libceph: send queued requests when starting new one
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:21 +0000 (21:17 -0700)
An osd expects the transaction ids of arriving request messages from
a given client to a given osd to increase monotonically.  So the osd
client needs to send its requests in ascending tid order.

The transaction id for a request is set at the time it is
registered, in __register_request().  This is also where the request
gets placed at the end of the osd client's unsent messages list.

At the end of ceph_osdc_start_request(), the request message for a
newly-mapped osd request is supplied to the messenger to be sent
(via __send_request()).  If any other messages were present in the
osd client's unsent list at that point they would be sent *after*
this new request message.

Because those unsent messages have already been registered, their
tids would be lower than the newly-mapped request message, and
sending that message first can violate the tid ordering rule.

Rather than sending the new request only, send all queued requests
(including the new one) at that point in ceph_osdc_start_request().
This ensures the tid ordering property is preserved.

With this in place, all messages should now be sent in tid order
regardless of whether they're being sent for the first time or
re-sent as a result of a call to osd_reset().

This 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 356f7bc4ae4b92cf0e69038d690e903ace7e5076..3b6657fe99b1e9e7526f5b41d8c65ade38913e76 100644 (file)
@@ -1819,7 +1819,7 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc,
                dout("send_request %p no up osds in pg\n", req);
                ceph_monc_request_next_osdmap(&osdc->client->monc);
        } else {
-               __send_request(osdc, req);
+               __send_queued(osdc);
        }
        rc = 0;
 out_unlock:
This page took 0.036953 seconds and 5 git commands to generate.