From e9f312e08708e6b719ecd6b5eafb9ec2fefad16e Mon Sep 17 00:00:00 2001 From: Chen Tianjie Date: Wed, 1 Nov 2023 10:57:24 +0800 Subject: [PATCH] Change stat_client_qbuf_limit_disconnections to atomic. (#12711) In #12476 server.stat_client_qbuf_limit_disconnections was added. It is written in readQueryFromClient, which may be called by multiple threads when io-threads and io-threads-do-reads are turned on. Somehow we missed to make it an atomic variable. --- src/networking.c | 2 +- src/server.c | 6 ++++-- src/server.h | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/networking.c b/src/networking.c index a77f34759..718271aec 100644 --- a/src/networking.c +++ b/src/networking.c @@ -2706,7 +2706,7 @@ void readQueryFromClient(connection *conn) { sdsfree(ci); sdsfree(bytes); freeClientAsync(c); - server.stat_client_qbuf_limit_disconnections++; + atomicIncr(server.stat_client_qbuf_limit_disconnections, 1); goto done; } diff --git a/src/server.c b/src/server.c index 3743fc09e..83c2edc77 100644 --- a/src/server.c +++ b/src/server.c @@ -2599,7 +2599,7 @@ void resetServerStats(void) { atomicSet(server.stat_total_reads_processed, 0); server.stat_io_writes_processed = 0; atomicSet(server.stat_total_writes_processed, 0); - server.stat_client_qbuf_limit_disconnections = 0; + atomicSet(server.stat_client_qbuf_limit_disconnections, 0); server.stat_client_outbuf_limit_disconnections = 0; for (j = 0; j < STATS_METRIC_COUNT; j++) { server.inst_metric[j].idx = 0; @@ -5831,12 +5831,14 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) { (long long) elapsedUs(server.stat_last_eviction_exceeded_time): 0; long long current_active_defrag_time = server.stat_last_active_defrag_time ? (long long) elapsedUs(server.stat_last_active_defrag_time): 0; + long long stat_client_qbuf_limit_disconnections; atomicGet(server.stat_total_reads_processed, stat_total_reads_processed); atomicGet(server.stat_total_writes_processed, stat_total_writes_processed); atomicGet(server.stat_net_input_bytes, stat_net_input_bytes); atomicGet(server.stat_net_output_bytes, stat_net_output_bytes); atomicGet(server.stat_net_repl_input_bytes, stat_net_repl_input_bytes); atomicGet(server.stat_net_repl_output_bytes, stat_net_repl_output_bytes); + atomicGet(server.stat_client_qbuf_limit_disconnections, stat_client_qbuf_limit_disconnections); if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Stats\r\n" FMTARGS( @@ -5888,7 +5890,7 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) { "total_writes_processed:%lld\r\n", stat_total_writes_processed, "io_threaded_reads_processed:%lld\r\n", server.stat_io_reads_processed, "io_threaded_writes_processed:%lld\r\n", server.stat_io_writes_processed, - "client_query_buffer_limit_disconnections:%lld\r\n", server.stat_client_qbuf_limit_disconnections, + "client_query_buffer_limit_disconnections:%lld\r\n", stat_client_qbuf_limit_disconnections, "client_output_buffer_limit_disconnections:%lld\r\n", server.stat_client_outbuf_limit_disconnections, "reply_buffer_shrinks:%lld\r\n", server.stat_reply_buffer_shrinks, "reply_buffer_expands:%lld\r\n", server.stat_reply_buffer_expands, diff --git a/src/server.h b/src/server.h index 5ededdf3f..4a3eedc4c 100644 --- a/src/server.h +++ b/src/server.h @@ -1707,7 +1707,7 @@ struct redisServer { long long stat_io_writes_processed; /* Number of write events processed by IO / Main threads */ redisAtomic long long stat_total_reads_processed; /* Total number of read events processed */ redisAtomic long long stat_total_writes_processed; /* Total number of write events processed */ - long long stat_client_qbuf_limit_disconnections; /* Total number of clients reached query buf length limit */ + redisAtomic long long stat_client_qbuf_limit_disconnections; /* Total number of clients reached query buf length limit */ long long stat_client_outbuf_limit_disconnections; /* Total number of clients reached output buf length limit */ /* The following two are used to track instantaneous metrics, like * number of operations per second, network traffic. */