Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
74249be4
Commit
74249be4
authored
May 14, 2020
by
antirez
Browse files
Track events processed while blocked globally.
Related to #7234.
parent
8bf660af
Changes
5
Hide whitespace changes
Inline
Side-by-side
src/connection.h
View file @
74249be4
...
...
@@ -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 @
74249be4
...
...
@@ -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 @
74249be4
...
...
@@ -2107,12 +2107,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
;
}
...
...
@@ -2763,6 +2768,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 @
74249be4
...
...
@@ -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 @
74249be4
...
...
@@ -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