|
@@ -1643,14 +1643,17 @@ static void reset_changed_osds(struct ceph_osd_client *osdc)
|
|
|
*
|
|
|
* Caller should hold map_sem for read.
|
|
|
*/
|
|
|
-static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
|
|
+static void kick_requests(struct ceph_osd_client *osdc, bool force_resend,
|
|
|
+ bool force_resend_writes)
|
|
|
{
|
|
|
struct ceph_osd_request *req, *nreq;
|
|
|
struct rb_node *p;
|
|
|
int needmap = 0;
|
|
|
int err;
|
|
|
+ bool force_resend_req;
|
|
|
|
|
|
- dout("kick_requests %s\n", force_resend ? " (force resend)" : "");
|
|
|
+ dout("kick_requests %s %s\n", force_resend ? " (force resend)" : "",
|
|
|
+ force_resend_writes ? " (force resend writes)" : "");
|
|
|
mutex_lock(&osdc->request_mutex);
|
|
|
for (p = rb_first(&osdc->requests); p; ) {
|
|
|
req = rb_entry(p, struct ceph_osd_request, r_node);
|
|
@@ -1675,7 +1678,10 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- err = __map_request(osdc, req, force_resend);
|
|
|
+ force_resend_req = force_resend ||
|
|
|
+ (force_resend_writes &&
|
|
|
+ req->r_flags & CEPH_OSD_FLAG_WRITE);
|
|
|
+ err = __map_request(osdc, req, force_resend_req);
|
|
|
if (err < 0)
|
|
|
continue; /* error */
|
|
|
if (req->r_osd == NULL) {
|
|
@@ -1695,7 +1701,8 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
|
|
r_linger_item) {
|
|
|
dout("linger req=%p req->r_osd=%p\n", req, req->r_osd);
|
|
|
|
|
|
- err = __map_request(osdc, req, 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 */
|
|
@@ -1737,6 +1744,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
|
|
struct ceph_osdmap *newmap = NULL, *oldmap;
|
|
|
int err;
|
|
|
struct ceph_fsid fsid;
|
|
|
+ bool was_full;
|
|
|
|
|
|
dout("handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0);
|
|
|
p = msg->front.iov_base;
|
|
@@ -1750,6 +1758,8 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
|
|
|
|
|
down_write(&osdc->map_sem);
|
|
|
|
|
|
+ was_full = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL);
|
|
|
+
|
|
|
/* incremental maps */
|
|
|
ceph_decode_32_safe(&p, end, nr_maps, bad);
|
|
|
dout(" %d inc maps\n", nr_maps);
|
|
@@ -1774,7 +1784,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
|
|
ceph_osdmap_destroy(osdc->osdmap);
|
|
|
osdc->osdmap = newmap;
|
|
|
}
|
|
|
- kick_requests(osdc, 0);
|
|
|
+ was_full = was_full ||
|
|
|
+ ceph_osdmap_flag(osdc->osdmap,
|
|
|
+ CEPH_OSDMAP_FULL);
|
|
|
+ kick_requests(osdc, 0, was_full);
|
|
|
} else {
|
|
|
dout("ignoring incremental map %u len %d\n",
|
|
|
epoch, maplen);
|
|
@@ -1817,7 +1830,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
|
|
skipped_map = 1;
|
|
|
ceph_osdmap_destroy(oldmap);
|
|
|
}
|
|
|
- kick_requests(osdc, skipped_map);
|
|
|
+ was_full = was_full ||
|
|
|
+ ceph_osdmap_flag(osdc->osdmap,
|
|
|
+ CEPH_OSDMAP_FULL);
|
|
|
+ kick_requests(osdc, skipped_map, was_full);
|
|
|
}
|
|
|
p += maplen;
|
|
|
nr_maps--;
|