Whamcloud - gitweb
LU-16615 utils: add messages in l_getidentity
authorLai Siyao <lai.siyao@whamcloud.com>
Wed, 18 Jan 2023 00:23:05 +0000 (19:23 -0500)
committerAndreas Dilger <adilger@whamcloud.com>
Tue, 25 Apr 2023 03:52:48 +0000 (03:52 +0000)
Add time related messages in l_getidentity to help debug upon
timeout, which may cause -EACCES error in user applications.

Lustre-change: https://review.whamcloud.com/50213
Lustre-commit: d5b26443a3d33d68e5747fecc591baa887bc5b89

Test-Parameters: trivial
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I87ebfb85d05e19886d8becc6b14ed0233eaed42d
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/49717
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/utils/l_getidentity.c

index 5d572b8..e85d7cc 100644 (file)
@@ -44,6 +44,7 @@
 #include <stddef.h>
 #include <libgen.h>
 #include <syslog.h>
+#include <sys/time.h>
 
 #include <libcfs/util/param.h>
 #include <linux/lnet/nidstr.h>
@@ -402,12 +403,17 @@ static void show_result(struct identity_downcall_data *data)
        printf("\n");
 }
 
+#define difftime(a, b)                                 \
+       ((a).tv_sec - (b).tv_sec +                      \
+        ((a).tv_usec - (b).tv_usec) / 1000000.0)
+
 int main(int argc, char **argv)
 {
        char *end;
        struct identity_downcall_data *data = NULL;
        glob_t path;
        unsigned long uid;
+       struct timeval start, idgot, fini;
        int fd, rc = -EINVAL, size, maxgroups;
        bool alreadyfailed = false;
 
@@ -422,6 +428,7 @@ int main(int argc, char **argv)
                errlog("%s: invalid uid '%s'\n", progname, argv[2]);
                goto out;
        }
+       gettimeofday(&start, NULL);
 
        maxgroups = sysconf(_SC_NGROUPS_MAX);
        if (maxgroups > NGROUPS_MAX)
@@ -457,6 +464,7 @@ retry:
        /* read permission database */
        rc = get_perms(data);
 
+       gettimeofday(&idgot, NULL);
 downcall:
        if (strcmp(argv[1], "-d") == 0 || getenv("L_GETIDENTITY_TEST")) {
                show_result(data);
@@ -479,6 +487,7 @@ downcall:
        }
 
        rc = write(fd, data, size);
+       gettimeofday(&fini, NULL);
        close(fd);
        if (rc != size) {
                errlog("partial write ret %d: %s\n", rc, strerror(errno));
@@ -493,6 +502,11 @@ downcall:
        } else {
                rc = 0;
        }
+       /* log if it takes more than 20 second to avoid rate limite */
+       if (rc || difftime(fini, start) > 20)
+               errlog("get identity for uid %lu start time %ld.%06ld got time %ld.%06ld end time %ld.%06ld: rc = %d\n",
+                      uid, start.tv_sec, start.tv_usec, idgot.tv_sec,
+                      idgot.tv_usec, fini.tv_sec, fini.tv_usec, rc);
 
 out_params:
        cfs_free_param_data(&path);