Whamcloud - gitweb
LU-10267 llog: fix EOF handling in llog_client_next_block() 13/30313/2
authorJohn L. Hammond <john.hammond@intel.com>
Wed, 29 Nov 2017 14:45:47 +0000 (08:45 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 17 Dec 2017 06:20:27 +0000 (06:20 +0000)
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 <john.hammond@intel.com>
Change-Id: If30ebec065ddd38fb7b06c3e16f96bb3cd76fa1b
Reviewed-on: https://review.whamcloud.com/30313
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/ptlrpc/llog_client.c

index e57a331..a39db55 100644 (file)
@@ -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: