diff --git a/bin/release/redis-2.8.14.zip b/bin/release/redis-2.8.14.zip index ded09ca965eea095c3a85c6c5bce3de937be17a2..972050b69ef679925e5721c6ef04f465fbd60d7f 100644 Binary files a/bin/release/redis-2.8.14.zip and b/bin/release/redis-2.8.14.zip differ diff --git a/src/redis.h b/src/redis.h index 30040a5a2f8a055994d421c38a9b435e2909cfa5..c8d9f726ae05842d6be7acf70609710365d246df 100644 --- a/src/redis.h +++ b/src/redis.h @@ -770,9 +770,15 @@ struct redisServer { redisClient *cached_master; /* Cached master to be reused for PSYNC. */ int repl_syncio_timeout; /* Timeout for synchronous I/O calls */ int repl_state; /* Replication status if the instance is a slave */ +#ifdef _WIN64 + int64_t repl_transfer_size; /* Size of RDB to read from master during sync. */ + int64_t repl_transfer_read; /* Amount of RDB read from master during sync. */ + int64_t repl_transfer_last_fsync_off; /* Offset when we fsync-ed last time. */ +#else off_t repl_transfer_size; /* Size of RDB to read from master during sync. */ off_t repl_transfer_read; /* Amount of RDB read from master during sync. */ off_t repl_transfer_last_fsync_off; /* Offset when we fsync-ed last time. */ +#endif int repl_transfer_s; /* Slave -> Master SYNC socket */ int repl_transfer_fd; /* Slave -> Master SYNC temp file descriptor */ char *repl_transfer_tmpfile; /* Slave-> master SYNC temp file name */ diff --git a/src/replication.c b/src/replication.c index 4374649f5605c06c3bfdb70845ee98cfdae41230..5f94aa808bfe0aea9c2269eec9da6c1865025a24 100644 --- a/src/replication.c +++ b/src/replication.c @@ -847,8 +847,13 @@ void replicationEmptyDbCallback(void *privdata) { #define REPL_MAX_WRITTEN_BEFORE_FSYNC (1024*1024*8) /* 8 MB */ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) { char buf[4096]; +#ifdef _WIN64 + int64_t nread, readlen; + int64_t left; +#else ssize_t nread, readlen; off_t left; +#endif REDIS_NOTUSED(el); REDIS_NOTUSED(privdata); REDIS_NOTUSED(mask); @@ -881,7 +886,11 @@ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) { redisLog(REDIS_WARNING,"Bad protocol from MASTER, the first byte is not '$' (we received '%s'), are you sure the host and port are right?", buf); goto error; } +#ifdef _WIN64 + server.repl_transfer_size = strtoll(buf+1,NULL,10); +#else server.repl_transfer_size = strtol(buf+1,NULL,10); +#endif redisLog(REDIS_NOTICE, "MASTER <-> SLAVE sync: receiving %lld bytes from master", (long long) server.repl_transfer_size); @@ -896,10 +905,17 @@ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) { if (nread <= 0) { if (server.repl_transfer_size) { errno = WSAGetLastError(); +#ifdef _WIN64 + redisLog(REDIS_WARNING,"I/O error %d (left %lld) trying to sync with MASTER: %s", + errno, server.repl_transfer_size, + (nread == -1) ? wsa_strerror(errno) : "connection lost"); + } +#else redisLog(REDIS_WARNING,"I/O error %d (left %d) trying to sync with MASTER: %s", errno, server.repl_transfer_size, (nread == -1) ? wsa_strerror(errno) : "connection lost"); } +#endif replicationAbortSyncTransfer(); return; } @@ -926,8 +942,13 @@ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) { if (server.repl_transfer_read >= server.repl_transfer_last_fsync_off + REPL_MAX_WRITTEN_BEFORE_FSYNC) { +#ifdef _WIN64 + int64_t sync_size = server.repl_transfer_read - + server.repl_transfer_last_fsync_off; +#else off_t sync_size = server.repl_transfer_read - server.repl_transfer_last_fsync_off; +#endif rdb_fsync_range(server.repl_transfer_fd, server.repl_transfer_last_fsync_off, sync_size); server.repl_transfer_last_fsync_off += sync_size;