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
c7c7cfbd
Commit
c7c7cfbd
authored
Mar 30, 2011
by
antirez
Browse files
cluster configuration saving
parent
e6f0a7b2
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/cluster.c
View file @
c7c7cfbd
#include "redis.h"
#include "redis.h"
#include <arpa/inet.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
void
clusterAcceptHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
clusterAcceptHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
clusterReadHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
clusterReadHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
...
@@ -8,6 +10,7 @@ void clusterSendPing(clusterLink *link, int type);
...
@@ -8,6 +10,7 @@ void clusterSendPing(clusterLink *link, int type);
void
clusterSendFail
(
char
*
nodename
);
void
clusterSendFail
(
char
*
nodename
);
void
clusterUpdateState
(
void
);
void
clusterUpdateState
(
void
);
int
clusterNodeGetSlotBit
(
clusterNode
*
n
,
int
slot
);
int
clusterNodeGetSlotBit
(
clusterNode
*
n
,
int
slot
);
sds
clusterGenNodesDescription
(
void
);
/* -----------------------------------------------------------------------------
/* -----------------------------------------------------------------------------
* Initialization
* Initialization
...
@@ -31,7 +34,8 @@ void clusterGetRandomName(char *p) {
...
@@ -31,7 +34,8 @@ void clusterGetRandomName(char *p) {
int
clusterLoadConfig
(
char
*
filename
)
{
int
clusterLoadConfig
(
char
*
filename
)
{
FILE
*
fp
=
fopen
(
filename
,
"r"
);
FILE
*
fp
=
fopen
(
filename
,
"r"
);
return
REDIS_ERR
;
if
(
fp
==
NULL
)
return
REDIS_ERR
;
if
(
fp
==
NULL
)
return
REDIS_ERR
;
fclose
(
fp
);
fclose
(
fp
);
...
@@ -45,6 +49,25 @@ fmterr:
...
@@ -45,6 +49,25 @@ fmterr:
exit
(
1
);
exit
(
1
);
}
}
/* Cluster node configuration is exactly the same as CLUSTER NODES output.
*
* This function writes the node config and returns 0, on error -1
* is returned. */
int
clusterSaveConfig
(
char
*
filename
)
{
sds
ci
=
clusterGenNodesDescription
();
int
fd
;
if
((
fd
=
open
(
filename
,
O_WRONLY
|
O_CREAT
,
0644
))
==
-
1
)
goto
err
;
if
(
write
(
fd
,
ci
,
sdslen
(
ci
))
!=
(
ssize_t
)
sdslen
(
ci
))
goto
err
;
close
(
fd
);
sdsfree
(
ci
);
return
0
;
err:
sdsfree
(
ci
);
return
-
1
;
}
void
clusterInit
(
void
)
{
void
clusterInit
(
void
)
{
server
.
cluster
.
myself
=
createClusterNode
(
NULL
,
REDIS_NODE_MYSELF
);
server
.
cluster
.
myself
=
createClusterNode
(
NULL
,
REDIS_NODE_MYSELF
);
server
.
cluster
.
state
=
REDIS_CLUSTER_FAIL
;
server
.
cluster
.
state
=
REDIS_CLUSTER_FAIL
;
...
@@ -61,6 +84,10 @@ void clusterInit(void) {
...
@@ -61,6 +84,10 @@ void clusterInit(void) {
* by the createClusterNode() function. */
* by the createClusterNode() function. */
redisLog
(
REDIS_NOTICE
,
"No cluster configuration found, I'm %.40s"
,
redisLog
(
REDIS_NOTICE
,
"No cluster configuration found, I'm %.40s"
,
server
.
cluster
.
myself
->
name
);
server
.
cluster
.
myself
->
name
);
if
(
clusterSaveConfig
(
"cluster.conf"
)
==
-
1
)
{
redisLog
(
REDIS_WARNING
,
"Fatal: can't update cluster config file."
);
exit
(
1
);
}
}
}
clusterAddNode
(
server
.
cluster
.
myself
);
clusterAddNode
(
server
.
cluster
.
myself
);
/* We need a listening TCP port for our cluster messaging needs */
/* We need a listening TCP port for our cluster messaging needs */
...
@@ -874,6 +901,48 @@ void clusterUpdateState(void) {
...
@@ -874,6 +901,48 @@ void clusterUpdateState(void) {
* CLUSTER command
* CLUSTER command
* -------------------------------------------------------------------------- */
* -------------------------------------------------------------------------- */
sds
clusterGenNodesDescription
(
void
)
{
sds
ci
=
sdsempty
();
dictIterator
*
di
;
dictEntry
*
de
;
di
=
dictGetIterator
(
server
.
cluster
.
nodes
);
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
clusterNode
*
node
=
dictGetEntryVal
(
de
);
/* Node coordinates */
ci
=
sdscatprintf
(
ci
,
"%.40s %s:%d "
,
node
->
name
,
node
->
ip
,
node
->
port
);
/* Flags */
if
(
node
->
flags
==
0
)
ci
=
sdscat
(
ci
,
"noflags,"
);
if
(
node
->
flags
&
REDIS_NODE_MYSELF
)
ci
=
sdscat
(
ci
,
"myself,"
);
if
(
node
->
flags
&
REDIS_NODE_MASTER
)
ci
=
sdscat
(
ci
,
"master,"
);
if
(
node
->
flags
&
REDIS_NODE_SLAVE
)
ci
=
sdscat
(
ci
,
"slave,"
);
if
(
node
->
flags
&
REDIS_NODE_PFAIL
)
ci
=
sdscat
(
ci
,
"fail?,"
);
if
(
node
->
flags
&
REDIS_NODE_FAIL
)
ci
=
sdscat
(
ci
,
"fail,"
);
if
(
node
->
flags
&
REDIS_NODE_HANDSHAKE
)
ci
=
sdscat
(
ci
,
"handshake,"
);
if
(
node
->
flags
&
REDIS_NODE_NOADDR
)
ci
=
sdscat
(
ci
,
"noaddr,"
);
if
(
ci
[
sdslen
(
ci
)
-
1
]
==
','
)
ci
[
sdslen
(
ci
)
-
1
]
=
' '
;
/* Slave of... or just "-" */
if
(
node
->
slaveof
)
ci
=
sdscatprintf
(
ci
,
"%.40s "
,
node
->
slaveof
->
name
);
else
ci
=
sdscatprintf
(
ci
,
"- "
);
/* Latency from the POV of this node, link status */
ci
=
sdscatprintf
(
ci
,
"%ld %ld %s
\n
"
,
(
long
)
node
->
ping_sent
,
(
long
)
node
->
pong_received
,
node
->
link
?
"connected"
:
"disconnected"
);
}
dictReleaseIterator
(
di
);
return
ci
;
}
void
clusterCommand
(
redisClient
*
c
)
{
void
clusterCommand
(
redisClient
*
c
)
{
if
(
server
.
cluster_enabled
==
0
)
{
if
(
server
.
cluster_enabled
==
0
)
{
addReplyError
(
c
,
"This instance has cluster support disabled"
);
addReplyError
(
c
,
"This instance has cluster support disabled"
);
...
@@ -905,45 +974,9 @@ void clusterCommand(redisClient *c) {
...
@@ -905,45 +974,9 @@ void clusterCommand(redisClient *c) {
clusterAddNode
(
n
);
clusterAddNode
(
n
);
addReply
(
c
,
shared
.
ok
);
addReply
(
c
,
shared
.
ok
);
}
else
if
(
!
strcasecmp
(
c
->
argv
[
1
]
->
ptr
,
"nodes"
)
&&
c
->
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
c
->
argv
[
1
]
->
ptr
,
"nodes"
)
&&
c
->
argc
==
2
)
{
sds
ci
=
sdsempty
();
dictIterator
*
di
;
dictEntry
*
de
;
robj
*
o
;
robj
*
o
;
sds
ci
=
clusterGenNodesDescription
();
di
=
dictGetIterator
(
server
.
cluster
.
nodes
);
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
clusterNode
*
node
=
dictGetEntryVal
(
de
);
/* Node coordinates */
ci
=
sdscatprintf
(
ci
,
"%.40s %s:%d "
,
node
->
name
,
node
->
ip
,
node
->
port
);
/* Flags */
if
(
node
->
flags
==
0
)
ci
=
sdscat
(
ci
,
"noflags,"
);
if
(
node
->
flags
&
REDIS_NODE_MYSELF
)
ci
=
sdscat
(
ci
,
"myself,"
);
if
(
node
->
flags
&
REDIS_NODE_MASTER
)
ci
=
sdscat
(
ci
,
"master,"
);
if
(
node
->
flags
&
REDIS_NODE_SLAVE
)
ci
=
sdscat
(
ci
,
"slave,"
);
if
(
node
->
flags
&
REDIS_NODE_PFAIL
)
ci
=
sdscat
(
ci
,
"fail?,"
);
if
(
node
->
flags
&
REDIS_NODE_FAIL
)
ci
=
sdscat
(
ci
,
"fail,"
);
if
(
node
->
flags
&
REDIS_NODE_HANDSHAKE
)
ci
=
sdscat
(
ci
,
"handshake,"
);
if
(
node
->
flags
&
REDIS_NODE_NOADDR
)
ci
=
sdscat
(
ci
,
"noaddr,"
);
if
(
ci
[
sdslen
(
ci
)
-
1
]
==
','
)
ci
[
sdslen
(
ci
)
-
1
]
=
' '
;
/* Slave of... or just "-" */
if
(
node
->
slaveof
)
ci
=
sdscatprintf
(
ci
,
"%.40s "
,
node
->
slaveof
->
name
);
else
ci
=
sdscatprintf
(
ci
,
"- "
);
/* Latency from the POV of this node, link status */
ci
=
sdscatprintf
(
ci
,
"%ld %ld %s
\n
"
,
(
long
)
node
->
ping_sent
,
(
long
)
node
->
pong_received
,
node
->
link
?
"connected"
:
"disconnected"
);
}
dictReleaseIterator
(
di
);
o
=
createObject
(
REDIS_STRING
,
ci
);
o
=
createObject
(
REDIS_STRING
,
ci
);
addReplyBulk
(
c
,
o
);
addReplyBulk
(
c
,
o
);
decrRefCount
(
o
);
decrRefCount
(
o
);
...
...
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