X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=iolog.c;h=b72dcf9791cfa242ceace8b4080a03934e9fa554;hb=b87aa01a1ff1e2465b4127c47e376ce7d30b2769;hp=bd2a2145c0c6ffad99ae96a438b093ee328e235f;hpb=1d73ff2a4a8f02905cf338b2f0286d76d64e7c2a;p=fio.git diff --git a/iolog.c b/iolog.c index bd2a2145..b72dcf97 100644 --- a/iolog.c +++ b/iolog.c @@ -389,6 +389,7 @@ static bool read_iolog2(struct thread_data *td) char *rfname, *fname, *act; char *str, *p; enum fio_ddir rw; + bool realloc = false; int64_t items_to_fetch = 0; if (td->o.read_iolog_chunked) { @@ -446,7 +447,7 @@ static bool read_iolog2(struct thread_data *td) dprint(FD_FILE, "iolog: ignoring" " re-add of file %s\n", fname); } else { - fileno = add_file(td, fname, 0, 1); + fileno = add_file(td, fname, td->subjob_number, 1); file_action = FIO_LOG_ADD_FILE; } continue; @@ -501,8 +502,10 @@ static bool read_iolog2(struct thread_data *td) ipo_bytes_align(td->o.replay_align, ipo); ipo->len = bytes; - if (rw != DDIR_INVAL && bytes > td->o.max_bs[rw]) + if (rw != DDIR_INVAL && bytes > td->o.max_bs[rw]) { + realloc = true; td->o.max_bs[rw] = bytes; + } ipo->fileno = fileno; ipo->file_action = file_action; td->o.size += bytes; @@ -539,6 +542,12 @@ static bool read_iolog2(struct thread_data *td) return false; } td->o.td_ddir = TD_DDIR_RW; + if (realloc && td->orig_buffer) + { + io_u_quiesce(td); + free_io_mem(td); + init_io_u_buffers(td); + } return true; } @@ -557,7 +566,9 @@ static bool read_iolog2(struct thread_data *td) static bool is_socket(const char *path) { struct stat buf; - int r = stat(path, &buf); + int r; + + r = stat(path, &buf); if (r == -1) return false; @@ -566,16 +577,25 @@ static bool is_socket(const char *path) static int open_socket(const char *path) { - int fd = socket(AF_UNIX, SOCK_STREAM, 0); struct sockaddr_un addr; + int ret, fd; + + fd = socket(AF_UNIX, SOCK_STREAM, 0); 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) + if (snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", path) >= + sizeof(addr.sun_path)) { + log_err("%s: path name %s is too long for a Unix socket\n", + __func__, path); + } + + ret = connect(fd, (const struct sockaddr *)&addr, strlen(path) + sizeof(addr.sun_family)); + if (!ret) return fd; - else - close(fd); + + close(fd); return -1; } @@ -584,16 +604,23 @@ static int open_socket(const char *path) */ static bool init_iolog_read(struct thread_data *td) { - char buffer[256], *p; + char buffer[256], *p, *fname; FILE *f = NULL; - bool ret; - if (is_socket(td->o.read_iolog_file)) { - int fd = open_socket(td->o.read_iolog_file); - if (fd >= 0) { + + fname = get_name_by_idx(td->o.read_iolog_file, td->subjob_number); + dprint(FD_IO, "iolog: name=%s\n", fname); + + if (is_socket(fname)) { + int fd; + + fd = open_socket(fname); + if (fd >= 0) f = fdopen(fd, "r"); - } } else - f = fopen(td->o.read_iolog_file, "r"); + f = fopen(fname, "r"); + + free(fname); + if (!f) { perror("fopen read iolog"); return false; @@ -606,21 +633,20 @@ static bool init_iolog_read(struct thread_data *td) fclose(f); return false; } - td->io_log_rfile = f; + /* * version 2 of the iolog stores a specific string as the * first line, check for that */ if (!strncmp(iolog_ver2, buffer, strlen(iolog_ver2))) { free_release_files(td); - ret = read_iolog2(td); - } - else { - log_err("fio: iolog version 1 is no longer supported\n"); - ret = false; + td->io_log_rfile = f; + return read_iolog2(td); } - return ret; + log_err("fio: iolog version 1 is no longer supported\n"); + fclose(f); + return false; } /*