This function implements --rdb, so it uses the replication protocol in order * to fetch the RDB file from a remote server. */
| 7193 | /* This function implements --rdb, so it uses the replication protocol in order |
| 7194 | * to fetch the RDB file from a remote server. */ |
| 7195 | static void getRDB(clusterManagerNode *node) { |
| 7196 | int fd; |
| 7197 | redisContext *s; |
| 7198 | char *filename; |
| 7199 | if (node != NULL) { |
| 7200 | assert(node->context); |
| 7201 | s = node->context; |
| 7202 | filename = clusterManagerGetNodeRDBFilename(node); |
| 7203 | } else { |
| 7204 | s = context; |
| 7205 | filename = config.rdb_filename; |
| 7206 | } |
| 7207 | static char eofmark[RDB_EOF_MARK_SIZE]; |
| 7208 | static char lastbytes[RDB_EOF_MARK_SIZE]; |
| 7209 | static int usemark = 0; |
| 7210 | unsigned long long payload = sendSync(s, eofmark); |
| 7211 | char buf[4096]; |
| 7212 | |
| 7213 | if (payload == 0) { |
| 7214 | payload = ULLONG_MAX; |
| 7215 | memset(lastbytes,0,RDB_EOF_MARK_SIZE); |
| 7216 | usemark = 1; |
| 7217 | fprintf(stderr,"SYNC sent to master, writing bytes of bulk transfer " |
| 7218 | "until EOF marker to '%s'\n", filename); |
| 7219 | } else { |
| 7220 | fprintf(stderr,"SYNC sent to master, writing %llu bytes to '%s'\n", |
| 7221 | payload, filename); |
| 7222 | } |
| 7223 | |
| 7224 | int write_to_stdout = !strcmp(filename,"-"); |
| 7225 | /* Write to file. */ |
| 7226 | if (write_to_stdout) { |
| 7227 | fd = STDOUT_FILENO; |
| 7228 | } else { |
| 7229 | fd = open(filename, O_CREAT|O_WRONLY, 0644); |
| 7230 | if (fd == -1) { |
| 7231 | fprintf(stderr, "Error opening '%s': %s\n", filename, |
| 7232 | strerror(errno)); |
| 7233 | exit(1); |
| 7234 | } |
| 7235 | } |
| 7236 | |
| 7237 | while(payload) { |
| 7238 | ssize_t nread, nwritten; |
| 7239 | |
| 7240 | nread = readConn(s,buf,(payload > sizeof(buf)) ? sizeof(buf) : payload); |
| 7241 | if (nread <= 0) { |
| 7242 | fprintf(stderr,"I/O Error reading RDB payload from socket\n"); |
| 7243 | exit(1); |
| 7244 | } |
| 7245 | nwritten = write(fd, buf, nread); |
| 7246 | if (nwritten != nread) { |
| 7247 | fprintf(stderr,"Error writing data to file: %s\n", |
| 7248 | (nwritten == -1) ? strerror(errno) : "short write"); |
| 7249 | exit(1); |
| 7250 | } |
| 7251 | payload -= nread; |
| 7252 |
no test coverage detected