From a485c51379a0218aaf01f7c0baf8e4cc993d8824 Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Wed, 29 Nov 2017 08:45:47 -0600 Subject: [PATCH] LU-10267 llog: fix EOF handling in llog_client_next_block() In llog_client_next_block() update *cur_idx and *cur_offset in the special case that the handler has returned -EIO after reaching the end of the log without finding the desired record. This fixes client side EOF detection in llog_process_thread(). Signed-off-by: John L. Hammond Change-Id: If30ebec065ddd38fb7b06c3e16f96bb3cd76fa1b Reviewed-on: https://review.whamcloud.com/30313 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/ptlrpc/llog_client.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lustre/ptlrpc/llog_client.c b/lustre/ptlrpc/llog_client.c index e57a331..a39db55 100644 --- a/lustre/ptlrpc/llog_client.c +++ b/lustre/ptlrpc/llog_client.c @@ -202,21 +202,36 @@ static int llog_client_next_block(const struct lu_env *env, req_capsule_set_size(&req->rq_pill, &RMF_EADATA, RCL_SERVER, len); ptlrpc_request_set_replen(req); rc = ptlrpc_queue_wait(req); - if (rc) - GOTO(out, rc); + /* -EIO has a special meaning here. If llog_osd_next_block() + * reaches the end of the log without finding the desired + * record then it updates *cur_offset and *cur_idx and returns + * -EIO. In llog_process_thread() we use this to detect + * EOF. But we must be careful to distinguish between -EIO + * coming from llog_osd_next_block() and -EIO coming from + * ptlrpc or below. */ + if (rc == -EIO) { + if (req->rq_repmsg == NULL || + lustre_msg_get_status(req->rq_repmsg) != -EIO) + GOTO(out, rc); + } else if (rc < 0) { + GOTO(out, rc); + } - body = req_capsule_server_get(&req->rq_pill, &RMF_LLOGD_BODY); - if (body == NULL) - GOTO(out, rc =-EFAULT); + body = req_capsule_server_get(&req->rq_pill, &RMF_LLOGD_BODY); + if (body == NULL) + GOTO(out, rc = -EFAULT); + + *cur_idx = body->lgd_saved_index; + *cur_offset = body->lgd_cur_offset; + + if (rc < 0) + GOTO(out, rc); /* The log records are swabbed as they are processed */ ptr = req_capsule_server_get(&req->rq_pill, &RMF_EADATA); if (ptr == NULL) GOTO(out, rc =-EFAULT); - *cur_idx = body->lgd_saved_index; - *cur_offset = body->lgd_cur_offset; - memcpy(buf, ptr, len); EXIT; out: -- 1.8.3.1