Commit e7e607bd authored by Xiubo Li's avatar Xiubo Li Committed by Ilya Dryomov
Browse files

ceph: defer stopping mdsc delayed_work

Flushing the dirty buffer may take a long time if the cluster is
overloaded or if there is network issue. So we should ping the
MDSs periodically to keep alive, else the MDS will blocklist
the kclient.

Cc: stable@vger.kernel.org
Link: https://tracker.ceph.com/issues/61843


Signed-off-by: default avatarXiubo Li <xiubli@redhat.com>
Reviewed-by: default avatarMilind Changire <mchangir@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 5d0c230f
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4764,7 +4764,7 @@ static void delayed_work(struct work_struct *work)

	dout("mdsc delayed_work\n");

	if (mdsc->stopping)
	if (mdsc->stopping >= CEPH_MDSC_STOPPING_FLUSHED)
		return;

	mutex_lock(&mdsc->mutex);
@@ -4943,7 +4943,7 @@ void send_flush_mdlog(struct ceph_mds_session *s)
void ceph_mdsc_pre_umount(struct ceph_mds_client *mdsc)
{
	dout("pre_umount\n");
	mdsc->stopping = 1;
	mdsc->stopping = CEPH_MDSC_STOPPING_BEGIN;

	ceph_mdsc_iterate_sessions(mdsc, send_flush_mdlog, true);
	ceph_mdsc_iterate_sessions(mdsc, lock_unlock_session, false);
+5 −0
Original line number Diff line number Diff line
@@ -380,6 +380,11 @@ struct cap_wait {
	int			want;
};

enum {
       CEPH_MDSC_STOPPING_BEGIN = 1,
       CEPH_MDSC_STOPPING_FLUSHED = 2,
};

/*
 * mds client state
 */
+10 −0
Original line number Diff line number Diff line
@@ -1374,6 +1374,16 @@ static void ceph_kill_sb(struct super_block *s)
	ceph_mdsc_pre_umount(fsc->mdsc);
	flush_fs_workqueues(fsc);

	/*
	 * Though the kill_anon_super() will finally trigger the
	 * sync_filesystem() anyway, we still need to do it here
	 * and then bump the stage of shutdown to stop the work
	 * queue as earlier as possible.
	 */
	sync_filesystem(s);

	fsc->mdsc->stopping = CEPH_MDSC_STOPPING_FLUSHED;

	kill_anon_super(s);

	fsc->client->extra_mon_dispatch = NULL;