[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