{
ldout(cct, 10) << "kick_requests for osd." << session->osd << dendl;
+ map<uint64_t, LingerOp *> lresend;
RWLock::WLocker wl(rwlock);
- _kick_requests(session);
+ session->lock.get_write();
+ _kick_requests(session, lresend);
+ session->lock.unlock();
+
+ _linger_ops_resend(lresend);
}
-void Objecter::_kick_requests(OSDSession *session)
+void Objecter::_kick_requests(OSDSession *session, map<uint64_t, LingerOp *>& lresend)
{
assert(rwlock.is_locked());
- session->lock.get_write();
-
// resend ops
map<ceph_tid_t,Op*> resend; // resend in tid order
for (map<ceph_tid_t, Op*>::iterator p = session->ops.begin(); p != session->ops.end();) {
}
// resend lingers
- map<uint64_t, LingerOp*> lresend; // resend in order
for (map<ceph_tid_t, LingerOp*>::iterator j = session->linger_ops.begin(); j != session->linger_ops.end(); ++j) {
LingerOp *op = j->second;
op->get();
_send_command(cresend.begin()->second);
cresend.erase(cresend.begin());
}
- session->lock.unlock();
+}
+
+void Objecter::_linger_ops_resend(map<uint64_t, LingerOp *>& lresend)
+{
+ assert(rwlock.is_locked());
while (!lresend.empty()) {
LingerOp *op = lresend.begin()->second;
map<int,OSDSession*>::iterator p = osd_sessions.find(osd);
if (p != osd_sessions.end()) {
OSDSession *session = p->second;
+ map<uint64_t, LingerOp *> lresend;
session->lock.get_write();
_reopen_session(session);
- _kick_requests(session);
+ _kick_requests(session, lresend);
session->lock.unlock();
+ _linger_ops_resend(lresend);
rwlock.unlock();
maybe_request_map();
} else {
void _command_cancel_map_check(CommandOp *op);
void kick_requests(OSDSession *session);
- void _kick_requests(OSDSession *session);
+ void _kick_requests(OSDSession *session, map<uint64_t, LingerOp *>& lresend);
+ void _linger_ops_resend(map<uint64_t, LingerOp *>& lresend);
int _get_session(int osd, OSDSession **session, RWLock::Context& lc);
void put_session(OSDSession *s);