add paused_actions for INFO Clients (#1519)

Add `paused_actions` and `paused_timeout_milliseconds` for INFO Clients
to inform users about if clients are paused.

---------

Signed-off-by: zhaozhao.zz <zhaozhao.zz@alibaba-inc.com>
This commit is contained in:
zhaozhao.zz 2025-01-14 19:01:00 +08:00 committed by GitHub
parent 2a1a65b4c7
commit c5a1585547
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 44 additions and 1 deletions

View File

@ -4520,6 +4520,16 @@ void flushReplicasOutputBuffers(void) {
}
}
mstime_t getPausedActionTimeout(uint32_t action) {
mstime_t timeout = 0;
for (int i = 0; i < NUM_PAUSE_PURPOSES; i++) {
pause_event *p = &(server.client_pause_per_purpose[i]);
if (p->paused_actions & action && (p->end - server.mstime) > timeout)
timeout = p->end - server.mstime;
}
return timeout;
}
/* Compute current paused actions and its end time, aggregated for
* all pause purposes. */
void updatePausedActions(void) {

View File

@ -5668,6 +5668,17 @@ sds genValkeyInfoString(dict *section_dict, int all_sections, int everything) {
unsigned long blocking_keys, blocking_keys_on_nokey, watched_keys;
getExpansiveClientsInfo(&maxin, &maxout);
totalNumberOfStatefulKeys(&blocking_keys, &blocking_keys_on_nokey, &watched_keys);
char *paused_actions = "none";
long long paused_timeout = 0;
if (server.paused_actions & PAUSE_ACTION_CLIENT_ALL) {
paused_actions = "all";
paused_timeout = getPausedActionTimeout(PAUSE_ACTION_CLIENT_ALL);
} else if (server.paused_actions & PAUSE_ACTION_CLIENT_WRITE) {
paused_actions = "write";
paused_timeout = getPausedActionTimeout(PAUSE_ACTION_CLIENT_WRITE);
}
if (sections++) info = sdscat(info, "\r\n");
info = sdscatprintf(
info,
@ -5684,7 +5695,9 @@ sds genValkeyInfoString(dict *section_dict, int all_sections, int everything) {
"clients_in_timeout_table:%llu\r\n", (unsigned long long)raxSize(server.clients_timeout_table),
"total_watched_keys:%lu\r\n", watched_keys,
"total_blocking_keys:%lu\r\n", blocking_keys,
"total_blocking_keys_on_nokey:%lu\r\n", blocking_keys_on_nokey));
"total_blocking_keys_on_nokey:%lu\r\n", blocking_keys_on_nokey,
"paused_actions:%s\r\n", paused_actions,
"paused_timeout_milliseconds:%lld\r\n", paused_timeout));
}
/* Memory */

View File

@ -2714,6 +2714,7 @@ void pauseActions(pause_purpose purpose, mstime_t end, uint32_t actions);
void unpauseActions(pause_purpose purpose);
uint32_t isPausedActions(uint32_t action_bitmask);
uint32_t isPausedActionsWithUpdate(uint32_t action_bitmask);
mstime_t getPausedActionTimeout(uint32_t action);
void updatePausedActions(void);
void unblockPostponedClients(void);
void processEventsWhileBlocked(void);

View File

@ -1,4 +1,23 @@
start_server {tags {"pause network"}} {
test "Test check paused_actions in info stats" {
assert_equal [s paused_actions] "none"
assert_equal [s paused_timeout_milliseconds] 0
r client PAUSE 10000 WRITE
assert_equal [s paused_actions] "write"
after 1000
set timeout [s paused_timeout_milliseconds]
assert {$timeout > 0 && $timeout < 9000}
r client unpause
r multi
r client PAUSE 1000 ALL
r info clients
assert_match "*paused_actions:all*" [r exec]
r client unpause
}
test "Test read commands are not blocked by client pause" {
r client PAUSE 100000 WRITE
set rd [valkey_deferring_client]