From: xiubli@redhat.com
To: jlayton@kernel.org
Cc: idryomov@gmail.com, pdonnell@redhat.com,
ceph-devel@vger.kernel.org, Xiubo Li <xiubli@redhat.com>
Subject: [PATCH] ceph: try to reconnect to the export targets
Date: Thu, 12 Aug 2021 12:10:42 +0800 [thread overview]
Message-ID: <20210812041042.132984-1-xiubli@redhat.com> (raw)
From: Xiubo Li <xiubli@redhat.com>
In case the export MDS is crashed just after the EImportStart journal
is flushed, so when a standby MDS takes over it and when replaying
the EImportStart journal the MDS will wait the client to reconnect,
but the client may never register/open the sessions yet.
We will try to reconnect that MDSes if they're in the export targets
and in RECONNECT state.
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---
fs/ceph/mds_client.c | 58 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 57 insertions(+), 1 deletion(-)
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 14e44de05812..7dfe7a804320 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -4182,13 +4182,24 @@ static void check_new_map(struct ceph_mds_client *mdsc,
struct ceph_mdsmap *newmap,
struct ceph_mdsmap *oldmap)
{
- int i;
+ int i, err;
+ int *export_targets;
int oldstate, newstate;
struct ceph_mds_session *s;
+ struct ceph_mds_info *m_info;
dout("check_new_map new %u old %u\n",
newmap->m_epoch, oldmap->m_epoch);
+ m_info = newmap->m_info;
+ export_targets = kcalloc(newmap->possible_max_rank, sizeof(int), GFP_NOFS);
+ if (export_targets && m_info) {
+ for (i = 0; i < m_info->num_export_targets; i++) {
+ BUG_ON(m_info->export_targets[i] >= newmap->possible_max_rank);
+ export_targets[m_info->export_targets[i]] = 1;
+ }
+ }
+
for (i = 0; i < oldmap->possible_max_rank && i < mdsc->max_sessions; i++) {
if (!mdsc->sessions[i])
continue;
@@ -4242,6 +4253,8 @@ static void check_new_map(struct ceph_mds_client *mdsc,
if (s->s_state == CEPH_MDS_SESSION_RESTARTING &&
newstate >= CEPH_MDS_STATE_RECONNECT) {
mutex_unlock(&mdsc->mutex);
+ if (export_targets)
+ export_targets[i] = 0;
send_mds_reconnect(mdsc, s);
mutex_lock(&mdsc->mutex);
}
@@ -4264,6 +4277,47 @@ static void check_new_map(struct ceph_mds_client *mdsc,
}
}
+ for (i = 0; i < newmap->possible_max_rank; i++) {
+ if (!export_targets)
+ break;
+
+ /*
+ * Only open and reconnect sessions that don't
+ * exist yet.
+ */
+ if (!export_targets[i] || __have_session(mdsc, i))
+ continue;
+
+ /*
+ * In case the export MDS is crashed just after
+ * the EImportStart journal is flushed, so when
+ * a standby MDS takes over it and is replaying
+ * the EImportStart journal the new MDS daemon
+ * will wait the client to reconnect it, but the
+ * client may never register/open the sessions
+ * yet.
+ *
+ * It will try to reconnect that MDS daemons if
+ * the MDSes are in the export targets and is the
+ * RECONNECT state.
+ */
+ newstate = ceph_mdsmap_get_state(newmap, i);
+ if (newstate != CEPH_MDS_STATE_RECONNECT)
+ continue;
+ s = __open_export_target_session(mdsc, i);
+ if (IS_ERR(s)) {
+ err = PTR_ERR(s);
+ pr_err("failed to open export target session, err %d\n",
+ err);
+ continue;
+ }
+ dout("send reconnect to target mds.%d\n", i);
+ mutex_unlock(&mdsc->mutex);
+ send_mds_reconnect(mdsc, s);
+ mutex_lock(&mdsc->mutex);
+ ceph_put_mds_session(s);
+ }
+
for (i = 0; i < newmap->possible_max_rank && i < mdsc->max_sessions; i++) {
s = mdsc->sessions[i];
if (!s)
@@ -4278,6 +4332,8 @@ static void check_new_map(struct ceph_mds_client *mdsc,
__open_export_target_sessions(mdsc, s);
}
}
+
+ kfree(export_targets);
}
--
2.27.0
next reply other threads:[~2021-08-12 4:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-12 4:10 xiubli [this message]
2021-08-16 12:05 ` [PATCH] ceph: try to reconnect to the export targets Jeff Layton
2021-08-17 3:03 ` Xiubo Li
2021-08-17 17:56 ` Gregory Farnum
2021-08-17 18:14 ` Jeff Layton
2021-08-17 18:48 ` Gregory Farnum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210812041042.132984-1-xiubli@redhat.com \
--to=xiubli@redhat.com \
--cc=ceph-devel@vger.kernel.org \
--cc=idryomov@gmail.com \
--cc=jlayton@kernel.org \
--cc=pdonnell@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).