summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2011-05-12 18:29:18 +0200
committerSage Weil <sage@newdream.net>2011-05-24 20:52:11 +0200
commitcd634fb6eec72ef8e6dd677546b8d0ffdd2501eb (patch)
tree7f0213063830d24d77a1ad0a6a9abfa4f83a5d7d
parentlibceph: handle new osdmap down/state change encoding (diff)
downloadlinux-cd634fb6eec72ef8e6dd677546b8d0ffdd2501eb.tar.xz
linux-cd634fb6eec72ef8e6dd677546b8d0ffdd2501eb.zip
libceph: subscribe to osdmap when cluster is full
When the cluster is marked full, subscribe to subsequent map updates to ensure we find out promptly when it is no longer full. This will prevent us from spewing ENOSPC for (much) longer than necessary. Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r--net/ceph/osd_client.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index caa092eb0009..6ea2b892f44b 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -1421,6 +1421,15 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
done:
downgrade_write(&osdc->map_sem);
ceph_monc_got_osdmap(&osdc->client->monc, osdc->osdmap->epoch);
+
+ /*
+ * subscribe to subsequent osdmap updates if full to ensure
+ * we find out when we are no longer full and stop returning
+ * ENOSPC.
+ */
+ if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL))
+ ceph_monc_request_next_osdmap(&osdc->client->monc);
+
send_queued(osdc);
up_read(&osdc->map_sem);
wake_up_all(&osdc->client->auth_wq);