Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
bc4667ac
Commit
bc4667ac
authored
May 14, 2020
by
antirez
Browse files
Track events processed while blocked globally.
Related to #7234.
parent
27e25e9d
Changes
5
Hide whitespace changes
Inline
Side-by-side
src/connection.h
View file @
bc4667ac
...
...
@@ -222,6 +222,6 @@ const char *connGetInfo(connection *conn, char *buf, size_t buf_len);
/* Helpers for tls special considerations */
int
tlsHasPendingData
();
void
tlsProcessPendingData
();
int
tlsProcessPendingData
();
#endif
/* __REDIS_CONNECTION_H */
src/networking.c
View file @
bc4667ac
...
...
@@ -1257,7 +1257,10 @@ void freeClientAsync(client *c) {
pthread_mutex_unlock
(
&
async_free_queue_mutex
);
}
void
freeClientsInAsyncFreeQueue
(
void
)
{
/* Free the clietns marked as CLOSE_ASAP, return the number of clients
* freed. */
int
freeClientsInAsyncFreeQueue
(
void
)
{
int
freed
=
listLength
(
server
.
clients_to_close
);
while
(
listLength
(
server
.
clients_to_close
))
{
listNode
*
ln
=
listFirst
(
server
.
clients_to_close
);
client
*
c
=
listNodeValue
(
ln
);
...
...
@@ -1266,6 +1269,7 @@ void freeClientsInAsyncFreeQueue(void) {
freeClient
(
c
);
listDelNode
(
server
.
clients_to_close
,
ln
);
}
return
freed
;
}
/* Return a client by ID, or NULL if the client ID is not in the set
...
...
@@ -2852,9 +2856,8 @@ int clientsArePaused(void) {
* write, close sequence needed to serve a client.
*
* The function returns the total number of events processed. */
int
processEventsWhileBlocked
(
void
)
{
void
processEventsWhileBlocked
(
void
)
{
int
iterations
=
4
;
/* See the function top-comment. */
int
count
=
0
;
/* Note: when we are processing events while blocked (for instance during
* busy Lua scripts), we set a global flag. When such flag is set, we
...
...
@@ -2862,15 +2865,17 @@ int processEventsWhileBlocked(void) {
* See https://github.com/antirez/redis/issues/6988 for more info. */
ProcessingEventsWhileBlocked
=
1
;
while
(
iterations
--
)
{
int
events
=
0
;
events
+
=
aeProcessEvents
(
server
.
el
,
long
long
startval
=
server
.
events_processed_while_blocked
;
long
long
ae_
events
=
aeProcessEvents
(
server
.
el
,
AE_FILE_EVENTS
|
AE_DONT_WAIT
|
AE_CALL_BEFORE_SLEEP
|
AE_CALL_AFTER_SLEEP
);
/* Note that server.events_processed_while_blocked will also get
* incremeted by callbacks called by the event loop handlers. */
server
.
events_processed_while_blocked
+=
ae_events
;
long
long
events
=
server
.
events_processed_while_blocked
-
startval
;
if
(
!
events
)
break
;
count
+=
events
;
}
ProcessingEventsWhileBlocked
=
0
;
return
count
;
}
/* ==========================================================================
...
...
src/server.c
View file @
bc4667ac
...
...
@@ -2101,12 +2101,17 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
UNUSED
(
eventLoop
);
/* Just call a subset of vital functions in case we are re-entering
* the event loop from processEventsWhileBlocked(). */
* the event loop from processEventsWhileBlocked(). Note that in this
* case we keep track of the number of events we are processing, since
* processEventsWhileBlocked() wants to stop ASAP if there are no longer
* events to handle. */
if
(
ProcessingEventsWhileBlocked
)
{
handleClientsWithPendingReadsUsingThreads
();
tlsProcessPendingData
();
handleClientsWithPendingWrites
();
freeClientsInAsyncFreeQueue
();
uint64_t
processed
=
0
;
processed
+=
handleClientsWithPendingReadsUsingThreads
();
processed
+=
tlsProcessPendingData
();
processed
+=
handleClientsWithPendingWrites
();
processed
+=
freeClientsInAsyncFreeQueue
();
server
.
events_processed_while_blocked
+=
processed
;
return
;
}
...
...
@@ -2757,6 +2762,7 @@ void initServer(void) {
server
.
clients_waiting_acks
=
listCreate
();
server
.
get_ack_from_slaves
=
0
;
server
.
clients_paused
=
0
;
server
.
events_processed_while_blocked
=
0
;
server
.
system_memory_size
=
zmalloc_get_memory_size
();
if
(
server
.
tls_port
&&
tlsConfigure
(
&
server
.
tls_ctx_config
)
==
C_ERR
)
{
...
...
src/server.h
View file @
bc4667ac
...
...
@@ -1095,6 +1095,7 @@ struct redisServer {
queries. Will still serve RESP2 queries. */
int
io_threads_num
;
/* Number of IO threads to use. */
int
io_threads_do_reads
;
/* Read and parse from IO threads? */
long
long
events_processed_while_blocked
;
/* processEventsWhileBlocked() */
/* RDB / AOF loading information */
int
loading
;
/* We are loading data from disk if true */
...
...
@@ -1652,7 +1653,7 @@ void rewriteClientCommandVector(client *c, int argc, ...);
void
rewriteClientCommandArgument
(
client
*
c
,
int
i
,
robj
*
newval
);
void
replaceClientCommandVector
(
client
*
c
,
int
argc
,
robj
**
argv
);
unsigned
long
getClientOutputBufferMemoryUsage
(
client
*
c
);
void
freeClientsInAsyncFreeQueue
(
void
);
int
freeClientsInAsyncFreeQueue
(
void
);
void
asyncCloseClientOnOutputBufferLimitReached
(
client
*
c
);
int
getClientType
(
client
*
c
);
int
getClientTypeByName
(
char
*
name
);
...
...
@@ -1662,7 +1663,7 @@ void disconnectSlaves(void);
int
listenToPort
(
int
port
,
int
*
fds
,
int
*
count
);
void
pauseClients
(
mstime_t
duration
);
int
clientsArePaused
(
void
);
int
processEventsWhileBlocked
(
void
);
void
processEventsWhileBlocked
(
void
);
int
handleClientsWithPendingWrites
(
void
);
int
handleClientsWithPendingWritesUsingThreads
(
void
);
int
handleClientsWithPendingReadsUsingThreads
(
void
);
...
...
src/tls.c
View file @
bc4667ac
...
...
@@ -768,15 +768,17 @@ int tlsHasPendingData() {
return
listLength
(
pending_list
)
>
0
;
}
void
tlsProcessPendingData
()
{
int
tlsProcessPendingData
()
{
listIter
li
;
listNode
*
ln
;
int
processed
=
listLength
(
pending_list
);
listRewind
(
pending_list
,
&
li
);
while
((
ln
=
listNext
(
&
li
)))
{
tls_connection
*
conn
=
listNodeValue
(
ln
);
tlsHandleEvent
(
conn
,
AE_READABLE
);
}
return
processed
;
}
#else
/* USE_OPENSSL */
...
...
@@ -804,7 +806,8 @@ int tlsHasPendingData() {
return
0
;
}
void
tlsProcessPendingData
()
{
int
tlsProcessPendingData
()
{
return
0
;
}
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment