summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOran Agra <oran@redislabs.com>2020-05-26 13:50:59 +0300
committerOran Agra <oran@redislabs.com>2020-05-26 13:52:06 +0300
commitb9abecfc4c97db01fa6f09180c68a92ea5974ac1 (patch)
tree45ad89eefcbf3f64a6f2ad0e92b08ac8a592e1b4
parentb89e6d74faa27c9edf9d5e867a408b6b5c39b05e (diff)
downloadredis-b9abecfc4c97db01fa6f09180c68a92ea5974ac1.tar.gz
avoid using sendfile if tls-replication is enabled
this obviously broke the tests, but went unnoticed so far since tls wasn't often tested.
-rw-r--r--src/replication.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/src/replication.c b/src/replication.c
index e1c65d48b..e732788e7 100644
--- a/src/replication.c
+++ b/src/replication.c
@@ -1032,39 +1032,46 @@ void sendBulkToSlave(connection *conn) {
}
}
- /* If the preamble was already transferred, send the RDB bulk data. */
+ /* If the preamble was already transferred, send the RDB bulk data.
+ * try to use sendfile system call if supported, unless tls is enabled.
+ * fallback to normal read+write otherwise. */
+ nwritten = 0;
#if HAVE_SENDFILE
- if ((nwritten = redis_sendfile(conn->fd,slave->repldbfd,
- slave->repldboff,PROTO_IOBUF_LEN)) == -1)
- {
- if (errno != EAGAIN) {
- serverLog(LL_WARNING,"Sendfile error sending DB to replica: %s",
- strerror(errno));
- freeClient(slave);
+ if (!server.tls_replication) {
+ if ((nwritten = redis_sendfile(conn->fd,slave->repldbfd,
+ slave->repldboff,PROTO_IOBUF_LEN)) == -1)
+ {
+ if (errno != EAGAIN) {
+ serverLog(LL_WARNING,"Sendfile error sending DB to replica: %s",
+ strerror(errno));
+ freeClient(slave);
+ }
+ return;
}
- return;
}
-#else
- ssize_t buflen;
- char buf[PROTO_IOBUF_LEN];
-
- lseek(slave->repldbfd,slave->repldboff,SEEK_SET);
- buflen = read(slave->repldbfd,buf,PROTO_IOBUF_LEN);
- if (buflen <= 0) {
- serverLog(LL_WARNING,"Read error sending DB to replica: %s",
- (buflen == 0) ? "premature EOF" : strerror(errno));
- freeClient(slave);
- return;
- }
- if ((nwritten = connWrite(conn,buf,buflen)) == -1) {
- if (connGetState(conn) != CONN_STATE_CONNECTED) {
- serverLog(LL_WARNING,"Write error sending DB to replica: %s",
- connGetLastError(conn));
+#endif
+ if (!nwritten) {
+ ssize_t buflen;
+ char buf[PROTO_IOBUF_LEN];
+
+ lseek(slave->repldbfd,slave->repldboff,SEEK_SET);
+ buflen = read(slave->repldbfd,buf,PROTO_IOBUF_LEN);
+ if (buflen <= 0) {
+ serverLog(LL_WARNING,"Read error sending DB to replica: %s",
+ (buflen == 0) ? "premature EOF" : strerror(errno));
freeClient(slave);
+ return;
+ }
+ if ((nwritten = connWrite(conn,buf,buflen)) == -1) {
+ if (connGetState(conn) != CONN_STATE_CONNECTED) {
+ serverLog(LL_WARNING,"Write error sending DB to replica: %s",
+ connGetLastError(conn));
+ freeClient(slave);
+ }
+ return;
}
- return;
}
-#endif
+
slave->repldboff += nwritten;
server.stat_net_output_bytes += nwritten;
if (slave->repldboff == slave->repldbsize) {