Merge branch 'read_iolog-from-unix-socket' of https://github.com/aclamk/fio
authorJens Axboe <axboe@kernel.dk>
Fri, 3 Aug 2018 15:16:10 +0000 (09:16 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 3 Aug 2018 15:16:10 +0000 (09:16 -0600)
* 'read_iolog-from-unix-socket' of https://github.com/aclamk/fio:
  iolog: allow to read_iolog from unix socket

1  2 
iolog.c

diff --combined iolog.c
+++ b/iolog.c
  #include "blktrace.h"
  #include "pshared.h"
  
+ #include <netinet/in.h>
+ #include <netinet/tcp.h>
+ #include <arpa/inet.h>
+ #include <sys/stat.h>
+ #include <sys/socket.h>
+ #include <sys/un.h>
  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);
                }
        }