[Pkg-ceph-commits] [ceph] 03/04: New patches to fix ceph-fuse recover from sleep, fixes [#8291]
Dmitry Smirnov
onlyjob at moszumanska.debian.org
Wed May 14 01:52:31 UTC 2014
This is an automated email from the git hooks/post-receive script.
onlyjob pushed a commit to branch master
in repository ceph.
commit 9655f7f
Author: Dmitry Smirnov <onlyjob at member.fsf.org>
Date: Tue May 13 03:22:57 2014
New patches to fix ceph-fuse recover from sleep, fixes [#8291]
Thanks, Yan, Zheng.
---
debian/patches/client-sleep1.patch | 46 ++++++++++++++++++++++++++++++++++++++
debian/patches/client-sleep2.patch | 41 +++++++++++++++++++++++++++++++++
debian/patches/client-sleep3.patch | 44 ++++++++++++++++++++++++++++++++++++
debian/patches/series | 4 ++++
debian/patches/sleep-recover.patch | 18 +++++++++++++++
5 files changed, 153 insertions(+)
diff --git a/debian/patches/client-sleep1.patch b/debian/patches/client-sleep1.patch
new file mode 100644
index 0000000..ed04bde
--- /dev/null
+++ b/debian/patches/client-sleep1.patch
@@ -0,0 +1,46 @@
+From b8aa58af793bea4ed1a150ac5bf554fc894774f1 Mon Sep 17 00:00:00 2001
+From: "Yan, Zheng" <zheng.z.yan at intel.com>
+Date: Fri, 11 Apr 2014 15:34:25 +0800
+Subject: [PATCH] client: drop dirty/flushing caps if auth MDS' session is
+ reset
+
+Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+---
+ src/client/Client.cc | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+--- a/src/client/Client.cc
++++ b/src/client/Client.cc
+@@ -3074,14 +3074,29 @@
+ while (!in->caps.empty())
+ remove_cap(in->caps.begin()->second, true);
+ }
+
+-void Client::remove_session_caps(MetaSession *mds)
++void Client::remove_session_caps(MetaSession *s)
+ {
+- while (mds->caps.size()) {
+- Cap *cap = *mds->caps.begin();
++ ldout(cct, 10) << "remove_session_caps mds." << s->mds_num << dendl;
++
++ while (s->caps.size()) {
++ Cap *cap = *s->caps.begin();
++ Inode *in = cap->inode;
++ int dirty_caps = 0;
++ if (in->auth_cap == cap)
++ dirty_caps = in->dirty_caps | in->flushing_caps;
+ remove_cap(cap, false);
++ if (dirty_caps) {
++ lderr(cct) << "remove_session_caps still has dirty|flushing caps on " << *in << dendl;
++ if (in->flushing_caps)
++ num_flushing_caps--;
++ in->flushing_caps = 0;
++ in->dirty_caps = 0;
++ put_inode(in);
++ }
+ }
++ sync_cond.Signal();
+ }
+
+ void Client::trim_caps(MetaSession *s, int max)
+ {
diff --git a/debian/patches/client-sleep2.patch b/debian/patches/client-sleep2.patch
new file mode 100644
index 0000000..4e0a260
--- /dev/null
+++ b/debian/patches/client-sleep2.patch
@@ -0,0 +1,41 @@
+From 70ab0793cc7d2d75ac942efb677a0b3297d3792a Mon Sep 17 00:00:00 2001
+From: "Yan, Zheng" <zheng.z.yan at intel.com>
+Date: Fri, 11 Apr 2014 16:31:29 +0800
+Subject: [PATCH] client: wake up cap waiters if MDS session is reset
+
+Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+---
+ src/client/Client.cc | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/src/client/Client.cc
++++ b/src/client/Client.cc
+@@ -2351,8 +2351,11 @@
+
+ int Client::get_caps(Inode *in, int need, int want, int *phave, loff_t endoff)
+ {
+ while (1) {
++ if (!in->is_any_caps())
++ return -ESTALE;
++
+ if (endoff > 0 &&
+ (endoff >= (loff_t)in->max_size ||
+ endoff > (loff_t)(in->size << 1)) &&
+ endoff > (loff_t)in->wanted_max_size) {
+@@ -3082,11 +3085,15 @@
+ while (s->caps.size()) {
+ Cap *cap = *s->caps.begin();
+ Inode *in = cap->inode;
+ int dirty_caps = 0;
+- if (in->auth_cap == cap)
++ if (in->auth_cap == cap) {
+ dirty_caps = in->dirty_caps | in->flushing_caps;
++ in->wanted_max_size = 0;
++ in->requested_max_size = 0;
++ }
+ remove_cap(cap, false);
++ signal_cond_list(in->waitfor_caps);
+ if (dirty_caps) {
+ lderr(cct) << "remove_session_caps still has dirty|flushing caps on " << *in << dendl;
+ if (in->flushing_caps)
+ num_flushing_caps--;
diff --git a/debian/patches/client-sleep3.patch b/debian/patches/client-sleep3.patch
new file mode 100644
index 0000000..a3f4827
--- /dev/null
+++ b/debian/patches/client-sleep3.patch
@@ -0,0 +1,44 @@
+From 3e41f92b8439fcae33f412c7b833a7233e1faecb Mon Sep 17 00:00:00 2001
+From: "Yan, Zheng" <zheng.z.yan at intel.com>
+Date: Fri, 11 Apr 2014 16:42:42 +0800
+Subject: [PATCH] client: cleanup unsafe requests if MDS session is reset
+
+Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+---
+ src/client/Client.cc | 22 ++++++++++++++--------
+ 1 file changed, 14 insertions(+), 8 deletions(-)
+
+--- a/src/client/Client.cc
++++ b/src/client/Client.cc
+@@ -2089,17 +2089,23 @@
+ void Client::kick_requests_closed(MetaSession *session)
+ {
+ ldout(cct, 10) << "kick_requests_closed for mds." << session->mds_num << dendl;
+ for (map<ceph_tid_t, MetaRequest*>::iterator p = mds_requests.begin();
+- p != mds_requests.end();
+- ++p) {
+- if (p->second->mds == session->mds_num) {
+- if (p->second->caller_cond) {
+- p->second->kick = true;
+- p->second->caller_cond->Signal();
++ p != mds_requests.end(); ) {
++ MetaRequest *req = p->second;
++ ++p;
++ if (req->mds == session->mds_num) {
++ if (req->caller_cond) {
++ req->kick = true;
++ req->caller_cond->Signal();
++ }
++ req->item.remove_myself();
++ if (req->got_unsafe) {
++ lderr(cct) << "kick_requests_closed removing unsafe request " << req->get_tid() << dendl;
++ req->unsafe_item.remove_myself();
++ mds_requests.erase(req->get_tid());
++ put_request(req);
+ }
+- p->second->item.remove_myself();
+- p->second->unsafe_item.remove_myself();
+ }
+ }
+ assert(session->requests.empty());
+ assert(session->unsafe_requests.empty());
diff --git a/debian/patches/series b/debian/patches/series
index dc715d7..726dca3 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,4 +1,8 @@
## Backported
+client-sleep1.patch
+client-sleep2.patch
+client-sleep3.patch
+sleep-recover.patch
8113.patch
8175.patch
8282.patch
diff --git a/debian/patches/sleep-recover.patch b/debian/patches/sleep-recover.patch
new file mode 100644
index 0000000..940c3b8
--- /dev/null
+++ b/debian/patches/sleep-recover.patch
@@ -0,0 +1,18 @@
+Last-Update: 2014-05-12
+Forwarded: not-needed
+Bug-Ceph: http://tracker.ceph.com/issues/8291
+Author: Yan, Zheng <ukernel at gmail.com>
+Description: fix fuse-client hang after wake-up from suspend.
+
+--- a/src/client/Client.cc
++++ b/src/client/Client.cc
+@@ -9014,8 +9014,9 @@
+
+ case MetaSession::STATE_OPEN:
+ ldout(cct, 1) << "reset from mds we were open; mark session as stale" << dendl;
+ s->state = MetaSession::STATE_STALE;
++ _closed_mds_session(s);
+ break;
+
+ case MetaSession::STATE_NEW:
+ case MetaSession::STATE_CLOSED:
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ceph/ceph.git
More information about the Pkg-ceph-commits
mailing list