Add SIGINT handler to redis-cli --bigkeys, --memkeys, --hotkeys, --scan (#10736)

Finish current loop and display the scanned keys summery on SIGINT (Ctrl-C) signal.
It will also prepend the current scanned percentage to the scanned keys summery 1st line.

In this commit I've renamed and relocated `intrinsicLatencyModeStop` function as I'm using the exact same logic.
This commit is contained in:
Ofir Luzon 2022-05-22 00:55:26 -07:00 committed by GitHub
parent 60250f50c2
commit 00a9d6b314
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8220,6 +8220,11 @@ static void getKeySizes(redisReply *keys, typeinfo **types,
} }
} }
static void longStatLoopModeStop(int s) {
UNUSED(s);
force_cancel_loop = 1;
}
static void findBigKeys(int memkeys, unsigned memkeys_samples) { static void findBigKeys(int memkeys, unsigned memkeys_samples) {
unsigned long long sampled = 0, total_keys, totlen=0, *sizes=NULL, it=0, scan_loops = 0; unsigned long long sampled = 0, total_keys, totlen=0, *sizes=NULL, it=0, scan_loops = 0;
redisReply *reply, *keys; redisReply *reply, *keys;
@ -8237,6 +8242,7 @@ static void findBigKeys(int memkeys, unsigned memkeys_samples) {
typeinfo_add(types_dict, "zset", &type_zset); typeinfo_add(types_dict, "zset", &type_zset);
typeinfo_add(types_dict, "stream", &type_stream); typeinfo_add(types_dict, "stream", &type_stream);
signal(SIGINT, longStatLoopModeStop);
/* Total keys pre scanning */ /* Total keys pre scanning */
total_keys = getDbSize(); total_keys = getDbSize();
@ -8315,14 +8321,14 @@ static void findBigKeys(int memkeys, unsigned memkeys_samples) {
} }
freeReplyObject(reply); freeReplyObject(reply);
} while(it != 0); } while(force_cancel_loop == 0 && it != 0);
if(types) zfree(types); if(types) zfree(types);
if(sizes) zfree(sizes); if(sizes) zfree(sizes);
/* We're done */ /* We're done */
printf("\n-------- summary -------\n\n"); printf("\n-------- summary -------\n\n");
if (force_cancel_loop) printf("[%05.2f%%] ", pct);
printf("Sampled %llu keys in the keyspace!\n", sampled); printf("Sampled %llu keys in the keyspace!\n", sampled);
printf("Total key length in bytes is %llu (avg len %.2f)\n\n", printf("Total key length in bytes is %llu (avg len %.2f)\n\n",
totlen, totlen ? (double)totlen/sampled : 0); totlen, totlen ? (double)totlen/sampled : 0);
@ -8401,6 +8407,7 @@ static void findHotKeys(void) {
unsigned int arrsize = 0, i, k; unsigned int arrsize = 0, i, k;
double pct; double pct;
signal(SIGINT, longStatLoopModeStop);
/* Total keys pre scanning */ /* Total keys pre scanning */
total_keys = getDbSize(); total_keys = getDbSize();
@ -8466,13 +8473,13 @@ static void findHotKeys(void) {
} }
freeReplyObject(reply); freeReplyObject(reply);
} while(it != 0); } while(force_cancel_loop ==0 && it != 0);
if (freqs) zfree(freqs); if (freqs) zfree(freqs);
/* We're done */ /* We're done */
printf("\n-------- summary -------\n\n"); printf("\n-------- summary -------\n\n");
if(force_cancel_loop)printf("[%05.2f%%] ",pct);
printf("Sampled %llu keys in the keyspace!\n", sampled); printf("Sampled %llu keys in the keyspace!\n", sampled);
for (i=1; i<= HOTKEYS_SAMPLE; i++) { for (i=1; i<= HOTKEYS_SAMPLE; i++) {
@ -8643,7 +8650,7 @@ static void statMode(void) {
static void scanMode(void) { static void scanMode(void) {
redisReply *reply; redisReply *reply;
unsigned long long cur = 0; unsigned long long cur = 0;
signal(SIGINT, longStatLoopModeStop);
do { do {
reply = sendScan(&cur); reply = sendScan(&cur);
for (unsigned int j = 0; j < reply->element[1]->elements; j++) { for (unsigned int j = 0; j < reply->element[1]->elements; j++) {
@ -8658,7 +8665,7 @@ static void scanMode(void) {
} }
freeReplyObject(reply); freeReplyObject(reply);
if (config.interval) usleep(config.interval); if (config.interval) usleep(config.interval);
} while(cur != 0); } while(force_cancel_loop == 0 && cur != 0);
exit(0); exit(0);
} }
@ -8785,11 +8792,6 @@ unsigned long compute_something_fast(void) {
return output; return output;
} }
static void intrinsicLatencyModeStop(int s) {
UNUSED(s);
force_cancel_loop = 1;
}
static void sigIntHandler(int s) { static void sigIntHandler(int s) {
UNUSED(s); UNUSED(s);
@ -8807,7 +8809,7 @@ static void intrinsicLatencyMode(void) {
run_time = (long long)config.intrinsic_latency_duration * 1000000; run_time = (long long)config.intrinsic_latency_duration * 1000000;
test_end = ustime() + run_time; test_end = ustime() + run_time;
signal(SIGINT, intrinsicLatencyModeStop); signal(SIGINT, longStatLoopModeStop);
while(1) { while(1) {
long long start, end, latency; long long start, end, latency;