diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 828268c70601634a0f081a8cf7c7e91462b42240..c22d498956212998ccec0e5dd579bd87df27b1fd 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -49,6 +49,21 @@ jobs: - name: module api test run: ./runtest-moduleapi --verbose + test-tls: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: make + run: | + make BUILD_TLS=yes + - name: test + run: | + sudo apt-get install tcl8.5 tcl-tls + ./utils/gen-test-certs.sh + ./runtest --accurate --verbose --tls + - name: module api test + run: ./runtest-moduleapi --verbose --tls + test-valgrind: runs-on: ubuntu-latest timeout-minutes: 14400 diff --git a/src/replication.c b/src/replication.c index 3ebe451a2eb6254903f50e9832e9f272c647cce7..ad4d1511609b3cc110a5733f4975038cb7890e43 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) {