mirror of
https://github.com/fluencelabs/redis
synced 2025-03-20 17:40:50 +00:00
Cluster Manager: 'call' command.
This commit is contained in:
parent
7b9f945b37
commit
8128f1bf03
@ -286,6 +286,7 @@ static int clusterManagerIsConfigConsistent(void);
|
||||
static int clusterManagerCommandCreate(int argc, char **argv);
|
||||
static int clusterManagerCommandInfo(int argc, char **argv);
|
||||
static int clusterManagerCommandCheck(int argc, char **argv);
|
||||
static int clusterManagerCommandCall(int argc, char **argv);
|
||||
static int clusterManagerCommandHelp(int argc, char **argv);
|
||||
|
||||
/* User preferences. */
|
||||
@ -1802,6 +1803,8 @@ clusterManagerCommandDef clusterManagerCommands[] = {
|
||||
"cluster-replicas"},
|
||||
{"info", clusterManagerCommandInfo, -1, "host:port", NULL},
|
||||
{"check", clusterManagerCommandCheck, -1, "host:port", NULL},
|
||||
{"call", clusterManagerCommandCall, -2,
|
||||
"host:port command arg arg .. arg", NULL},
|
||||
{"help", clusterManagerCommandHelp, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
@ -2449,6 +2452,11 @@ node_cmd_err:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Retrieves info about the cluster using argument 'node' as the starting
|
||||
* point. All nodes will be loaded inside the cluster_manager.nodes list.
|
||||
* Warning: if something goes wrong, it will free the starting node before
|
||||
* returning 0. */
|
||||
|
||||
static int clusterManagerLoadInfoFromNode(clusterManagerNode *node, int opts) {
|
||||
if (node->context == NULL)
|
||||
CLUSTER_MANAGER_NODE_CONNECT(node);
|
||||
@ -3115,6 +3123,56 @@ invalid_args:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int clusterManagerCommandCall(int argc, char **argv) {
|
||||
int port = 0;
|
||||
char *ip = NULL;
|
||||
char *addr = argv[0];
|
||||
char *c = strrchr(addr, '@');
|
||||
int i;
|
||||
if (c != NULL) *c = '\0';
|
||||
c = strrchr(addr, ':');
|
||||
if (c != NULL) {
|
||||
*c = '\0';
|
||||
ip = addr;
|
||||
port = atoi(++c);
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"Invalid arguments: first agrumnt must be host:port.\n");
|
||||
return 0;
|
||||
}
|
||||
clusterManagerNode *refnode = clusterManagerNewNode(ip, port);
|
||||
if (!clusterManagerLoadInfoFromNode(refnode, 0)) return 0;
|
||||
argc--;
|
||||
argv++;
|
||||
size_t *argvlen = zmalloc(argc*sizeof(size_t));
|
||||
printf(">>> Calling");
|
||||
for (i = 0; i < argc; i++) {
|
||||
argvlen[i] = strlen(argv[i]);
|
||||
printf(" %s", argv[i]);
|
||||
}
|
||||
printf("\n");
|
||||
listIter li;
|
||||
listNode *ln;
|
||||
listRewind(cluster_manager.nodes, &li);
|
||||
while ((ln = listNext(&li)) != NULL) {
|
||||
clusterManagerNode *n = ln->value;
|
||||
if (!n->context) CLUSTER_MANAGER_NODE_CONNECT(n);
|
||||
redisReply *reply = NULL;
|
||||
redisAppendCommandArgv(n->context, argc, (const char **) argv, argvlen);
|
||||
int status = redisGetReply(n->context, (void **)(&reply));
|
||||
if (status != REDIS_OK || reply == NULL )
|
||||
printf("%s:%d: Failed!\n", n->ip, n->port); //TODO: better message?
|
||||
else {
|
||||
sds formatted_reply = cliFormatReplyTTY(reply, "");
|
||||
printf("%s:%d: %s\n", n->ip, n->port, (char *) formatted_reply);
|
||||
sdsfree(formatted_reply);
|
||||
}
|
||||
if (reply != NULL) freeReplyObject(reply);
|
||||
}
|
||||
zfree(argvlen);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int clusterManagerCommandHelp(int argc, char **argv) {
|
||||
UNUSED(argc);
|
||||
UNUSED(argv);
|
||||
|
Loading…
x
Reference in New Issue
Block a user