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.