This function implements --rdb, so it uses the replication protocol in order * to fetch the RDB file from a remote server. */
| 6283 | /* This function implements --rdb, so it uses the replication protocol in order |
| 6284 | * to fetch the RDB file from a remote server. */ |
| 6285 | static void getRDB(clusterManagerNode *node) { |
| 6286 | int fd; |
| 6287 | redisContext *s; |
| 6288 | char *filename; |
| 6289 | if (node != NULL) { |
| 6290 | assert(node->context); |
| 6291 | s = node->context; |
| 6292 | filename = clusterManagerGetNodeRDBFilename(node); |
| 6293 | } else { |
| 6294 | s = context; |
| 6295 | filename = config.rdb_filename; |
| 6296 | } |
| 6297 | static char eofmark[RDB_EOF_MARK_SIZE]; |
| 6298 | static char lastbytes[RDB_EOF_MARK_SIZE]; |
| 6299 | static int usemark = 0; |
| 6300 | unsigned long long payload = sendSync(s, eofmark); |
| 6301 | char buf[4096]; |
| 6302 | |
| 6303 | if (payload == 0) { |
| 6304 | payload = ULLONG_MAX; |
| 6305 | memset(lastbytes,0,RDB_EOF_MARK_SIZE); |
| 6306 | usemark = 1; |
| 6307 | fprintf(stderr,"SYNC sent to master, writing bytes of bulk transfer " |
| 6308 | "until EOF marker to '%s'\n", filename); |
| 6309 | } else { |
| 6310 | fprintf(stderr,"SYNC sent to master, writing %llu bytes to '%s'\n", |
| 6311 | payload, filename); |
| 6312 | } |
| 6313 | |
| 6314 | int write_to_stdout = !strcmp(filename,"-"); |
| 6315 | /* Write to file. */ |
| 6316 | if (write_to_stdout) { |
| 6317 | fd = STDOUT_FILENO; |
| 6318 | } else { |
| 6319 | fd = open(filename, O_CREAT|O_WRONLY, 0644); |
| 6320 | if (fd == -1) { |
| 6321 | fprintf(stderr, "Error opening '%s': %s\n", filename, |
| 6322 | strerror(errno)); |
| 6323 | exit(1); |
| 6324 | } |
| 6325 | } |
| 6326 | |
| 6327 | while(payload) { |
| 6328 | ssize_t nread, nwritten; |
| 6329 | |
| 6330 | nread = readConn(s,buf,(payload > sizeof(buf)) ? sizeof(buf) : payload); |
| 6331 | if (nread <= 0) { |
| 6332 | fprintf(stderr,"I/O Error reading RDB payload from socket\n"); |
| 6333 | exit(1); |
| 6334 | } |
| 6335 | nwritten = write(fd, buf, nread); |
| 6336 | if (nwritten != nread) { |
| 6337 | fprintf(stderr,"Error writing data to file: %s\n", |
| 6338 | (nwritten == -1) ? strerror(errno) : "short write"); |
| 6339 | exit(1); |
| 6340 | } |
| 6341 | payload -= nread; |
| 6342 |
no test coverage detected