std::string tmp = ss.str();
std::vector<std::string> cmd = {tmp};
- auto kill_mds_session = [this, session_id, on_killed](){
+ auto kill_client_session = [this, session_id, wait, on_killed](){
assert(mds_lock.is_locked_by_me());
Session *session = sessionmap.get_session(
entity_name_t(CEPH_ENTITY_TYPE_CLIENT, session_id));
if (session) {
- if (on_killed) {
+ if (on_killed || !wait) {
server->kill_session(session, on_killed);
} else {
C_SaferCond on_safe;
}
};
- auto background_blacklist = [this, session_id, cmd](std::function<void ()> fn){
+ auto apply_blacklist = [this, cmd](std::function<void ()> fn){
assert(mds_lock.is_locked_by_me());
- Context *on_blacklist_done = new FunctionContext([this, session_id, fn](int r) {
+ Context *on_blacklist_done = new FunctionContext([this, fn](int r) {
objecter->wait_for_latest_osdmap(
new C_OnFinisher(
- new FunctionContext([this, session_id, fn](int r) {
+ new FunctionContext([this, fn](int r) {
Mutex::Locker l(mds_lock);
auto epoch = objecter->with_osdmap([](const OSDMap &o){
return o.get_epoch();
monc->start_mon_command(cmd, {}, nullptr, nullptr, on_blacklist_done);
};
- auto blocking_blacklist = [this, cmd, &err_ss, background_blacklist](){
- C_SaferCond inline_ctx;
- background_blacklist([&inline_ctx](){inline_ctx.complete(0);});
- mds_lock.Unlock();
- inline_ctx.wait();
- mds_lock.Lock();
- };
-
if (wait) {
if (blacklist) {
- blocking_blacklist();
+ C_SaferCond inline_ctx;
+ apply_blacklist([&inline_ctx](){inline_ctx.complete(0);});
+ mds_lock.Unlock();
+ inline_ctx.wait();
+ mds_lock.Lock();
}
// We dropped mds_lock, so check that session still exists
session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT,
- session_id));
+ session_id));
if (!session) {
dout(1) << "session " << session_id << " was removed while we waited "
"for blacklist" << dendl;
return true;
}
- kill_mds_session();
+ kill_client_session();
} else {
if (blacklist) {
- background_blacklist(kill_mds_session);
+ apply_blacklist(kill_client_session);
} else {
- kill_mds_session();
+ kill_client_session();
}
}