Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
a3309139
Commit
a3309139
authored
May 19, 2011
by
Pieter Noordhuis
Browse files
Non-blocking connect with master
parent
521ddcce
Changes
2
Show whitespace changes
Inline
Side-by-side
src/redis.h
View file @
a3309139
...
@@ -157,6 +157,7 @@
...
@@ -157,6 +157,7 @@
#define REDIS_REPL_CONNECT 1
/* Must connect to master */
#define REDIS_REPL_CONNECT 1
/* Must connect to master */
#define REDIS_REPL_TRANSFER 2
/* Receiving .rdb from master */
#define REDIS_REPL_TRANSFER 2
/* Receiving .rdb from master */
#define REDIS_REPL_CONNECTED 3
/* Connected to master */
#define REDIS_REPL_CONNECTED 3
/* Connected to master */
#define REDIS_REPL_CONNECTING 4
/* Connecting to master */
/* Slave replication state - from the point of view of master
/* Slave replication state - from the point of view of master
* Note that in SEND_BULK and ONLINE state the slave receives new updates
* Note that in SEND_BULK and ONLINE state the slave receives new updates
...
@@ -888,7 +889,6 @@ int fwriteBulkCount(FILE *fp, char prefix, int count);
...
@@ -888,7 +889,6 @@ int fwriteBulkCount(FILE *fp, char prefix, int count);
/* Replication */
/* Replication */
void
replicationFeedSlaves
(
list
*
slaves
,
int
dictid
,
robj
**
argv
,
int
argc
);
void
replicationFeedSlaves
(
list
*
slaves
,
int
dictid
,
robj
**
argv
,
int
argc
);
void
replicationFeedMonitors
(
list
*
monitors
,
int
dictid
,
robj
**
argv
,
int
argc
);
void
replicationFeedMonitors
(
list
*
monitors
,
int
dictid
,
robj
**
argv
,
int
argc
);
int
syncWithMaster
(
void
);
void
updateSlavesWaitingBgsave
(
int
bgsaveerr
);
void
updateSlavesWaitingBgsave
(
int
bgsaveerr
);
void
replicationCron
(
void
);
void
replicationCron
(
void
);
...
...
src/replication.c
View file @
a3309139
...
@@ -393,46 +393,44 @@ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -393,46 +393,44 @@ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) {
}
}
}
}
int
syncWithMaster
(
void
)
{
void
syncWithMaster
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
char
buf
[
1024
],
tmpfile
[
256
],
authcmd
[
1024
];
char
buf
[
1024
],
tmpfile
[
256
];
int
fd
=
anetTcpConnect
(
NULL
,
server
.
masterhost
,
server
.
masterport
);
int
dfd
,
maxtries
=
5
;
int
dfd
,
maxtries
=
5
;
REDIS_NOTUSED
(
el
);
REDIS_NOTUSED
(
privdata
);
REDIS_NOTUSED
(
mask
);
if
(
fd
==
-
1
)
{
/* Remove this event before anything else. */
redisLog
(
REDIS_WARNING
,
"Unable to connect to MASTER: %s"
,
aeDeleteFileEvent
(
server
.
el
,
fd
,
AE_READABLE
|
AE_WRITABLE
);
strerror
(
errno
));
return
REDIS_ERR
;
}
/* AUTH with the master if required. */
/* AUTH with the master if required. */
if
(
server
.
masterauth
)
{
if
(
server
.
masterauth
)
{
snprintf
(
authcmd
,
1024
,
"AUTH %s
\r\n
"
,
server
.
masterauth
);
char
authcmd
[
1024
];
if
(
syncWrite
(
fd
,
authcmd
,
strlen
(
server
.
masterauth
)
+
7
,
5
)
==
-
1
)
{
size_t
authlen
;
close
(
fd
);
authlen
=
snprintf
(
authcmd
,
sizeof
(
authcmd
),
"AUTH %s
\r\n
"
,
server
.
masterauth
);
if
(
syncWrite
(
fd
,
authcmd
,
authlen
,
5
)
==
-
1
)
{
redisLog
(
REDIS_WARNING
,
"Unable to AUTH to MASTER: %s"
,
redisLog
(
REDIS_WARNING
,
"Unable to AUTH to MASTER: %s"
,
strerror
(
errno
));
strerror
(
errno
));
return
REDIS_ERR
;
goto
error
;
}
}
/* Read the AUTH result. */
/* Read the AUTH result. */
if
(
syncReadLine
(
fd
,
buf
,
1024
,
3600
)
==
-
1
)
{
if
(
syncReadLine
(
fd
,
buf
,
1024
,
3600
)
==
-
1
)
{
close
(
fd
);
redisLog
(
REDIS_WARNING
,
"I/O error reading auth result from MASTER: %s"
,
redisLog
(
REDIS_WARNING
,
"I/O error reading auth result from MASTER: %s"
,
strerror
(
errno
));
strerror
(
errno
));
return
REDIS_ERR
;
goto
error
;
}
}
if
(
buf
[
0
]
!=
'+'
)
{
if
(
buf
[
0
]
!=
'+'
)
{
close
(
fd
);
redisLog
(
REDIS_WARNING
,
"Cannot AUTH to MASTER, is the masterauth password correct?"
);
redisLog
(
REDIS_WARNING
,
"Cannot AUTH to MASTER, is the masterauth password correct?"
);
return
REDIS_ERR
;
goto
error
;
}
}
}
}
/* Issue the SYNC command */
/* Issue the SYNC command */
if
(
syncWrite
(
fd
,
"SYNC
\r\n
"
,
7
,
5
)
==
-
1
)
{
if
(
syncWrite
(
fd
,
"SYNC
\r\n
"
,
7
,
5
)
==
-
1
)
{
close
(
fd
);
redisLog
(
REDIS_WARNING
,
"I/O error writing to MASTER: %s"
,
redisLog
(
REDIS_WARNING
,
"I/O error writing to MASTER: %s"
,
strerror
(
errno
));
strerror
(
errno
));
return
REDIS_ERR
;
goto
error
;
}
}
/* Prepare a suitable temp file for bulk transfer */
/* Prepare a suitable temp file for bulk transfer */
...
@@ -444,25 +442,51 @@ int syncWithMaster(void) {
...
@@ -444,25 +442,51 @@ int syncWithMaster(void) {
sleep
(
1
);
sleep
(
1
);
}
}
if
(
dfd
==
-
1
)
{
if
(
dfd
==
-
1
)
{
close
(
fd
);
redisLog
(
REDIS_WARNING
,
"Opening the temp file needed for MASTER <-> SLAVE synchronization: %s"
,
strerror
(
errno
));
redisLog
(
REDIS_WARNING
,
"Opening the temp file needed for MASTER <-> SLAVE synchronization: %s"
,
strerror
(
errno
));
return
REDIS_ERR
;
goto
error
;
}
}
/* Setup the non blocking download of the bulk file. */
/* Setup the non blocking download of the bulk file. */
if
(
aeCreateFileEvent
(
server
.
el
,
fd
,
AE_READABLE
,
readSyncBulkPayload
,
NULL
)
if
(
aeCreateFileEvent
(
server
.
el
,
fd
,
AE_READABLE
,
readSyncBulkPayload
,
NULL
)
==
AE_ERR
)
==
AE_ERR
)
{
{
close
(
fd
);
redisLog
(
REDIS_WARNING
,
"Can't create readable event for SYNC"
);
redisLog
(
REDIS_WARNING
,
"Can't create readable event for SYNC"
);
return
REDIS_ERR
;
goto
error
;
}
}
server
.
replstate
=
REDIS_REPL_TRANSFER
;
server
.
replstate
=
REDIS_REPL_TRANSFER
;
server
.
repl_transfer_left
=
-
1
;
server
.
repl_transfer_left
=
-
1
;
server
.
repl_transfer_s
=
fd
;
server
.
repl_transfer_fd
=
dfd
;
server
.
repl_transfer_fd
=
dfd
;
server
.
repl_transfer_lastio
=
time
(
NULL
);
server
.
repl_transfer_lastio
=
time
(
NULL
);
server
.
repl_transfer_tmpfile
=
zstrdup
(
tmpfile
);
server
.
repl_transfer_tmpfile
=
zstrdup
(
tmpfile
);
return
;
error:
server
.
replstate
=
REDIS_REPL_CONNECT
;
close
(
fd
);
return
;
}
int
connectWithMaster
(
void
)
{
int
fd
;
fd
=
anetTcpNonBlockConnect
(
NULL
,
server
.
masterhost
,
server
.
masterport
);
if
(
fd
==
-
1
)
{
redisLog
(
REDIS_WARNING
,
"Unable to connect to MASTER: %s"
,
strerror
(
errno
));
return
REDIS_ERR
;
}
if
(
aeCreateFileEvent
(
server
.
el
,
fd
,
AE_READABLE
|
AE_WRITABLE
,
syncWithMaster
,
NULL
)
==
AE_ERR
)
{
close
(
fd
);
redisLog
(
REDIS_WARNING
,
"Can't create readable event for SYNC"
);
return
REDIS_ERR
;
}
server
.
repl_transfer_s
=
fd
;
server
.
replstate
=
REDIS_REPL_CONNECTING
;
return
REDIS_OK
;
return
REDIS_OK
;
}
}
...
@@ -517,8 +541,8 @@ void replicationCron(void) {
...
@@ -517,8 +541,8 @@ void replicationCron(void) {
/* Check if we should connect to a MASTER */
/* Check if we should connect to a MASTER */
if
(
server
.
replstate
==
REDIS_REPL_CONNECT
)
{
if
(
server
.
replstate
==
REDIS_REPL_CONNECT
)
{
redisLog
(
REDIS_NOTICE
,
"Connecting to MASTER..."
);
redisLog
(
REDIS_NOTICE
,
"Connecting to MASTER..."
);
if
(
sync
WithMaster
()
==
REDIS_OK
)
{
if
(
connect
WithMaster
()
==
REDIS_OK
)
{
redisLog
(
REDIS_NOTICE
,
"MASTER <-> SLAVE sync started
: SYNC sent
"
);
redisLog
(
REDIS_NOTICE
,
"MASTER <-> SLAVE sync started"
);
if
(
server
.
appendonly
)
rewriteAppendOnlyFileBackground
();
if
(
server
.
appendonly
)
rewriteAppendOnlyFileBackground
();
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment