|
@@ -2017,20 +2017,29 @@ static void kick_requests(struct ceph_osd_client *osdc, bool force_resend,
|
|
|
err = __map_request(osdc, req,
|
|
|
force_resend || force_resend_writes);
|
|
|
dout("__map_request returned %d\n", err);
|
|
|
- if (err == 0)
|
|
|
- continue; /* no change and no osd was specified */
|
|
|
if (err < 0)
|
|
|
continue; /* hrm! */
|
|
|
- if (req->r_osd == NULL) {
|
|
|
- dout("tid %llu maps to no valid osd\n", req->r_tid);
|
|
|
- needmap++; /* request a newer map */
|
|
|
- continue;
|
|
|
- }
|
|
|
+ if (req->r_osd == NULL || err > 0) {
|
|
|
+ if (req->r_osd == NULL) {
|
|
|
+ dout("lingering %p tid %llu maps to no osd\n",
|
|
|
+ req, req->r_tid);
|
|
|
+ /*
|
|
|
+ * A homeless lingering request makes
|
|
|
+ * no sense, as it's job is to keep
|
|
|
+ * a particular OSD connection open.
|
|
|
+ * Request a newer map and kick the
|
|
|
+ * request, knowing that it won't be
|
|
|
+ * resent until we actually get a map
|
|
|
+ * that can tell us where to send it.
|
|
|
+ */
|
|
|
+ needmap++;
|
|
|
+ }
|
|
|
|
|
|
- dout("kicking lingering %p tid %llu osd%d\n", req, req->r_tid,
|
|
|
- req->r_osd ? req->r_osd->o_osd : -1);
|
|
|
- __register_request(osdc, req);
|
|
|
- __unregister_linger_request(osdc, req);
|
|
|
+ dout("kicking lingering %p tid %llu osd%d\n", req,
|
|
|
+ req->r_tid, req->r_osd ? req->r_osd->o_osd : -1);
|
|
|
+ __register_request(osdc, req);
|
|
|
+ __unregister_linger_request(osdc, req);
|
|
|
+ }
|
|
|
}
|
|
|
reset_changed_osds(osdc);
|
|
|
mutex_unlock(&osdc->request_mutex);
|