From 7eac7b6d55822f01dbe41e7364653dfdd28bafc8 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Mon, 2 Mar 2020 21:17:17 +0300 Subject: [PATCH] Use writev in libfio_sec_osd --- fio_sec_osd.cpp | 17 ++++++++++------- rw_blocking.cpp | 34 ++++++++++++++++++++++++++++++++++ rw_blocking.h | 2 ++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/fio_sec_osd.cpp b/fio_sec_osd.cpp index 45404dd5..8038e824 100644 --- a/fio_sec_osd.cpp +++ b/fio_sec_osd.cpp @@ -261,15 +261,18 @@ static enum fio_q_status sec_queue(struct thread_data *td, struct io_u *io) bsd->op_n++; bsd->queue[n] = io; - if (write(bsd->connect_fd, op.buf, OSD_PACKET_SIZE) != OSD_PACKET_SIZE) - { - perror("write"); - exit(1); - } + iovec iov[2] = { { .iov_base = op.buf, .iov_len = OSD_PACKET_SIZE } }; + int iovcnt = 1, wtotal = OSD_PACKET_SIZE; if (io->ddir == DDIR_WRITE) { - // Send data - write_blocking(bsd->connect_fd, io->xfer_buf, io->xfer_buflen); + iov[1] = { .iov_base = io->xfer_buf, .iov_len = io->xfer_buflen }; + wtotal += io->xfer_buflen; + iovcnt++; + } + if (writev_blocking(bsd->connect_fd, iov, iovcnt) != wtotal) + { + perror("writev"); + exit(1); } if (io->error != 0) diff --git a/rw_blocking.cpp b/rw_blocking.cpp index 6e735681..7f5bd22e 100644 --- a/rw_blocking.cpp +++ b/rw_blocking.cpp @@ -50,3 +50,37 @@ int write_blocking(int fd, void *write_buf, size_t remaining) } return done; } + +int writev_blocking(int fd, iovec *iov, int iovcnt) +{ + int v = 0; + int done = 0; + while (v < iovcnt) + { + ssize_t r = writev(fd, iov, iovcnt); + if (r < 0) + { + if (errno != EAGAIN && errno != EPIPE) + { + perror("writev"); + exit(1); + } + continue; + } + while (v < iovcnt) + { + if (iov[v].iov_len > r) + { + iov[v].iov_len -= r; + iov[v].iov_base += r; + break; + } + else + { + v++; + } + } + done += r; + } + return done; +} diff --git a/rw_blocking.h b/rw_blocking.h index 015595f3..cb8387fe 100644 --- a/rw_blocking.h +++ b/rw_blocking.h @@ -1,6 +1,8 @@ #pragma once #include +#include int read_blocking(int fd, void *read_buf, size_t remaining); int write_blocking(int fd, void *write_buf, size_t remaining); +int writev_blocking(int fd, iovec *iov, int iovcnt);