From b486202e98539fb347f0e10f2872c442050f5f73 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 8 Apr 2019 10:47:40 +0800 Subject: [PATCH] client: purge dirty data when session gets evicted Signed-off-by: "Yan, Zheng" (cherry picked from commit 0f74020b443d7c410fa1c295aec2a18b15d4713f) --- src/client/Client.cc | 23 +++++++++++++++++++---- src/client/Client.h | 4 ++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index b638fb7fd78..7eb574634fe 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2063,7 +2063,7 @@ void Client::_close_mds_session(MetaSession *s) s->con->send_message2(make_message(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) @@ -2073,7 +2073,7 @@ void Client::_closed_mds_session(MetaSession *s, bool rejected) 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); mds_ranks_closing.erase(s->mds_num); if (s->state == MetaSession::STATE_CLOSED) @@ -4151,7 +4151,7 @@ void Client::remove_all_caps(Inode *in) 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; @@ -4164,6 +4164,7 @@ void Client::remove_session_caps(MetaSession *s) 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); @@ -4178,6 +4179,20 @@ void Client::remove_session_caps(MetaSession *s) 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(); @@ -6096,7 +6111,7 @@ void Client::_abort_mds_sessions(int err) // Force-close all sessions while(!mds_sessions.empty()) { auto& session = mds_sessions.begin()->second; - _closed_mds_session(&session); + _closed_mds_session(&session, err); } } diff --git a/src/client/Client.h b/src/client/Client.h index b4393039f26..55e123e54d0 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -627,7 +627,7 @@ public: 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(); @@ -766,7 +766,7 @@ protected: 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& m); -- 2.47.3