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
643bc48a
Unverified
Commit
643bc48a
authored
Mar 25, 2020
by
Salvatore Sanfilippo
Committed by
GitHub
Mar 25, 2020
Browse files
Merge pull request #7022 from oranagra/multi-busy-script
MULTI/EXEC during LUA script timeout are messed up
parents
c80d81c8
ec007559
Changes
2
Show whitespace changes
Inline
Side-by-side
src/server.c
View file @
643bc48a
...
...
@@ -3553,6 +3553,7 @@ int processCommand(client *c) {
c
->
cmd
->
proc
!=
authCommand
&&
c
->
cmd
->
proc
!=
helloCommand
&&
c
->
cmd
->
proc
!=
replconfCommand
&&
c
->
cmd
->
proc
!=
multiCommand
&&
c
->
cmd
->
proc
!=
execCommand
&&
c
->
cmd
->
proc
!=
discardCommand
&&
!
(
c
->
cmd
->
proc
==
shutdownCommand
&&
c
->
argc
==
2
&&
tolower
(((
char
*
)
c
->
argv
[
1
]
->
ptr
)[
0
])
==
'n'
)
&&
...
...
tests/unit/multi.tcl
View file @
643bc48a
...
...
@@ -320,4 +320,76 @@ start_server {tags {"multi"}} {
$rd close
r ping
}
{
PONG
}
test
{
MULTI and script timeout
}
{
# check that if MULTI arrives during timeout, it is either refused, or
# allowed to pass, and we don't end up executing half of the transaction
set rd1
[
redis_deferring_client
]
set rd2
[
redis_deferring_client
]
r config set lua-time-limit 10
r set xx 1
$rd1 eval
{
while true do end
}
0
after 200
catch
{
$rd2 multi
;
$rd2 read
}
e
catch
{
$rd2 incr xx
;
$rd2 read
}
e
r script kill
after 200
;
# Give some time to Lua to call the hook again...
catch
{
$rd2 incr xx
;
$rd2 read
}
e
catch
{
$rd2 exec
;
$rd2 read
}
e
set xx
[
r get xx
]
# make sure that either the whole transcation passed or none of it
(
we actually expect none
)
assert
{
$xx == 1 || $xx == 3
}
# check that the connection is no longer in multi state
$rd2 ping asdf
set pong
[
$rd2
read
]
assert_equal $pong
"asdf"
}
test
{
EXEC and script timeout
}
{
# check that if EXEC arrives during timeout, we don't end up executing
# half of the transaction, and also that we exit the multi state
set rd1
[
redis_deferring_client
]
set rd2
[
redis_deferring_client
]
r config set lua-time-limit 10
r set xx 1
catch
{
$rd2 multi
;
$rd2 read
}
e
catch
{
$rd2 incr xx
;
$rd2 read
}
e
$rd1 eval
{
while true do end
}
0
after 200
catch
{
$rd2 incr xx
;
$rd2 read
}
e
catch
{
$rd2 exec
;
$rd2 read
}
e
r script kill
after 200
;
# Give some time to Lua to call the hook again...
set xx
[
r get xx
]
# make sure that either the whole transcation passed or none of it
(
we actually expect none
)
assert
{
$xx == 1 || $xx == 3
}
# check that the connection is no longer in multi state
$rd2 ping asdf
set pong
[
$rd2
read
]
assert_equal $pong
"asdf"
}
test
{
MULTI-EXEC body and script timeout
}
{
# check that we don't run an imcomplete transaction due to some commands
# arriving during busy script
set rd1
[
redis_deferring_client
]
set rd2
[
redis_deferring_client
]
r config set lua-time-limit 10
r set xx 1
catch
{
$rd2 multi
;
$rd2 read
}
e
catch
{
$rd2 incr xx
;
$rd2 read
}
e
$rd1 eval
{
while true do end
}
0
after 200
catch
{
$rd2 incr xx
;
$rd2 read
}
e
r script kill
after 200
;
# Give some time to Lua to call the hook again...
catch
{
$rd2 exec
;
$rd2 read
}
e
set xx
[
r get xx
]
# make sure that either the whole transcation passed or none of it
(
we actually expect none
)
assert
{
$xx == 1 || $xx == 3
}
# check that the connection is no longer in multi state
$rd2 ping asdf
set pong
[
$rd2
read
]
assert_equal $pong
"asdf"
}
}
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