mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
Redis-cli monitor and pubsub can be aborted with Ctrl+C, keeping the cli alive (#9347)
Abort cli blocking modes with SIGINT without exiting the cli. Co-authored-by: charsyam <charsyam@gmail.com>
This commit is contained in:
parent
19bc83716c
commit
82528d2678
@ -213,6 +213,7 @@ static struct config {
|
|||||||
int shutdown;
|
int shutdown;
|
||||||
int monitor_mode;
|
int monitor_mode;
|
||||||
int pubsub_mode;
|
int pubsub_mode;
|
||||||
|
int blocking_state_aborted; /* used to abort monitor_mode and pubsub_mode. */
|
||||||
int latency_mode;
|
int latency_mode;
|
||||||
int latency_dist_mode;
|
int latency_dist_mode;
|
||||||
int latency_history;
|
int latency_history;
|
||||||
@ -1287,6 +1288,13 @@ static int cliReadReply(int output_raw_strings) {
|
|||||||
int output = 1;
|
int output = 1;
|
||||||
|
|
||||||
if (redisGetReply(context,&_reply) != REDIS_OK) {
|
if (redisGetReply(context,&_reply) != REDIS_OK) {
|
||||||
|
if (config.blocking_state_aborted) {
|
||||||
|
config.blocking_state_aborted = 0;
|
||||||
|
config.monitor_mode = 0;
|
||||||
|
config.pubsub_mode = 0;
|
||||||
|
return cliConnect(CC_FORCE);
|
||||||
|
}
|
||||||
|
|
||||||
if (config.shutdown) {
|
if (config.shutdown) {
|
||||||
redisFree(context);
|
redisFree(context);
|
||||||
context = NULL;
|
context = NULL;
|
||||||
@ -1433,9 +1441,13 @@ static int cliSendCommand(int argc, char **argv, long repeat) {
|
|||||||
works well with the interval option. */
|
works well with the interval option. */
|
||||||
while(repeat < 0 || repeat-- > 0) {
|
while(repeat < 0 || repeat-- > 0) {
|
||||||
redisAppendCommandArgv(context,argc,(const char**)argv,argvlen);
|
redisAppendCommandArgv(context,argc,(const char**)argv,argvlen);
|
||||||
while (config.monitor_mode) {
|
if (config.monitor_mode) {
|
||||||
if (cliReadReply(output_raw) != REDIS_OK) exit(1);
|
do {
|
||||||
fflush(stdout);
|
if (cliReadReply(output_raw) != REDIS_OK) exit(1);
|
||||||
|
fflush(stdout);
|
||||||
|
} while(config.monitor_mode);
|
||||||
|
zfree(argvlen);
|
||||||
|
return REDIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.pubsub_mode) {
|
if (config.pubsub_mode) {
|
||||||
@ -1448,7 +1460,7 @@ static int cliSendCommand(int argc, char **argv, long repeat) {
|
|||||||
while (config.pubsub_mode) {
|
while (config.pubsub_mode) {
|
||||||
if (cliReadReply(output_raw) != REDIS_OK) exit(1);
|
if (cliReadReply(output_raw) != REDIS_OK) exit(1);
|
||||||
fflush(stdout); /* Make it grep friendly */
|
fflush(stdout); /* Make it grep friendly */
|
||||||
if (config.last_cmd_type == REDIS_REPLY_ERROR) {
|
if (!config.pubsub_mode || config.last_cmd_type == REDIS_REPLY_ERROR) {
|
||||||
if (config.push_output) {
|
if (config.push_output) {
|
||||||
redisSetPushCallback(context, cliPushHandler);
|
redisSetPushCallback(context, cliPushHandler);
|
||||||
}
|
}
|
||||||
@ -8210,6 +8222,18 @@ static void intrinsicLatencyModeStop(int s) {
|
|||||||
force_cancel_loop = 1;
|
force_cancel_loop = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sigIntHandler(int s) {
|
||||||
|
UNUSED(s);
|
||||||
|
|
||||||
|
if (config.monitor_mode || config.pubsub_mode) {
|
||||||
|
close(context->fd);
|
||||||
|
context->fd = REDIS_INVALID_FD;
|
||||||
|
config.blocking_state_aborted = 1;
|
||||||
|
} else {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void intrinsicLatencyMode(void) {
|
static void intrinsicLatencyMode(void) {
|
||||||
long long test_end, run_time, max_latency = 0, runs = 0;
|
long long test_end, run_time, max_latency = 0, runs = 0;
|
||||||
|
|
||||||
@ -8274,6 +8298,7 @@ int main(int argc, char **argv) {
|
|||||||
config.shutdown = 0;
|
config.shutdown = 0;
|
||||||
config.monitor_mode = 0;
|
config.monitor_mode = 0;
|
||||||
config.pubsub_mode = 0;
|
config.pubsub_mode = 0;
|
||||||
|
config.blocking_state_aborted = 0;
|
||||||
config.latency_mode = 0;
|
config.latency_mode = 0;
|
||||||
config.latency_dist_mode = 0;
|
config.latency_dist_mode = 0;
|
||||||
config.latency_history = 0;
|
config.latency_history = 0;
|
||||||
@ -8449,6 +8474,7 @@ int main(int argc, char **argv) {
|
|||||||
if (argc == 0 && !config.eval) {
|
if (argc == 0 && !config.eval) {
|
||||||
/* Ignore SIGPIPE in interactive mode to force a reconnect */
|
/* Ignore SIGPIPE in interactive mode to force a reconnect */
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
signal(SIGINT, sigIntHandler);
|
||||||
|
|
||||||
/* Note that in repl mode we don't abort on connection error.
|
/* Note that in repl mode we don't abort on connection error.
|
||||||
* A new attempt will be performed for every command send. */
|
* A new attempt will be performed for every command send. */
|
||||||
|
Loading…
Reference in New Issue
Block a user