s->con->send_message2(make_message<MClientSession>(CEPH_SESSION_REQUEST_CLOSE, s->seq));
}
-void Client::_closed_mds_session(MetaSession *s, bool rejected)
+void Client::_closed_mds_session(MetaSession *s, int err, bool rejected)
{
ldout(cct, 5) << __func__ << " mds." << s->mds_num << " seq " << s->seq << dendl;
if (rejected && s->state != MetaSession::STATE_CLOSING)
s->con->mark_down();
signal_context_list(s->waiting_for_open);
mount_cond.notify_all();
- remove_session_caps(s);
+ remove_session_caps(s, err);
kick_requests_closed(s);
if (s->state == MetaSession::STATE_CLOSED)
mds_sessions.erase(s->mds_num);
remove_cap(&in->caps.begin()->second, true);
}
-void Client::remove_session_caps(MetaSession *s)
+void Client::remove_session_caps(MetaSession *s, int err)
{
ldout(cct, 10) << __func__ << " mds." << s->mds_num << dendl;
in->wanted_max_size = 0;
in->requested_max_size = 0;
}
+ auto caps = cap->implemented;
if (cap->wanted | cap->issued)
in->flags |= I_CAP_DROPPED;
remove_cap(cap, false);
in->mark_caps_clean();
put_inode(in.get());
}
+ caps &= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_BUFFER;
+ if (caps && !in->caps_issued_mask(caps, true)) {
+ if (err == -EBLACKLISTED) {
+ if (in->oset.dirty_or_tx) {
+ lderr(cct) << __func__ << " still has dirty data on " << *in << dendl;
+ in->set_async_err(err);
+ }
+ objectcacher->purge_set(&in->oset);
+ } else {
+ objectcacher->release_set(&in->oset);
+ }
+ _schedule_invalidate_callback(in.get(), 0, 0);
+ }
+
signal_cond_list(in->waitfor_caps);
}
s->flushing_caps_tids.clear();
// Force-close all sessions
while(!mds_sessions.empty()) {
auto& session = mds_sessions.begin()->second;
- _closed_mds_session(&session);
+ _closed_mds_session(&session, err);
}
}
inodeno_t realm, int flags, const UserPerm& perms);
void remove_cap(Cap *cap, bool queue_release);
void remove_all_caps(Inode *in);
- void remove_session_caps(MetaSession *session);
+ void remove_session_caps(MetaSession *session, int err);
int mark_caps_flushing(Inode *in, ceph_tid_t *ptid);
void adjust_session_flushing_caps(Inode *in, MetaSession *old_s, MetaSession *new_s);
void flush_caps_sync();
MetaSession *_get_or_open_mds_session(mds_rank_t mds);
MetaSession *_open_mds_session(mds_rank_t mds);
void _close_mds_session(MetaSession *s);
- void _closed_mds_session(MetaSession *s, bool rejected=false);
+ void _closed_mds_session(MetaSession *s, int err=0, bool rejected=false);
bool _any_stale_sessions() const;
void _kick_stale_sessions();
void handle_client_session(const MConstRef<MClientSession>& m);