From: Yan, Zheng Date: Mon, 8 Apr 2019 02:47:40 +0000 (+0800) Subject: client: purge dirty data when session gets evicted X-Git-Tag: v16.1.0~2690^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0f74020b443d7c410fa1c295aec2a18b15d4713f;p=ceph.git client: purge dirty data when session gets evicted Signed-off-by: "Yan, Zheng" --- diff --git a/src/client/Client.cc b/src/client/Client.cc index f1848124a580..b8a67c1ce18a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2044,7 +2044,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) @@ -2054,7 +2054,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); if (s->state == MetaSession::STATE_CLOSED) mds_sessions.erase(s->mds_num); @@ -4121,7 +4121,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; @@ -4134,6 +4134,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); @@ -4148,6 +4149,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(); @@ -6011,7 +6026,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 83ee00cf844e..ea6ea86c95aa 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -648,7 +648,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(); @@ -783,7 +783,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);