mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-23 08:38:27 -05:00
Cluster Manager mode
This commit is contained in:
parent
ffde73c57d
commit
1dd67ebceb
109
src/redis-cli.c
109
src/redis-cli.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user