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
307d995f
Commit
307d995f
authored
Feb 14, 2018
by
artix
Browse files
Cluster Manager: improved cleanup/error handling in various functions
parent
2d677e2b
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/redis-cli.c
View file @
307d995f
...
@@ -2220,7 +2220,7 @@ static int clusterManagerAddSlots(clusterManagerNode *node, char**err)
...
@@ -2220,7 +2220,7 @@ static int clusterManagerAddSlots(clusterManagerNode *node, char**err)
{
{
redisReply
*
reply
=
NULL
;
redisReply
*
reply
=
NULL
;
void
*
_reply
=
NULL
;
void
*
_reply
=
NULL
;
int
is_err
=
0
;
int
is_err
=
0
,
success
=
1
;
int
argc
;
int
argc
;
sds
*
argv
=
NULL
;
sds
*
argv
=
NULL
;
size_t
*
argvlen
=
NULL
;
size_t
*
argvlen
=
NULL
;
...
@@ -2235,39 +2235,44 @@ static int clusterManagerAddSlots(clusterManagerNode *node, char**err)
...
@@ -2235,39 +2235,44 @@ static int clusterManagerAddSlots(clusterManagerNode *node, char**err)
added
++
;
added
++
;
}
}
}
}
if
(
!
added
)
goto
node_cmd_err
;
if
(
!
added
)
{
success
=
0
;
goto
cleanup
;
}
argv
=
cliSplitArgs
(
cmd
,
&
argc
);
argv
=
cliSplitArgs
(
cmd
,
&
argc
);
if
(
argc
==
0
||
argv
==
NULL
)
goto
node_cmd_err
;
if
(
argc
==
0
||
argv
==
NULL
)
{
success
=
0
;
goto
cleanup
;
}
argvlen
=
zmalloc
(
argc
*
sizeof
(
size_t
));
argvlen
=
zmalloc
(
argc
*
sizeof
(
size_t
));
for
(
i
=
0
;
i
<
argc
;
i
++
)
for
(
i
=
0
;
i
<
argc
;
i
++
)
argvlen
[
i
]
=
sdslen
(
argv
[
i
]);
argvlen
[
i
]
=
sdslen
(
argv
[
i
]);
redisAppendCommandArgv
(
node
->
context
,
argc
,(
const
char
**
)
argv
,
argvlen
);
redisAppendCommandArgv
(
node
->
context
,
argc
,(
const
char
**
)
argv
,
argvlen
);
if
(
redisGetReply
(
node
->
context
,
&
_reply
)
!=
REDIS_OK
)
goto
node_cmd_err
;
if
(
redisGetReply
(
node
->
context
,
&
_reply
)
!=
REDIS_OK
)
{
success
=
1
;
goto
cleanup
;
}
reply
=
(
redisReply
*
)
_reply
;
reply
=
(
redisReply
*
)
_reply
;
if
(
reply
==
NULL
||
(
is_err
=
(
reply
->
type
==
REDIS_REPLY_ERROR
)))
{
if
(
reply
==
NULL
||
(
is_err
=
(
reply
->
type
==
REDIS_REPLY_ERROR
)))
{
if
(
is_err
&&
err
!=
NULL
)
{
if
(
is_err
&&
err
!=
NULL
)
{
*
err
=
zmalloc
((
reply
->
len
+
1
)
*
sizeof
(
char
));
*
err
=
zmalloc
((
reply
->
len
+
1
)
*
sizeof
(
char
));
strcpy
(
*
err
,
reply
->
str
);
strcpy
(
*
err
,
reply
->
str
);
}
}
goto
node_cmd_err
;
success
=
0
;
goto
cleanup
;
}
}
sdsfree
(
cmd
);
cleanup:
zfree
(
argvlen
);
sdsfreesplitres
(
argv
,
argc
);
freeReplyObject
(
reply
);
return
1
;
node_cmd_err:
sdsfree
(
cmd
);
sdsfree
(
cmd
);
zfree
(
argvlen
);
zfree
(
argvlen
);
if
(
argv
!=
NULL
)
sdsfreesplitres
(
argv
,
argc
);
if
(
argv
!=
NULL
)
sdsfreesplitres
(
argv
,
argc
);
if
(
reply
!=
NULL
)
freeReplyObject
(
reply
);
if
(
reply
!=
NULL
)
freeReplyObject
(
reply
);
return
0
;
return
success
;
}
}
static
int
clusterManagerFlushNodeConfig
(
clusterManagerNode
*
node
,
char
**
err
)
{
static
int
clusterManagerFlushNodeConfig
(
clusterManagerNode
*
node
,
char
**
err
)
{
if
(
!
node
->
dirty
)
return
0
;
if
(
!
node
->
dirty
)
return
0
;
redisReply
*
reply
=
NULL
;
redisReply
*
reply
=
NULL
;
int
is_err
=
0
;
int
is_err
=
0
,
success
=
1
;
*
err
=
NULL
;
*
err
=
NULL
;
if
(
node
->
replicate
!=
NULL
)
{
if
(
node
->
replicate
!=
NULL
)
{
reply
=
CLUSTER_MANAGER_COMMAND
(
node
,
"CLUSTER REPLICATE %s"
,
reply
=
CLUSTER_MANAGER_COMMAND
(
node
,
"CLUSTER REPLICATE %s"
,
...
@@ -2277,18 +2282,20 @@ static int clusterManagerFlushNodeConfig(clusterManagerNode *node, char **err) {
...
@@ -2277,18 +2282,20 @@ static int clusterManagerFlushNodeConfig(clusterManagerNode *node, char **err) {
*
err
=
zmalloc
((
reply
->
len
+
1
)
*
sizeof
(
char
));
*
err
=
zmalloc
((
reply
->
len
+
1
)
*
sizeof
(
char
));
strcpy
(
*
err
,
reply
->
str
);
strcpy
(
*
err
,
reply
->
str
);
}
}
goto
node_cmd_err
;
success
=
0
;
goto
cleanup
;
}
}
}
else
{
}
else
{
int
added
=
clusterManagerAddSlots
(
node
,
err
);
int
added
=
clusterManagerAddSlots
(
node
,
err
);
if
(
!
added
||
*
err
!=
NULL
)
goto
node_cmd_err
;
if
(
!
added
||
*
err
!=
NULL
)
{
success
=
0
;
goto
cleanup
;
}
}
}
node
->
dirty
=
0
;
node
->
dirty
=
0
;
freeReplyObject
(
reply
);
cleanup:
return
1
;
if
(
reply
!=
NULL
)
freeReplyObject
(
reply
);
node_cmd_err:
return
success
;
freeReplyObject
(
reply
);
return
0
;
}
}
static
void
clusterManagerWaitForClusterJoin
(
void
)
{
static
void
clusterManagerWaitForClusterJoin
(
void
)
{
...
@@ -2305,14 +2312,15 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
...
@@ -2305,14 +2312,15 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
char
**
err
)
char
**
err
)
{
{
redisReply
*
reply
=
CLUSTER_MANAGER_COMMAND
(
node
,
"CLUSTER NODES"
);
redisReply
*
reply
=
CLUSTER_MANAGER_COMMAND
(
node
,
"CLUSTER NODES"
);
int
is_err
=
0
;
int
is_err
=
0
,
success
=
1
;
*
err
=
NULL
;
*
err
=
NULL
;
if
(
reply
==
NULL
||
(
is_err
=
(
reply
->
type
==
REDIS_REPLY_ERROR
)))
{
if
(
reply
==
NULL
||
(
is_err
=
(
reply
->
type
==
REDIS_REPLY_ERROR
)))
{
if
(
is_err
&&
err
!=
NULL
)
{
if
(
is_err
&&
err
!=
NULL
)
{
*
err
=
zmalloc
((
reply
->
len
+
1
)
*
sizeof
(
char
));
*
err
=
zmalloc
((
reply
->
len
+
1
)
*
sizeof
(
char
));
strcpy
(
*
err
,
reply
->
str
);
strcpy
(
*
err
,
reply
->
str
);
}
}
goto
node_cmd_err
;
success
=
0
;
goto
cleanup
;
}
}
int
getfriends
=
(
opts
&
CLUSTER_MANAGER_OPT_GETFRIENDS
);
int
getfriends
=
(
opts
&
CLUSTER_MANAGER_OPT_GETFRIENDS
);
char
*
lines
=
reply
->
str
,
*
p
,
*
line
;
char
*
lines
=
reply
->
str
,
*
p
,
*
line
;
...
@@ -2340,7 +2348,10 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
...
@@ -2340,7 +2348,10 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
}
}
if
(
i
==
8
)
break
;
// Slots
if
(
i
==
8
)
break
;
// Slots
}
}
if
(
!
flags
)
goto
node_cmd_err
;
if
(
!
flags
)
{
success
=
0
;
goto
cleanup
;
}
int
myself
=
(
strstr
(
flags
,
"myself"
)
!=
NULL
);
int
myself
=
(
strstr
(
flags
,
"myself"
)
!=
NULL
);
clusterManagerNode
*
currentNode
=
NULL
;
clusterManagerNode
*
currentNode
=
NULL
;
if
(
myself
)
{
if
(
myself
)
{
...
@@ -2406,14 +2417,16 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
...
@@ -2406,14 +2417,16 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
if
(
addr
==
NULL
)
{
if
(
addr
==
NULL
)
{
// TODO: find a better err message
// TODO: find a better err message
fprintf
(
stderr
,
"Error: invalid CLUSTER NODES reply
\n
"
);
fprintf
(
stderr
,
"Error: invalid CLUSTER NODES reply
\n
"
);
goto
node_cmd_err
;
success
=
0
;
goto
cleanup
;
}
}
char
*
c
=
strrchr
(
addr
,
'@'
);
char
*
c
=
strrchr
(
addr
,
'@'
);
if
(
c
!=
NULL
)
*
c
=
'\0'
;
if
(
c
!=
NULL
)
*
c
=
'\0'
;
c
=
strrchr
(
addr
,
':'
);
c
=
strrchr
(
addr
,
':'
);
if
(
c
==
NULL
)
{
if
(
c
==
NULL
)
{
fprintf
(
stderr
,
"Error: invalid CLUSTER NODES reply
\n
"
);
fprintf
(
stderr
,
"Error: invalid CLUSTER NODES reply
\n
"
);
goto
node_cmd_err
;
success
=
0
;
goto
cleanup
;
}
}
*
c
=
'\0'
;
*
c
=
'\0'
;
int
port
=
atoi
(
++
c
);
int
port
=
atoi
(
++
c
);
...
@@ -2445,11 +2458,9 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
...
@@ -2445,11 +2458,9 @@ static int clusterManagerNodeLoadInfo(clusterManagerNode *node, int opts,
if
(
ping_recv
!=
NULL
)
currentNode
->
ping_recv
=
atoll
(
ping_recv
);
if
(
ping_recv
!=
NULL
)
currentNode
->
ping_recv
=
atoll
(
ping_recv
);
if
(
!
getfriends
&&
myself
)
break
;
if
(
!
getfriends
&&
myself
)
break
;
}
}
freeReplyObject
(
reply
);
cleanup:
return
1
;
if
(
reply
)
freeReplyObject
(
reply
);
node_cmd_err:
return
success
;
freeReplyObject
(
reply
);
return
0
;
}
}
/* Retrieves info about the cluster using argument 'node' as the starting
/* Retrieves info about the cluster using argument 'node' as the starting
...
@@ -2780,7 +2791,7 @@ cluster_manager_err:
...
@@ -2780,7 +2791,7 @@ cluster_manager_err:
static
int
clusterManagerCommandCreate
(
int
argc
,
char
**
argv
)
{
static
int
clusterManagerCommandCreate
(
int
argc
,
char
**
argv
)
{
printf
(
"Cluster Manager: Creating Cluster
\n
"
);
printf
(
"Cluster Manager: Creating Cluster
\n
"
);
int
i
,
j
;
int
i
,
j
,
success
=
1
;
cluster_manager
.
nodes
=
listCreate
();
cluster_manager
.
nodes
=
listCreate
();
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
char
*
addr
=
argv
[
i
];
char
*
addr
=
argv
[
i
];
...
@@ -2974,7 +2985,8 @@ assign_replicas:
...
@@ -2974,7 +2985,8 @@ assign_replicas:
CLUSTER_MANAGER_PRINT_REPLY_ERROR
(
node
,
err
);
CLUSTER_MANAGER_PRINT_REPLY_ERROR
(
node
,
err
);
zfree
(
err
);
zfree
(
err
);
}
}
goto
cmd_err
;
success
=
0
;
goto
cleanup
;
}
else
if
(
err
!=
NULL
)
zfree
(
err
);
}
else
if
(
err
!=
NULL
)
zfree
(
err
);
}
}
printf
(
">>> Nodes configuration updated
\n
"
);
printf
(
">>> Nodes configuration updated
\n
"
);
...
@@ -3010,7 +3022,10 @@ assign_replicas:
...
@@ -3010,7 +3022,10 @@ assign_replicas:
is_err
=
1
;
is_err
=
1
;
fprintf
(
stderr
,
"Failed to send CLUSTER MEET command.
\n
"
);
fprintf
(
stderr
,
"Failed to send CLUSTER MEET command.
\n
"
);
}
}
if
(
is_err
)
goto
cmd_err
;
if
(
is_err
)
{
success
=
0
;
goto
cleanup
;
}
}
}
// Give one second for the join to start, in order to avoid that
// Give one second for the join to start, in order to avoid that
// waiting for cluster join will find all the nodes agree about
// waiting for cluster join will find all the nodes agree about
...
@@ -3029,7 +3044,8 @@ assign_replicas:
...
@@ -3029,7 +3044,8 @@ assign_replicas:
CLUSTER_MANAGER_PRINT_REPLY_ERROR
(
node
,
err
);
CLUSTER_MANAGER_PRINT_REPLY_ERROR
(
node
,
err
);
zfree
(
err
);
zfree
(
err
);
}
}
goto
cmd_err
;
success
=
0
;
goto
cleanup
;
}
}
}
}
// Reset Nodes
// Reset Nodes
...
@@ -3041,9 +3057,13 @@ assign_replicas:
...
@@ -3041,9 +3057,13 @@ assign_replicas:
else
freeClusterManagerNode
(
node
);
else
freeClusterManagerNode
(
node
);
}
}
listEmpty
(
cluster_manager
.
nodes
);
listEmpty
(
cluster_manager
.
nodes
);
if
(
!
clusterManagerLoadInfoFromNode
(
first_node
,
0
))
goto
cmd_err
;
//TODO: msg?
if
(
!
clusterManagerLoadInfoFromNode
(
first_node
,
0
))
{
success
=
0
;
goto
cleanup
;
//TODO: msg?
}
clusterManagerCheckCluster
(
0
);
clusterManagerCheckCluster
(
0
);
}
}
cleanup:
/* Free everything */
/* Free everything */
zfree
(
masters
);
zfree
(
masters
);
zfree
(
ips
);
zfree
(
ips
);
...
@@ -3052,16 +3072,7 @@ assign_replicas:
...
@@ -3052,16 +3072,7 @@ assign_replicas:
CLUSTER_MANAGER_NODEARRAY_FREE
(
node_array
);
CLUSTER_MANAGER_NODEARRAY_FREE
(
node_array
);
}
}
zfree
(
ip_nodes
);
zfree
(
ip_nodes
);
return
1
;
return
success
;
cmd_err:
zfree
(
masters
);
zfree
(
ips
);
for
(
i
=
0
;
i
<
node_len
;
i
++
)
{
clusterManagerNodeArray
*
node_array
=
ip_nodes
+
i
;
CLUSTER_MANAGER_NODEARRAY_FREE
(
node_array
);
}
zfree
(
ip_nodes
);
return
0
;
}
}
static
int
clusterManagerCommandInfo
(
int
argc
,
char
**
argv
)
{
static
int
clusterManagerCommandInfo
(
int
argc
,
char
**
argv
)
{
...
...
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