Cluster Manager mode

This commit is contained in:
artix 2018-01-12 11:06:24 +01:00
parent ffde73c57d
commit 1dd67ebceb

View File

@ -65,6 +65,7 @@
#define REDIS_CLI_HISTFILE_DEFAULT ".rediscli_history" #define REDIS_CLI_HISTFILE_DEFAULT ".rediscli_history"
#define REDIS_CLI_RCFILE_ENV "REDISCLI_RCFILE" #define REDIS_CLI_RCFILE_ENV "REDISCLI_RCFILE"
#define REDIS_CLI_RCFILE_DEFAULT ".redisclirc" #define REDIS_CLI_RCFILE_DEFAULT ".redisclirc"
#define CLUSTER_MANAGER_MODE() (config.cluster_manager_command.name != NULL)
/* --latency-dist palettes. */ /* --latency-dist palettes. */
int spectrum_palette_color_size = 19; int spectrum_palette_color_size = 19;
@ -77,6 +78,16 @@ int spectrum_palette_mono[] = {0,233,234,235,237,239,241,243,245,247,249,251,253
int *spectrum_palette; int *spectrum_palette;
int spectrum_palette_size; int spectrum_palette_size;
/* Cluster Manager command info */
struct clusterManagerCommand {
char *name;
int argc;
char **argv;
int flags;
int replicas;
};
static redisContext *context; static redisContext *context;
static struct config { static struct config {
char *hostip; char *hostip;
@ -119,8 +130,29 @@ static struct config {
int eval_ldb_end; /* Lua debugging session ended. */ int eval_ldb_end; /* Lua debugging session ended. */
int enable_ldb_on_eval; /* Handle manual SCRIPT DEBUG + EVAL commands. */ int enable_ldb_on_eval; /* Handle manual SCRIPT DEBUG + EVAL commands. */
int last_cmd_type; int last_cmd_type;
struct clusterManagerCommand cluster_manager_command;
} config; } config;
/* Cluster Manager commands. */
typedef int clusterManagerCommandProc(int argc, char **argv);
static struct clusterManagerCommandDef {
char *name;
clusterManagerCommandProc *proc;
int arity;
};
static int clusterManagerCommandCreate(int argc, char **argv) {
printf("CLUSTER: create\n");
printf("Arguments: %d\n", argc);
printf("Replicas: %d\n", config.cluster_manager_command.replicas);
fprintf(stderr, "Not implemented yet!\n");
return 0;
}
struct clusterManagerCommandDef clusterManagerCommands[] = {
{"create", clusterManagerCommandCreate, -2}
};
/* User preferences. */ /* User preferences. */
static struct pref { static struct pref {
int hints; int hints;
@ -1061,6 +1093,13 @@ static redisReply *reconnectingRedisCommand(redisContext *c, const char *fmt, ..
* User interface * User interface
*--------------------------------------------------------------------------- */ *--------------------------------------------------------------------------- */
static void createClusterManagerCommand(char *cmdname, int argc, char **argv) {
struct clusterManagerCommand *cmd = &config.cluster_manager_command;
cmd->name = cmdname;
cmd->argc = argc;
cmd->argv = argc ? argv : NULL;
}
static int parseOptions(int argc, char **argv) { static int parseOptions(int argc, char **argv) {
int i; int i;
@ -1146,6 +1185,18 @@ static int parseOptions(int argc, char **argv) {
} 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]); config.mb_delim = sdsnew(argv[++i]);
} else if (!strcmp(argv[i],"--cluster") && !lastarg) {
if (CLUSTER_MANAGER_MODE()) usage();
char *cmd = argv[++i];
int j = i;
for (; j < argc; j++) if (argv[j][0] == '-') break;
j--;
createClusterManagerCommand(cmd, j - i, argv + i);
i = j;
} else if (!strcmp(argv[i],"--cluster") && lastarg) {
usage();
} else if (!strcmp(argv[i],"--cluster-replicas") && !lastarg) {
config.cluster_manager_command.replicas = atoi(argv[++i]);
} else if (!strcmp(argv[i],"-v") || !strcmp(argv[i], "--version")) { } else if (!strcmp(argv[i],"-v") || !strcmp(argv[i], "--version")) {
sds version = cliVersion(); sds version = cliVersion();
printf("redis-cli %s\n", version); printf("redis-cli %s\n", version);
@ -1243,9 +1294,13 @@ static void usage(void) {
" --ldb-sync-mode Like --ldb but uses the synchronous Lua debugger, in\n" " --ldb-sync-mode Like --ldb but uses the synchronous Lua debugger, in\n"
" this mode the server is blocked and script changes are\n" " this mode the server is blocked and script changes are\n"
" are not rolled back from the server memory.\n" " are not rolled back from the server memory.\n"
" --cluster <command> [args...]\n"
" Cluster Manager command and arguments (see below).\n"
" --help Output this help and exit.\n" " --help Output this help and exit.\n"
" --version Output version and exit.\n" " --version Output version and exit.\n"
"\n" "\n"
"Cluster Manager Commands:\n"
"\n"
"Examples:\n" "Examples:\n"
" cat /etc/passwd | redis-cli -x set mypasswd\n" " cat /etc/passwd | redis-cli -x set mypasswd\n"
" redis-cli get mypasswd\n" " redis-cli get mypasswd\n"
@ -1569,6 +1624,43 @@ static int evalMode(int argc, char **argv) {
return retval; return retval;
} }
/*------------------------------------------------------------------------------
* Cluster Manager mode
*--------------------------------------------------------------------------- */
static clusterManagerCommandProc *validateClusterManagerCommand(void) {
int i, commands_count = sizeof(clusterManagerCommands) /
sizeof(struct clusterManagerCommandDef);
clusterManagerCommandProc *proc = NULL;
char *cmdname = config.cluster_manager_command.name;
int argc = config.cluster_manager_command.argc;
for (i = 0; i < commands_count; i++) {
struct clusterManagerCommandDef cmddef = clusterManagerCommands[i];
if (!strcmp(cmddef.name, cmdname)) {
if ((cmddef.arity > 0 && argc != cmddef.arity) ||
(cmddef.arity < 0 && argc < (cmddef.arity * -1))) {
fprintf(stderr, "[ERR] Wrong number of arguments for "
"specified --cluster sub command\n");
return NULL;
}
proc = cmddef.proc;
}
}
if (!proc) fprintf(stderr, "Unknown --cluster subcommand\n");
return proc;
}
static void clusterManagerMode(clusterManagerCommandProc *proc) {
int argc = config.cluster_manager_command.argc;
char **argv = config.cluster_manager_command.argv;
if (!proc(argc, argv)) {
sdsfree(config.hostip);
sdsfree(config.mb_delim);
exit(1);
}
exit(0);
}
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* Latency and latency history modes * Latency and latency history modes
*--------------------------------------------------------------------------- */ *--------------------------------------------------------------------------- */
@ -2861,7 +2953,11 @@ int main(int argc, char **argv) {
config.eval_ldb_sync = 0; config.eval_ldb_sync = 0;
config.enable_ldb_on_eval = 0; config.enable_ldb_on_eval = 0;
config.last_cmd_type = -1; config.last_cmd_type = -1;
config.cluster_manager_command.name = NULL;
config.cluster_manager_command.argc = 0;
config.cluster_manager_command.argv = NULL;
config.cluster_manager_command.flags = 0;
config.cluster_manager_command.replicas = 0;
pref.hints = 1; pref.hints = 1;
spectrum_palette = spectrum_palette_color; spectrum_palette = spectrum_palette_color;
@ -2877,6 +2973,17 @@ int main(int argc, char **argv) {
argc -= firstarg; argc -= firstarg;
argv += firstarg; argv += firstarg;
/* Cluster Manager mode */
if (CLUSTER_MANAGER_MODE()) {
clusterManagerCommandProc *proc = validateClusterManagerCommand();
if (!proc) {
sdsfree(config.hostip);
sdsfree(config.mb_delim);
exit(1);
}
clusterManagerMode(proc);
}
/* Latency mode */ /* Latency mode */
if (config.latency_mode) { if (config.latency_mode) {
if (cliConnect(0) == REDIS_ERR) exit(1); if (cliConnect(0) == REDIS_ERR) exit(1);