diff options
author | Yehuda Sadeh <yehuda@hq.newdream.net> | 2012-05-02 17:33:43 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@hq.newdream.net> | 2012-05-02 23:01:42 -0700 |
commit | be855d8524014f2ff7a9c806f3ae4ca15caffa5e (patch) | |
tree | 6ad83ac5ebaba605c5406eecc7d14830ea0b3c10 /src/osdc | |
parent | 606fdf4788aeefdd3fe9dd78667c1fa9e01b63d8 (diff) | |
download | ceph-be855d8524014f2ff7a9c806f3ae4ca15caffa5e.tar.gz |
objecter: ping connections with lingering ops every tick()
Also, make sure that we initialize linger_op.session once
we have it.
Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Diffstat (limited to 'src/osdc')
-rw-r--r-- | src/osdc/Objecter.cc | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 11e86d8bf28..e81bfff43fb 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -265,6 +265,13 @@ void Objecter::send_linger(LingerOp *info) } } op_submit(o, info->session); + OSDSession *s = o->session; + if (info->session != s) { + info->session_item.remove_myself(); + info->session = s; + if (info->session) + s->linger_ops.push_back(&info->session_item); + } info->registering = true; logger->inc(l_osdc_linger_send); @@ -780,6 +787,17 @@ void Objecter::tick() ++laggy_ops; } } + for (map<uint64_t,LingerOp*>::iterator p = linger_ops.begin(); + p != linger_ops.end(); + p++) { + LingerOp *op = p->second; + if (op->session) { + ldout(cct, 0) << " pinging osd that serves lingering tid " << p->first << " (osd." << op->session->osd << ")" << dendl; + toping.insert(op->session); + } else { + ldout(cct, 0) << " lingering tid " << p->first << " does not have session" << dendl; + } + } logger->set(l_osdc_op_laggy, laggy_ops); logger->set(l_osdc_osd_laggy, toping.size()); @@ -791,8 +809,9 @@ void Objecter::tick() // (osd reply message policy is lossy) for (set<OSDSession*>::iterator i = toping.begin(); i != toping.end(); - i++) + i++) { messenger->send_message(new MPing, (*i)->con); + } } // reschedule |