From: Jens Axboe Date: Fri, 3 Aug 2018 15:16:10 +0000 (-0600) Subject: Merge branch 'read_iolog-from-unix-socket' of https://github.com/aclamk/fio X-Git-Tag: fio-3.9~50 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=a6d7953002576946bd7d6703fca698a16ad454a5;hp=-c Merge branch 'read_iolog-from-unix-socket' of https://github.com/aclamk/fio * 'read_iolog-from-unix-socket' of https://github.com/aclamk/fio: iolog: allow to read_iolog from unix socket --- a6d7953002576946bd7d6703fca698a16ad454a5 diff --combined iolog.c index d51e49c3,3b04195e..eb38027e --- a/iolog.c +++ b/iolog.c @@@ -20,6 -20,13 +20,13 @@@ #include "blktrace.h" #include "pshared.h" + #include + #include + #include + #include + #include + #include + static int iolog_flush(struct io_log *log); static const char iolog_ver2[] = "fio version 2 iolog"; @@@ -35,7 -42,7 +42,7 @@@ void log_io_u(const struct thread_data if (!td->o.write_iolog_file) return; - fprintf(td->iolog_f, "%s %s %llu %lu\n", io_u->file->file_name, + fprintf(td->iolog_f, "%s %s %llu %llu\n", io_u->file->file_name, io_ddir_name(io_u->ddir), io_u->offset, io_u->buflen); } @@@ -161,7 -168,7 +168,7 @@@ int read_iolog_get(struct thread_data * io_u->buflen = ipo->len; io_u->file = td->files[ipo->fileno]; get_file(io_u->file); - dprint(FD_IO, "iolog: get %llu/%lu/%s\n", io_u->offset, + dprint(FD_IO, "iolog: get %llu/%llu/%s\n", io_u->offset, io_u->buflen, io_u->file->file_name); if (ipo->delay) iolog_delay(td, ipo->delay); @@@ -485,16 -492,46 +492,46 @@@ static bool read_iolog2(struct thread_d return true; } + static bool is_socket(const char *path) + { + struct stat buf; + int r = stat(path, &buf); + if (r == -1) + return false; + + return S_ISSOCK(buf.st_mode); + } + + static int open_socket(const char *path) + { + int fd = socket(AF_UNIX, SOCK_STREAM, 0); + struct sockaddr_un addr; + if (fd < 0) + return fd; + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, path, sizeof(addr.sun_path)); + if (connect(fd, (const struct sockaddr *)&addr, strlen(path) + sizeof(addr.sun_family)) == 0) + return fd; + else + close(fd); + return -1; + } + /* * open iolog, check version, and call appropriate parser */ static bool init_iolog_read(struct thread_data *td) { char buffer[256], *p; - FILE *f; + FILE *f = NULL; bool ret; - - f = fopen(td->o.read_iolog_file, "r"); + if (is_socket(td->o.read_iolog_file)) { + int fd = open_socket(td->o.read_iolog_file); + if (fd >= 0) { + f = fdopen(fd, "r"); + } + } else + f = fopen(td->o.read_iolog_file, "r"); if (!f) { perror("fopen read iolog"); return false; @@@ -737,8 -774,8 +774,8 @@@ static void flush_hist_samples(FILE *f entry_before = flist_first_entry(&entry->list, struct io_u_plat_entry, list); io_u_plat_before = entry_before->io_u_plat; - fprintf(f, "%lu, %u, %u, ", (unsigned long) s->time, - io_sample_ddir(s), s->bs); + fprintf(f, "%lu, %u, %llu, ", (unsigned long) s->time, + io_sample_ddir(s), (unsigned long long) s->bs); for (j = 0; j < FIO_IO_U_PLAT_NR - stride; j += stride) { fprintf(f, "%llu, ", (unsigned long long) hist_sum(j, stride, io_u_plat, io_u_plat_before)); @@@ -770,17 -807,17 +807,17 @@@ void flush_samples(FILE *f, void *sampl s = __get_sample(samples, log_offset, i); if (!log_offset) { - fprintf(f, "%lu, %" PRId64 ", %u, %u\n", + fprintf(f, "%lu, %" PRId64 ", %u, %llu\n", (unsigned long) s->time, s->data.val, - io_sample_ddir(s), s->bs); + io_sample_ddir(s), (unsigned long long) s->bs); } else { struct io_sample_offset *so = (void *) s; - fprintf(f, "%lu, %" PRId64 ", %u, %u, %llu\n", + fprintf(f, "%lu, %" PRId64 ", %u, %llu, %llu\n", (unsigned long) s->time, s->data.val, - io_sample_ddir(s), s->bs, + io_sample_ddir(s), (unsigned long long) s->bs, (unsigned long long) so->offset); } }