diff --git a/src/box/replication.cc b/src/box/replication.cc index 49a5aef7efaf5b117d24b2eb6386b0c10d66a742..666b6055a948f6398361c04e7460a55b60c9cbb2 100644 --- a/src/box/replication.cc +++ b/src/box/replication.cc @@ -745,6 +745,8 @@ replication_relay_loop() ev_io_init(&sock_read_ev, replication_relay_recv, relay.sock, EV_READ); ev_io_start(loop(), &sock_read_ev); + /** Turn off the non-blocking mode,if any. */ + sio_setfl(relay.sock, O_NONBLOCK, 0); /* Initialize the recovery process */ recovery_init(cfg_snap_dir, cfg_wal_dir, diff --git a/src/sio.cc b/src/sio.cc index 53d8469db0bd549a01e920b7837106cf87f9d419..896f69815018ee5ea7cb2ad20a7d68530f942723 100644 --- a/src/sio.cc +++ b/src/sio.cc @@ -293,6 +293,33 @@ sio_writev(int fd, const struct iovec *iov, int iovcnt) return n; } +/** Blocking I/O writev */ +ssize_t +sio_writev_all(int fd, struct iovec *iov, int iovcnt) +{ + ssize_t bytes_total = 0; + struct iovec *iovend = iov + iovcnt; + while(1) { + int cnt = iovend - iov; + if (cnt > IOV_MAX) + cnt = IOV_MAX; + ssize_t bytes_written = writev(fd, iov, cnt); + if (bytes_written < 0) { + if (errno == EINTR) + continue; + tnt_raise(SocketError, fd, "writev(%d)", cnt); + } + bytes_total += bytes_written; + while (bytes_written >= iov->iov_len) + bytes_written -= (iov++)->iov_len; + if (iov == iovend) + break; + iov->iov_base = (char *) iov->iov_base + bytes_written; + iov->iov_len -= bytes_written; + } + return bytes_total; +} + ssize_t sio_readn_ahead(int fd, void *buf, size_t count, size_t buf_size) { diff --git a/src/sio.h b/src/sio.h index bcd04a2ab1a1a235448736d485ec92b47087b0b4..d527c3802650a54283f883ddae758891936165c1 100644 --- a/src/sio.h +++ b/src/sio.h @@ -118,24 +118,8 @@ ssize_t sio_writen(int fd, const void *buf, size_t count); /* Only for blocked I/O */ -static inline ssize_t -sio_writev_all(int fd, struct iovec *iov, int iovcnt) -{ - ssize_t bytes_total = 0; - struct iovec *iovend = iov + iovcnt; - while(1) { - ssize_t bytes_written = sio_writev(fd, iov, iovend - iov); - bytes_total += bytes_written; - while (bytes_written > 0 && bytes_written >= iov->iov_len) - bytes_written -= (iov++)->iov_len; - if (iov == iovend) - break; - iov->iov_base = (char *) iov->iov_base + bytes_written; - iov->iov_len -= bytes_written; - } - - return bytes_total; -} +ssize_t +sio_writev_all(int fd, struct iovec *iov, int iovcnt); /** * A wrapper over sendfile.