提交 2a8e5e36 编写于 作者: S Sage Weil

ceph: clean up on forwarded aborted mds request

If an mds request is aborted (timeout, SIGKILL), it is left registered to
keep our state in sync with the mds.  If we get a forward notification,
though, we know the request didn't succeed and we can unregister it
safely.  We were trying to resend it, but then bailing out (and not
unregistering) in __do_request.
Signed-off-by: NSage Weil <sage@newdream.net>
上级 79494d1b
...@@ -2014,16 +2014,21 @@ static void handle_forward(struct ceph_mds_client *mdsc, ...@@ -2014,16 +2014,21 @@ static void handle_forward(struct ceph_mds_client *mdsc,
mutex_lock(&mdsc->mutex); mutex_lock(&mdsc->mutex);
req = __lookup_request(mdsc, tid); req = __lookup_request(mdsc, tid);
if (!req) { if (!req) {
dout("forward %llu to mds%d - req dne\n", tid, next_mds); dout("forward tid %llu to mds%d - req dne\n", tid, next_mds);
goto out; /* dup reply? */ goto out; /* dup reply? */
} }
if (fwd_seq <= req->r_num_fwd) { if (req->r_aborted) {
dout("forward %llu to mds%d - old seq %d <= %d\n", dout("forward tid %llu aborted, unregistering\n", tid);
__unregister_request(mdsc, req);
} else if (fwd_seq <= req->r_num_fwd) {
dout("forward tid %llu to mds%d - old seq %d <= %d\n",
tid, next_mds, req->r_num_fwd, fwd_seq); tid, next_mds, req->r_num_fwd, fwd_seq);
} else { } else {
/* resend. forward race not possible; mds would drop */ /* resend. forward race not possible; mds would drop */
dout("forward %llu to mds%d (we resend)\n", tid, next_mds); dout("forward tid %llu to mds%d (we resend)\n", tid, next_mds);
BUG_ON(req->r_err);
BUG_ON(req->r_got_result);
req->r_num_fwd = fwd_seq; req->r_num_fwd = fwd_seq;
req->r_resend_mds = next_mds; req->r_resend_mds = next_mds;
put_request_session(req); put_request_session(req);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册