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
623131d4
Commit
623131d4
authored
Oct 05, 2011
by
antirez
Browse files
Totally hackish and dirty, but working, support for Redis Cluster in redis-cli
parent
9465d83e
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/redis-cli.c
View file @
623131d4
...
@@ -62,6 +62,8 @@ static struct config {
...
@@ -62,6 +62,8 @@ static struct config {
int
monitor_mode
;
int
monitor_mode
;
int
pubsub_mode
;
int
pubsub_mode
;
int
latency_mode
;
int
latency_mode
;
int
cluster_mode
;
int
cluster_reissue_command
;
int
stdinarg
;
/* get last arg from stdin. (-x option) */
int
stdinarg
;
/* get last arg from stdin. (-x option) */
char
*
auth
;
char
*
auth
;
int
raw_output
;
/* output mode per command */
int
raw_output
;
/* output mode per command */
...
@@ -428,6 +430,7 @@ static int cliReadReply(int output_raw_strings) {
...
@@ -428,6 +430,7 @@ static int cliReadReply(int output_raw_strings) {
void
*
_reply
;
void
*
_reply
;
redisReply
*
reply
;
redisReply
*
reply
;
sds
out
;
sds
out
;
int
output
=
1
;
if
(
redisGetReply
(
context
,
&
_reply
)
!=
REDIS_OK
)
{
if
(
redisGetReply
(
context
,
&
_reply
)
!=
REDIS_OK
)
{
if
(
config
.
shutdown
)
if
(
config
.
shutdown
)
...
@@ -445,18 +448,49 @@ static int cliReadReply(int output_raw_strings) {
...
@@ -445,18 +448,49 @@ static int cliReadReply(int output_raw_strings) {
}
}
reply
=
(
redisReply
*
)
_reply
;
reply
=
(
redisReply
*
)
_reply
;
if
(
output_raw_strings
)
{
out
=
cliFormatReplyRaw
(
reply
);
/* Check if we need to connect to a different node and reissue the request. */
}
else
{
if
(
config
.
cluster_mode
&&
reply
->
type
==
REDIS_REPLY_ERROR
&&
if
(
config
.
raw_output
)
{
(
!
strncmp
(
reply
->
str
,
"MOVED"
,
5
)
||
!
strcmp
(
reply
->
str
,
"ASK"
)))
{
char
*
p
=
reply
->
str
,
*
s
;
int
slot
;
output
=
0
;
/* Comments show the position of the pointer as:
*
* [S] for pointer 's'
* [P] for pointer 'p'
*/
s
=
strchr
(
p
,
' '
);
/* MOVED[S]3999 127.0.0.1:6381 */
p
=
strchr
(
s
+
1
,
' '
);
/* MOVED[S]3999[P]127.0.0.1:6381 */
*
p
=
'\0'
;
slot
=
atoi
(
s
+
1
);
s
=
strchr
(
p
+
1
,
':'
);
/* MOVED 3999[P]127.0.0.1[S]6381 */
*
s
=
'\0'
;
sdsfree
(
config
.
hostip
);
config
.
hostip
=
sdsnew
(
p
+
1
);
config
.
hostport
=
atoi
(
s
+
1
);
if
(
config
.
interactive
)
printf
(
"-> Redirected to slot [%d] located at %s:%d
\n
"
,
slot
,
config
.
hostip
,
config
.
hostport
);
config
.
cluster_reissue_command
=
1
;
}
if
(
output
)
{
if
(
output_raw_strings
)
{
out
=
cliFormatReplyRaw
(
reply
);
out
=
cliFormatReplyRaw
(
reply
);
out
=
sdscat
(
out
,
"
\n
"
);
}
else
{
}
else
{
out
=
cliFormatReplyTTY
(
reply
,
""
);
if
(
config
.
raw_output
)
{
out
=
cliFormatReplyRaw
(
reply
);
out
=
sdscat
(
out
,
"
\n
"
);
}
else
{
out
=
cliFormatReplyTTY
(
reply
,
""
);
}
}
}
fwrite
(
out
,
sdslen
(
out
),
1
,
stdout
);
sdsfree
(
out
);
}
}
fwrite
(
out
,
sdslen
(
out
),
1
,
stdout
);
sdsfree
(
out
);
freeReplyObject
(
reply
);
freeReplyObject
(
reply
);
return
REDIS_OK
;
return
REDIS_OK
;
}
}
...
@@ -570,6 +604,8 @@ static int parseOptions(int argc, char **argv) {
...
@@ -570,6 +604,8 @@ static int parseOptions(int argc, char **argv) {
config
.
raw_output
=
1
;
config
.
raw_output
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"--latency"
))
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"--latency"
))
{
config
.
latency_mode
=
1
;
config
.
latency_mode
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-c"
))
{
config
.
cluster_mode
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-d"
)
&&
!
lastarg
)
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"-d"
)
&&
!
lastarg
)
{
sdsfree
(
config
.
mb_delim
);
sdsfree
(
config
.
mb_delim
);
config
.
mb_delim
=
sdsnew
(
argv
[
i
+
1
]);
config
.
mb_delim
=
sdsnew
(
argv
[
i
+
1
]);
...
@@ -619,6 +655,7 @@ static void usage() {
...
@@ -619,6 +655,7 @@ static void usage() {
" -n <db> Database number
\n
"
" -n <db> Database number
\n
"
" -x Read last argument from STDIN
\n
"
" -x Read last argument from STDIN
\n
"
" -d <delimiter> Multi-bulk delimiter in for raw formatting (default:
\\
n)
\n
"
" -d <delimiter> Multi-bulk delimiter in for raw formatting (default:
\\
n)
\n
"
" -c Enable cluster mode (follow -ASK and -MOVED redirections)
\n
"
" --raw Use raw formatting for replies (default when STDOUT is not a tty)
\n
"
" --raw Use raw formatting for replies (default when STDOUT is not a tty)
\n
"
" --latency Enter a special mode continuously sampling latency.
\n
"
" --latency Enter a special mode continuously sampling latency.
\n
"
" --help Output this help and exit
\n
"
" --help Output this help and exit
\n
"
...
@@ -703,16 +740,25 @@ static void repl() {
...
@@ -703,16 +740,25 @@ static void repl() {
repeat
=
1
;
repeat
=
1
;
}
}
if
(
cliSendCommand
(
argc
-
skipargs
,
argv
+
skipargs
,
repeat
)
while
(
1
)
{
!=
REDIS_OK
)
config
.
cluster_reissue_command
=
0
;
{
cliConnect
(
1
);
/* If we still cannot send the command print error.
* We'll try to reconnect the next time. */
if
(
cliSendCommand
(
argc
-
skipargs
,
argv
+
skipargs
,
repeat
)
if
(
cliSendCommand
(
argc
-
skipargs
,
argv
+
skipargs
,
repeat
)
!=
REDIS_OK
)
!=
REDIS_OK
)
cliPrintContextError
();
{
cliConnect
(
1
);
/* If we still cannot send the command print error.
* We'll try to reconnect the next time. */
if
(
cliSendCommand
(
argc
-
skipargs
,
argv
+
skipargs
,
repeat
)
!=
REDIS_OK
)
cliPrintContextError
();
}
/* Issue the command again if we got redirected in cluster mode */
if
(
config
.
cluster_mode
&&
config
.
cluster_reissue_command
)
{
cliConnect
(
1
);
}
else
{
break
;
}
}
}
elapsed
=
mstime
()
-
start_time
;
elapsed
=
mstime
()
-
start_time
;
if
(
elapsed
>=
500
)
{
if
(
elapsed
>=
500
)
{
...
@@ -789,6 +835,7 @@ int main(int argc, char **argv) {
...
@@ -789,6 +835,7 @@ int main(int argc, char **argv) {
config
.
monitor_mode
=
0
;
config
.
monitor_mode
=
0
;
config
.
pubsub_mode
=
0
;
config
.
pubsub_mode
=
0
;
config
.
latency_mode
=
0
;
config
.
latency_mode
=
0
;
config
.
cluster_mode
=
0
;
config
.
stdinarg
=
0
;
config
.
stdinarg
=
0
;
config
.
auth
=
NULL
;
config
.
auth
=
NULL
;
config
.
raw_output
=
!
isatty
(
fileno
(
stdout
))
&&
(
getenv
(
"FAKETTY"
)
==
NULL
);
config
.
raw_output
=
!
isatty
(
fileno
(
stdout
))
&&
(
getenv
(
"FAKETTY"
)
==
NULL
);
...
...
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