Unverified Commit 3c2ea1ea authored by Binbin's avatar Binbin Committed by GitHub
Browse files

Fix wathced client test timing issue caused by late close (#13062)

There is a timing issue in the test, close may arrive late, or in
freeClientAsync we will free the client in async way, which will
lead to errors in watching_clients statistics, since we will only
unwatch all keys when we truly freeClient.

Add a wait here to avoid this problem. Also fixed some outdated
comments i saw. The test was introduced in #12966.
parent 4e3be944
...@@ -1722,7 +1722,7 @@ void freeClient(client *c) { ...@@ -1722,7 +1722,7 @@ void freeClient(client *c) {
zfree(c); zfree(c);
} }
/* Schedule a client to free it at a safe time in the serverCron() function. /* Schedule a client to free it at a safe time in the beforeSleep() function.
* This function is useful when we need to terminate a client but we are in * This function is useful when we need to terminate a client but we are in
* a context where calling freeClient() is not possible, because the client * a context where calling freeClient() is not possible, because the client
* should be valid for the continuation of the flow of the program. */ * should be valid for the continuation of the flow of the program. */
......
...@@ -925,6 +925,14 @@ proc wait_for_blocked_clients_count {count {maxtries 100} {delay 10} {idx 0}} { ...@@ -925,6 +925,14 @@ proc wait_for_blocked_clients_count {count {maxtries 100} {delay 10} {idx 0}} {
} }
} }
proc wait_for_watched_clients_count {count {maxtries 100} {delay 10} {idx 0}} {
wait_for_condition $maxtries $delay {
[s $idx watching_clients] == $count
} else {
fail "Timeout waiting for watched clients"
}
}
proc read_from_aof {fp} { proc read_from_aof {fp} {
# Input fp is a blocking binary file descriptor of an opened AOF file. # Input fp is a blocking binary file descriptor of an opened AOF file.
if {[gets $fp count] == -1} return "" if {[gets $fp count] == -1} return ""
......
...@@ -284,7 +284,7 @@ proc redis_client {args} { ...@@ -284,7 +284,7 @@ proc redis_client {args} {
set args [lrange $args 1 end] set args [lrange $args 1 end]
} }
# create client that defers reading reply # create client that won't defers reading reply
set client [redis [srv $level "host"] [srv $level "port"] 0 $::tls] set client [redis [srv $level "host"] [srv $level "port"] 0 $::tls]
# select the right db and read the response (OK), or at least ping # select the right db and read the response (OK), or at least ping
......
...@@ -458,9 +458,10 @@ start_server {tags {"info" "external:skip"}} { ...@@ -458,9 +458,10 @@ start_server {tags {"info" "external:skip"}} {
# unwatch without watch has no effect # unwatch without watch has no effect
r unwatch r unwatch
assert_equal [s watching_clients] 1 assert_equal [s watching_clients] 1
# after disconnect # after disconnect, since close may arrive later, or the client may
# be freed asynchronously, we use a wait_for_condition
$r2 close $r2 close
assert_equal [s watching_clients] 0 wait_for_watched_clients_count 0
} }
} }
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment