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
3805e04f
Commit
3805e04f
authored
May 07, 2010
by
Pieter Noordhuis
Browse files
added function that preloads all keys needed to execute a MULTI/EXEC block
parent
739ba0d2
Changes
1
Show whitespace changes
Inline
Side-by-side
redis.c
View file @
3805e04f
...
@@ -610,6 +610,7 @@ static void waitEmptyIOJobsQueue(void);
...
@@ -610,6 +610,7 @@ static void waitEmptyIOJobsQueue(void);
static
void
vmReopenSwapFile
(
void
);
static
void
vmReopenSwapFile
(
void
);
static
int
vmFreePage
(
off_t
page
);
static
int
vmFreePage
(
off_t
page
);
static
void
zunionInterBlockClientOnSwappedKeys
(
redisClient
*
c
,
struct
redisCommand
*
cmd
,
int
argc
,
robj
**
argv
);
static
void
zunionInterBlockClientOnSwappedKeys
(
redisClient
*
c
,
struct
redisCommand
*
cmd
,
int
argc
,
robj
**
argv
);
static
void
execBlockClientOnSwappedKeys
(
redisClient
*
c
,
struct
redisCommand
*
cmd
,
int
argc
,
robj
**
argv
);
static
int
blockClientOnSwappedKeys
(
struct
redisCommand
*
cmd
,
redisClient
*
c
);
static
int
blockClientOnSwappedKeys
(
struct
redisCommand
*
cmd
,
redisClient
*
c
);
static
int
dontWaitForSwappedKey
(
redisClient
*
c
,
robj
*
key
);
static
int
dontWaitForSwappedKey
(
redisClient
*
c
,
robj
*
key
);
static
void
handleClientsBlockedOnSwappedKey
(
redisDb
*
db
,
robj
*
key
);
static
void
handleClientsBlockedOnSwappedKey
(
redisDb
*
db
,
robj
*
key
);
...
@@ -826,7 +827,7 @@ static struct redisCommand cmdTable[] = {
...
@@ -826,7 +827,7 @@ static struct redisCommand cmdTable[] = {
{
"lastsave"
,
lastsaveCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"lastsave"
,
lastsaveCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"type"
,
typeCommand
,
2
,
REDIS_CMD_INLINE
,
NULL
,
1
,
1
,
1
},
{
"type"
,
typeCommand
,
2
,
REDIS_CMD_INLINE
,
NULL
,
1
,
1
,
1
},
{
"multi"
,
multiCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"multi"
,
multiCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"exec"
,
execCommand
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_DENYOOM
,
NULL
,
0
,
0
,
0
},
{
"exec"
,
execCommand
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_DENYOOM
,
execBlockClientOnSwappedKeys
,
0
,
0
,
0
},
{
"discard"
,
discardCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"discard"
,
discardCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"sync"
,
syncCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"sync"
,
syncCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"flushdb"
,
flushdbCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
{
"flushdb"
,
flushdbCommand
,
1
,
REDIS_CMD_INLINE
,
NULL
,
0
,
0
,
0
},
...
@@ -9576,6 +9577,32 @@ static void zunionInterBlockClientOnSwappedKeys(redisClient *c, struct redisComm
...
@@ -9576,6 +9577,32 @@ static void zunionInterBlockClientOnSwappedKeys(redisClient *c, struct redisComm
}
}
}
}
/* Preload keys needed to execute the entire MULTI/EXEC block.
*
* This function is called by blockClientOnSwappedKeys when EXEC is issued,
* and will block the client when any command requires a swapped out value. */
static
void
execBlockClientOnSwappedKeys
(
redisClient
*
c
,
struct
redisCommand
*
cmd
,
int
argc
,
robj
**
argv
)
{
int
i
,
margc
;
struct
redisCommand
*
mcmd
;
robj
**
margv
;
REDIS_NOTUSED
(
cmd
);
REDIS_NOTUSED
(
argc
);
REDIS_NOTUSED
(
argv
);
if
(
!
(
c
->
flags
&
REDIS_MULTI
))
return
;
for
(
i
=
0
;
i
<
c
->
mstate
.
count
;
i
++
)
{
mcmd
=
c
->
mstate
.
commands
[
i
].
cmd
;
margc
=
c
->
mstate
.
commands
[
i
].
argc
;
margv
=
c
->
mstate
.
commands
[
i
].
argv
;
if
(
mcmd
->
vm_preload_proc
!=
NULL
)
{
mcmd
->
vm_preload_proc
(
c
,
mcmd
,
margc
,
margv
);
}
else
{
waitForMultipleSwappedKeys
(
c
,
mcmd
,
margc
,
margv
);
}
}
}
/* Is this client attempting to run a command against swapped keys?
/* Is this client attempting to run a command against swapped keys?
* If so, block it ASAP, load the keys in background, then resume it.
* If so, block it ASAP, load the keys in background, then resume it.
*
*
...
...
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