From: John L. Hammond Date: Wed, 30 Sep 2020 19:37:26 +0000 (-0500) Subject: LU-14054 utils: add --exit-on-close to ofd_access_log_reader X-Git-Tag: 2.13.57~38 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=75b5f5fd9ff1369b0aee95bdf1d8737d1443ccf1 LU-14054 utils: add --exit-on-close to ofd_access_log_reader Add an --exit-on-close (-e), option to ofd_access_log_reader. Test-Parameters: trivial Signed-off-by: John L. Hammond Change-Id: Ifded63318026b0ad3f9f077dc74008469df877d9 Reviewed-on: https://review.whamcloud.com/40312 Tested-by: jenkins Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev Tested-by: Maloo --- diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index d8ae9b3..b2f5e38 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -15851,6 +15851,28 @@ test_165e() { } run_test 165e "ofd_access_log MDT index filter works" +test_165f() { + local trace="/tmp/${tfile}.trace" + local rc + local count + + setup_165 + do_facet ost1 timeout 60 ofd_access_log_reader \ + --exit-on-close --debug=- --trace=- > "${trace}" & + sleep 5 + stop ost1 + + wait + rc=$? + + if ((rc != 0)); then + error_noexit "ofd_access_log_reader exited with rc = '${rc}'" + cat "${trace}" + exit 1 + fi +} +run_test 165f "ofd_access_log_reader --exit-on-close works" + test_169() { # do directio so as not to populate the page cache log "creating a 10 Mb file" diff --git a/lustre/utils/ofd_access_log_reader.c b/lustre/utils/ofd_access_log_reader.c index c627178..ddba697 100644 --- a/lustre/utils/ofd_access_log_reader.c +++ b/lustre/utils/ofd_access_log_reader.c @@ -123,6 +123,7 @@ struct alr_log { dev_t alr_rdev; }; +static unsigned int alr_log_count; static struct alr_log *alr_log[1 << 20]; /* 20 == MINORBITS */ static int oal_version; /* FIXME ... major version, minor version */ static __u32 alr_filter = 0xffffffff; /* no filter by default */ @@ -256,6 +257,7 @@ static void alr_log_destroy(struct alr_dev *ad) free(al->alr_buf); al->alr_buf = NULL; al->alr_buf_size = 0; + alr_log_count--; } /* Add an access log (identified by path) to the epoll set. */ @@ -322,6 +324,7 @@ static int alr_log_add(int epoll_fd, const char *path) FATAL("cannot allocate struct alr_dev of size %zu: %s\n", sizeof(*al), strerror(errno)); + alr_log_count++; al->alr_dev.alr_io = &alr_log_io; al->alr_dev.alr_destroy = &alr_log_destroy; al->alr_dev.alr_fd = fd; @@ -685,6 +688,7 @@ void usage(void) " -F, --batch-fraction=P set batch printing fraction to P/100\n" " -i, --batch-interval=INTERVAL print batch every INTERVAL seconds\n" " -o, --batch-offset=OFFSET print batch at OFFSET seconds\n" +" -e, --exit-on-close exit on close of all log devices\n" " -I, --mdt-index-filter=INDEX set log MDT index filter to INDEX\n" " -h, --help display this help and exit\n" " -l, --list print YAML list of available access logs\n" @@ -701,6 +705,7 @@ int main(int argc, char *argv[]) struct alr_dev *alr_batch_timer = NULL; struct alr_dev *alr_batch_file_hup = NULL; struct alr_dev *alr_ctl = NULL; + int exit_on_close = 0; time_t batch_interval = 0; time_t batch_offset = 0; unsigned int m; @@ -715,6 +720,7 @@ int main(int argc, char *argv[]) { .name = "batch-fraction", .has_arg = required_argument, .val = 'F', }, { .name = "batch-interval", .has_arg = required_argument, .val = 'i', }, { .name = "batch-offset", .has_arg = required_argument, .val = 'o', }, + { .name = "exit-on-close", .has_arg = no_argument, .val = 'e', }, { .name = "mdt-index-filter", .has_arg = required_argument, .val = 'I' }, { .name = "debug", .has_arg = optional_argument, .val = 'd', }, { .name = "help", .has_arg = no_argument, .val = 'h', }, @@ -724,8 +730,11 @@ int main(int argc, char *argv[]) { .name = NULL, }, }; - while ((c = getopt_long(argc, argv, "d::f:F:hi:I:ls:t::", options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "d::ef:F:hi:I:ls:t::", options, NULL)) != -1) { switch (c) { + case 'e': + exit_on_close = 1; + break; case 'f': alr_batch_file_path = optarg; break; @@ -945,6 +954,12 @@ int main(int argc, char *argv[]) break; } } + + if (exit_on_close && alr_log_count == 0) { + DEBUG("no open logs devices, exiting\n"); + exit_status = EXIT_SUCCESS; + goto out; + } } while (!list_info); exit_status = EXIT_SUCCESS;