X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=iolog.c;h=26c3458638adf94f41d407c5444187e64f299647;hb=e8ed50bc3ce67f449714c55c3fbf2f8eb50730c2;hp=b0122bed78b10de59d76d07cbaccb0fe1f0a9513;hpb=a94aedbc11829470cce77eb52969601d618054d6;p=fio.git diff --git a/iolog.c b/iolog.c index b0122bed..26c34586 100644 --- a/iolog.c +++ b/iolog.c @@ -349,6 +349,34 @@ void write_iolog_close(struct thread_data *td) td->iolog_buf = NULL; } +static int64_t iolog_items_to_fetch(struct thread_data *td) +{ + struct timespec now; + uint64_t elapsed; + uint64_t for_1s; + int64_t items_to_fetch; + + if (!td->io_log_highmark) + return 10; + + + fio_gettime(&now, NULL); + elapsed = ntime_since(&td->io_log_highmark_time, &now); + if (elapsed) { + for_1s = (td->io_log_highmark - td->io_log_current) * 1000000000 / elapsed; + items_to_fetch = for_1s - td->io_log_current; + if (items_to_fetch < 0) + items_to_fetch = 0; + } else + items_to_fetch = 0; + + td->io_log_highmark = td->io_log_current + items_to_fetch; + td->io_log_checkmark = (td->io_log_highmark + 1) / 2; + fio_gettime(&td->io_log_highmark_time, NULL); + + return items_to_fetch; +} + /* * Read version 2 iolog data. It is enhanced to include per-file logging, * syncs, etc. @@ -361,28 +389,15 @@ 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) { - if (td->io_log_highmark == 0) { - items_to_fetch = 10; - } else { - struct timespec now; - uint64_t elapsed; - uint64_t for_1s; - fio_gettime(&now, NULL); - elapsed = ntime_since(&td->io_log_highmark_time, &now); - for_1s = (td->io_log_highmark - td->io_log_current) * 1000000000 / elapsed; - items_to_fetch = for_1s - td->io_log_current; - if (items_to_fetch < 0) - items_to_fetch = 0; - td->io_log_highmark = td->io_log_current + items_to_fetch; - td->io_log_checkmark = (td->io_log_highmark + 1) / 2; - fio_gettime(&td->io_log_highmark_time, NULL); - if (items_to_fetch == 0) - return true; - } + items_to_fetch = iolog_items_to_fetch(td); + if (!items_to_fetch) + return true; } + /* * Read in the read iolog and store it, reuse the infrastructure * for doing verifications. @@ -432,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; @@ -487,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; @@ -525,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 +580,10 @@ static int open_socket(const char *path) if (fd < 0) return fd; addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, path, sizeof(addr.sun_path)); + 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); if (connect(fd, (const struct sockaddr *)&addr, strlen(path) + sizeof(addr.sun_family)) == 0) return fd; else @@ -573,13 +599,17 @@ static bool init_iolog_read(struct thread_data *td) char buffer[256], *p; FILE *f = NULL; bool ret; - if (is_socket(td->o.read_iolog_file)) { - int fd = open_socket(td->o.read_iolog_file); + char* 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 = 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;