| 1995 | } |
| 1996 | |
| 1997 | void Objecter::close_session(OSDSession *s) |
| 1998 | { |
| 1999 | // rwlock is locked unique |
| 2000 | |
| 2001 | ldout(cct, 10) << "close_session for osd." << s->osd << dendl; |
| 2002 | if (s->con) { |
| 2003 | s->con->set_priv(NULL); |
| 2004 | s->con->mark_down(); |
| 2005 | logger->inc(l_osdc_osd_session_close); |
| 2006 | } |
| 2007 | unique_lock sl(s->lock); |
| 2008 | |
| 2009 | std::list<LingerOp*> homeless_lingers; |
| 2010 | std::list<CommandOp*> homeless_commands; |
| 2011 | std::list<Op*> homeless_ops; |
| 2012 | |
| 2013 | while (!s->linger_ops.empty()) { |
| 2014 | auto i = s->linger_ops.begin(); |
| 2015 | ldout(cct, 10) << " linger_op " << i->first << dendl; |
| 2016 | homeless_lingers.push_back(i->second); |
| 2017 | _session_linger_op_remove(s, i->second); |
| 2018 | } |
| 2019 | |
| 2020 | while (!s->ops.empty()) { |
| 2021 | auto i = s->ops.begin(); |
| 2022 | ldout(cct, 10) << " op " << i->first << dendl; |
| 2023 | homeless_ops.push_back(i->second); |
| 2024 | _session_op_remove(s, i->second); |
| 2025 | } |
| 2026 | |
| 2027 | while (!s->command_ops.empty()) { |
| 2028 | auto i = s->command_ops.begin(); |
| 2029 | ldout(cct, 10) << " command_op " << i->first << dendl; |
| 2030 | homeless_commands.push_back(i->second); |
| 2031 | _session_command_op_remove(s, i->second); |
| 2032 | } |
| 2033 | |
| 2034 | osd_sessions.erase(s->osd); |
| 2035 | sl.unlock(); |
| 2036 | put_session(s); |
| 2037 | |
| 2038 | // Assign any leftover ops to the homeless session |
| 2039 | { |
| 2040 | unique_lock hsl(homeless_session->lock); |
| 2041 | for (auto i = homeless_lingers.begin(); |
| 2042 | i != homeless_lingers.end(); ++i) { |
| 2043 | _session_linger_op_assign(homeless_session, *i); |
| 2044 | } |
| 2045 | for (auto i = homeless_ops.begin(); |
| 2046 | i != homeless_ops.end(); ++i) { |
| 2047 | _session_op_assign(homeless_session, *i); |
| 2048 | } |
| 2049 | for (auto i = homeless_commands.begin(); |
| 2050 | i != homeless_commands.end(); ++i) { |
| 2051 | _session_command_op_assign(homeless_session, *i); |
| 2052 | } |
| 2053 | } |
| 2054 | |