|
@@ -891,7 +891,9 @@ static void __register_linger_request(struct ceph_osd_client *osdc,
|
|
{
|
|
{
|
|
dout("__register_linger_request %p\n", req);
|
|
dout("__register_linger_request %p\n", req);
|
|
list_add_tail(&req->r_linger_item, &osdc->req_linger);
|
|
list_add_tail(&req->r_linger_item, &osdc->req_linger);
|
|
- list_add_tail(&req->r_linger_osd, &req->r_osd->o_linger_requests);
|
|
|
|
|
|
+ if (req->r_osd)
|
|
|
|
+ list_add_tail(&req->r_linger_osd,
|
|
|
|
+ &req->r_osd->o_linger_requests);
|
|
}
|
|
}
|
|
|
|
|
|
static void __unregister_linger_request(struct ceph_osd_client *osdc,
|
|
static void __unregister_linger_request(struct ceph_osd_client *osdc,
|
|
@@ -1305,8 +1307,9 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
|
|
|
|
|
dout("kick_requests %s\n", force_resend ? " (force resend)" : "");
|
|
dout("kick_requests %s\n", force_resend ? " (force resend)" : "");
|
|
mutex_lock(&osdc->request_mutex);
|
|
mutex_lock(&osdc->request_mutex);
|
|
- for (p = rb_first(&osdc->requests); p; p = rb_next(p)) {
|
|
|
|
|
|
+ for (p = rb_first(&osdc->requests); p; ) {
|
|
req = rb_entry(p, struct ceph_osd_request, r_node);
|
|
req = rb_entry(p, struct ceph_osd_request, r_node);
|
|
|
|
+ p = rb_next(p);
|
|
err = __map_request(osdc, req, force_resend);
|
|
err = __map_request(osdc, req, force_resend);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
continue; /* error */
|
|
continue; /* error */
|
|
@@ -1314,10 +1317,23 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
|
dout("%p tid %llu maps to no osd\n", req, req->r_tid);
|
|
dout("%p tid %llu maps to no osd\n", req, req->r_tid);
|
|
needmap++; /* request a newer map */
|
|
needmap++; /* request a newer map */
|
|
} else if (err > 0) {
|
|
} else if (err > 0) {
|
|
- dout("%p tid %llu requeued on osd%d\n", req, req->r_tid,
|
|
|
|
- req->r_osd ? req->r_osd->o_osd : -1);
|
|
|
|
- if (!req->r_linger)
|
|
|
|
|
|
+ if (!req->r_linger) {
|
|
|
|
+ dout("%p tid %llu requeued on osd%d\n", req,
|
|
|
|
+ req->r_tid,
|
|
|
|
+ req->r_osd ? req->r_osd->o_osd : -1);
|
|
req->r_flags |= CEPH_OSD_FLAG_RETRY;
|
|
req->r_flags |= CEPH_OSD_FLAG_RETRY;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (req->r_linger && list_empty(&req->r_linger_item)) {
|
|
|
|
+ /*
|
|
|
|
+ * register as a linger so that we will
|
|
|
|
+ * re-submit below and get a new tid
|
|
|
|
+ */
|
|
|
|
+ dout("%p tid %llu restart on osd%d\n",
|
|
|
|
+ req, req->r_tid,
|
|
|
|
+ req->r_osd ? req->r_osd->o_osd : -1);
|
|
|
|
+ __register_linger_request(osdc, req);
|
|
|
|
+ __unregister_request(osdc, req);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|