mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
libceph, rbd: ceph_osd_linger_request, watch/notify v2
This adds support and switches rbd to a new, more reliable version of watch/notify protocol. As with the OSD client update, this is mostly about getting the right structures linked into the right places so that reconnects are properly sent when needed. watch/notify v2 also requires sending regular pings to the OSDs - send_linger_ping(). A major change from the old watch/notify implementation is the introduction of ceph_osd_linger_request - linger requests no longer piggy back on ceph_osd_request. ceph_osd_event has been merged into ceph_osd_linger_request. All the details are now hidden within libceph, the interface consists of a simple pair of watch/unwatch functions and ceph_osdc_notify_ack(). ceph_osdc_watch() does return ceph_osd_linger_request, but only to keep the lifetime management simple. ceph_osdc_notify_ack() accepts an optional data payload, which is relayed back to the notifier. Portions of this patch are loosely based on work by Douglas Fuller <[email protected]> and Mike Christie <[email protected]>. Signed-off-by: Ilya Dryomov <[email protected]>
This commit is contained in:
parent
c525f03601
commit
922dab6134
7 changed files with 1067 additions and 431 deletions
|
|
@ -27,6 +27,22 @@ __CEPH_FORALL_OSD_OPS(GENERATE_CASE)
|
|||
}
|
||||
}
|
||||
|
||||
const char *ceph_osd_watch_op_name(int o)
|
||||
{
|
||||
switch (o) {
|
||||
case CEPH_OSD_WATCH_OP_UNWATCH:
|
||||
return "unwatch";
|
||||
case CEPH_OSD_WATCH_OP_WATCH:
|
||||
return "watch";
|
||||
case CEPH_OSD_WATCH_OP_RECONNECT:
|
||||
return "reconnect";
|
||||
case CEPH_OSD_WATCH_OP_PING:
|
||||
return "ping";
|
||||
default:
|
||||
return "???";
|
||||
}
|
||||
}
|
||||
|
||||
const char *ceph_osd_state_name(int s)
|
||||
{
|
||||
switch (s) {
|
||||
|
|
|
|||
|
|
@ -177,6 +177,9 @@ static void dump_request(struct seq_file *s, struct ceph_osd_request *req)
|
|||
|
||||
seq_printf(s, "%s%s", (i == 0 ? "\t" : ","),
|
||||
ceph_osd_op_name(op->op));
|
||||
if (op->op == CEPH_OSD_OP_WATCH)
|
||||
seq_printf(s, "-%s",
|
||||
ceph_osd_watch_op_name(op->watch.op));
|
||||
}
|
||||
|
||||
seq_putc(s, '\n');
|
||||
|
|
@ -197,6 +200,31 @@ static void dump_requests(struct seq_file *s, struct ceph_osd *osd)
|
|||
mutex_unlock(&osd->lock);
|
||||
}
|
||||
|
||||
static void dump_linger_request(struct seq_file *s,
|
||||
struct ceph_osd_linger_request *lreq)
|
||||
{
|
||||
seq_printf(s, "%llu\t", lreq->linger_id);
|
||||
dump_target(s, &lreq->t);
|
||||
|
||||
seq_printf(s, "\t%u\t%s/%d\n", lreq->register_gen,
|
||||
lreq->committed ? "C" : "", lreq->last_error);
|
||||
}
|
||||
|
||||
static void dump_linger_requests(struct seq_file *s, struct ceph_osd *osd)
|
||||
{
|
||||
struct rb_node *n;
|
||||
|
||||
mutex_lock(&osd->lock);
|
||||
for (n = rb_first(&osd->o_linger_requests); n; n = rb_next(n)) {
|
||||
struct ceph_osd_linger_request *lreq =
|
||||
rb_entry(n, struct ceph_osd_linger_request, node);
|
||||
|
||||
dump_linger_request(s, lreq);
|
||||
}
|
||||
|
||||
mutex_unlock(&osd->lock);
|
||||
}
|
||||
|
||||
static int osdc_show(struct seq_file *s, void *pp)
|
||||
{
|
||||
struct ceph_client *client = s->private;
|
||||
|
|
@ -214,6 +242,14 @@ static int osdc_show(struct seq_file *s, void *pp)
|
|||
}
|
||||
dump_requests(s, &osdc->homeless_osd);
|
||||
|
||||
seq_puts(s, "LINGER REQUESTS\n");
|
||||
for (n = rb_first(&osdc->osds); n; n = rb_next(n)) {
|
||||
struct ceph_osd *osd = rb_entry(n, struct ceph_osd, o_node);
|
||||
|
||||
dump_linger_requests(s, osd);
|
||||
}
|
||||
dump_linger_requests(s, &osdc->homeless_osd);
|
||||
|
||||
up_read(&osdc->lock);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue