| 1094 | } |
| 1095 | |
| 1096 | void sendBulkToSlave(connection *conn) { |
| 1097 | client *slave = connGetPrivateData(conn); |
| 1098 | char buf[PROTO_IOBUF_LEN]; |
| 1099 | ssize_t nwritten, buflen; |
| 1100 | |
| 1101 | /* Before sending the RDB file, we send the preamble as configured by the |
| 1102 | * replication process. Currently the preamble is just the bulk count of |
| 1103 | * the file in the form "$<length>\r\n". */ |
| 1104 | if (slave->replpreamble) { |
| 1105 | nwritten = connWrite(conn,slave->replpreamble,sdslen(slave->replpreamble)); |
| 1106 | if (nwritten == -1) { |
| 1107 | serverLog(LL_VERBOSE, |
| 1108 | "Write error sending RDB preamble to replica: %s", |
| 1109 | connGetLastError(conn)); |
| 1110 | freeClient(slave); |
| 1111 | return; |
| 1112 | } |
| 1113 | atomicIncr(server.stat_net_output_bytes, nwritten); |
| 1114 | sdsrange(slave->replpreamble,nwritten,-1); |
| 1115 | if (sdslen(slave->replpreamble) == 0) { |
| 1116 | sdsfree(slave->replpreamble); |
| 1117 | slave->replpreamble = NULL; |
| 1118 | /* fall through sending data. */ |
| 1119 | } else { |
| 1120 | return; |
| 1121 | } |
| 1122 | } |
| 1123 | |
| 1124 | /* If the preamble was already transferred, send the RDB bulk data. */ |
| 1125 | lseek(slave->repldbfd,slave->repldboff,SEEK_SET); |
| 1126 | buflen = read(slave->repldbfd,buf,PROTO_IOBUF_LEN); |
| 1127 | if (buflen <= 0) { |
| 1128 | serverLog(LL_WARNING,"Read error sending DB to replica: %s", |
| 1129 | (buflen == 0) ? "premature EOF" : strerror(errno)); |
| 1130 | freeClient(slave); |
| 1131 | return; |
| 1132 | } |
| 1133 | if ((nwritten = connWrite(conn,buf,buflen)) == -1) { |
| 1134 | if (connGetState(conn) != CONN_STATE_CONNECTED) { |
| 1135 | serverLog(LL_WARNING,"Write error sending DB to replica: %s", |
| 1136 | connGetLastError(conn)); |
| 1137 | freeClient(slave); |
| 1138 | } |
| 1139 | return; |
| 1140 | } |
| 1141 | slave->repldboff += nwritten; |
| 1142 | atomicIncr(server.stat_net_output_bytes, nwritten); |
| 1143 | if (slave->repldboff == slave->repldbsize) { |
| 1144 | close(slave->repldbfd); |
| 1145 | slave->repldbfd = -1; |
| 1146 | connSetWriteHandler(slave->conn,NULL); |
| 1147 | putSlaveOnline(slave); |
| 1148 | } |
| 1149 | } |
| 1150 | |
| 1151 | /* Remove one write handler from the list of connections waiting to be writable |
| 1152 | * during rdb pipe transfer. */ |
nothing calls this directly
no test coverage detected