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
be34a1a4
"tests/vscode:/vscode.git/clone" did not exist on "4faddf18ca8ca3adb93cf1e4e620be9eaf0f6bf4"
Commit
be34a1a4
authored
Apr 05, 2023
by
Vitaly Arbuzov
Browse files
Use direct CRC hash calculation instead of nulling out the client
parent
cd109e8e
Changes
4
Show whitespace changes
Inline
Side-by-side
src/db.c
View file @
be34a1a4
...
...
@@ -239,6 +239,14 @@ void dbAdd(redisDb *db, robj *key, robj *val) {
notifyKeyspaceEvent
(
NOTIFY_NEW
,
"new"
,
key
,
db
->
id
);
}
/* Returns key's hash slot when cluster mode is enabled, or 0 when disabled.
* The only difference between this function and getKeySlot, is that it's not using cached key slot from the current_client
* and always calculates CRC hash.
* This is useful when slot needs to be calculated for a key that user didn't request for, such as in case of eviction. */
int
calculateKeySlot
(
sds
key
)
{
return
server
.
cluster_enabled
?
keyHashSlot
(
key
,
(
int
)
sdslen
(
key
))
:
0
;
}
/* Return slot-specific dictionary for key based on key's hash slot in CME, or 0 in CMD.*/
int
getKeySlot
(
sds
key
)
{
/* This is performance optimization, that uses pre-set slot id from the current command,
...
...
@@ -247,7 +255,7 @@ int getKeySlot(sds key) {
if
(
server
.
current_client
&&
server
.
current_client
->
slot
>=
0
)
{
return
server
.
current_client
->
slot
;
}
return
server
.
cluster_enabled
?
keyHashSlot
(
key
,
(
int
)
sdslen
(
key
))
:
0
;
return
calculateKeySlot
(
key
)
;
}
/* This is a special version of dbAdd() that is used only when loading
...
...
src/evict.c
View file @
be34a1a4
...
...
@@ -161,7 +161,7 @@ void evictionPoolPopulate(int dbid, dict *sampledict, redisDb *db, struct evicti
* dictionary (but the expires one) we need to lookup the key
* again in the key dictionary to obtain the value object. */
if
(
server
.
maxmemory_policy
!=
MAXMEMORY_VOLATILE_TTL
)
{
if
(
!
(
server
.
maxmemory_policy
&
MAXMEMORY_FLAG_ALLKEYS
))
de
=
dictFind
(
db
->
dict
[
get
KeySlot
(
key
)],
key
);
if
(
!
(
server
.
maxmemory_policy
&
MAXMEMORY_FLAG_ALLKEYS
))
de
=
dictFind
(
db
->
dict
[
calculate
KeySlot
(
key
)],
key
);
o
=
dictGetVal
(
de
);
}
...
...
@@ -570,11 +570,6 @@ int performEvictions(void) {
/* Try to smoke-out bugs (server.also_propagate should be empty here) */
serverAssert
(
server
.
also_propagate
.
numops
==
0
);
/* Evictions are performed on random keys that have nothing to do with the current command slot. */
int
client_slot
=
-
1
;
if
(
server
.
current_client
)
{
client_slot
=
server
.
current_client
->
slot
;
server
.
current_client
->
slot
=
-
1
;
}
while
(
mem_freed
<
(
long
long
)
mem_tofree
)
{
int
j
,
k
,
i
;
...
...
@@ -619,7 +614,7 @@ int performEvictions(void) {
bestdbid
=
pool
[
k
].
dbid
;
if
(
server
.
maxmemory_policy
&
MAXMEMORY_FLAG_ALLKEYS
)
{
de
=
dictFind
(
server
.
db
[
bestdbid
].
dict
[
get
KeySlot
(
pool
[
k
].
key
)],
de
=
dictFind
(
server
.
db
[
bestdbid
].
dict
[
calculate
KeySlot
(
pool
[
k
].
key
)],
pool
[
k
].
key
);
}
else
{
de
=
dictFind
(
server
.
db
[
bestdbid
].
expires
,
...
...
@@ -728,7 +723,6 @@ int performEvictions(void) {
goto
cant_free
;
/* nothing to free... */
}
}
if
(
client_slot
!=
-
1
)
server
.
current_client
->
slot
=
client_slot
;
/* Restore client slot for further command processing. */
/* at this point, the memory is OK, or we have reached the time limit */
result
=
(
isEvictionProcRunning
)
?
EVICT_RUNNING
:
EVICT_OK
;
...
...
src/multi.c
View file @
be34a1a4
...
...
@@ -394,7 +394,7 @@ void touchWatchedKey(redisDb *db, robj *key) {
/* The key was already expired when WATCH was called. */
if
(
db
==
wk
->
db
&&
equalStringObjects
(
key
,
wk
->
key
)
&&
dictFind
(
db
->
dict
[
get
KeySlot
(
key
->
ptr
)],
key
->
ptr
)
==
NULL
)
dictFind
(
db
->
dict
[
calculate
KeySlot
(
key
->
ptr
)],
key
->
ptr
)
==
NULL
)
{
/* Already expired key is deleted, so logically no change. Clear
* the flag. Deleted keys are not flagged as expired. */
...
...
@@ -432,9 +432,9 @@ void touchAllWatchedKeysInDb(redisDb *emptied, redisDb *replaced_with) {
dictIterator
*
di
=
dictGetSafeIterator
(
emptied
->
watched_keys
);
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
robj
*
key
=
dictGetKey
(
de
);
int
exists_in_emptied
=
dictFind
(
emptied
->
dict
[
get
KeySlot
(
key
->
ptr
)],
key
->
ptr
)
!=
NULL
;
int
exists_in_emptied
=
dictFind
(
emptied
->
dict
[
calculate
KeySlot
(
key
->
ptr
)],
key
->
ptr
)
!=
NULL
;
if
(
exists_in_emptied
||
(
replaced_with
&&
dictFind
(
replaced_with
->
dict
[
get
KeySlot
(
key
->
ptr
)],
key
->
ptr
)))
(
replaced_with
&&
dictFind
(
replaced_with
->
dict
[
calculate
KeySlot
(
key
->
ptr
)],
key
->
ptr
)))
{
list
*
clients
=
dictGetVal
(
de
);
if
(
!
clients
)
continue
;
...
...
@@ -442,7 +442,7 @@ void touchAllWatchedKeysInDb(redisDb *emptied, redisDb *replaced_with) {
while
((
ln
=
listNext
(
&
li
)))
{
watchedKey
*
wk
=
redis_member2struct
(
watchedKey
,
node
,
ln
);
if
(
wk
->
expired
)
{
if
(
!
replaced_with
||
!
dictFind
(
replaced_with
->
dict
[
get
KeySlot
(
key
->
ptr
)],
key
->
ptr
))
{
if
(
!
replaced_with
||
!
dictFind
(
replaced_with
->
dict
[
calculate
KeySlot
(
key
->
ptr
)],
key
->
ptr
))
{
/* Expired key now deleted. No logical change. Clear the
* flag. Deleted keys are not flagged as expired. */
wk
->
expired
=
0
;
...
...
src/server.h
View file @
be34a1a4
...
...
@@ -3129,6 +3129,7 @@ void dismissMemoryInChild(void);
int
restartServer
(
int
flags
,
mstime_t
delay
);
unsigned
long
long
int
dbSize
(
redisDb
*
db
);
int
getKeySlot
(
sds
key
);
int
calculateKeySlot
(
sds
key
);
unsigned
long
dbSlots
(
redisDb
*
db
);
void
expandDb
(
const
redisDb
*
db
,
uint64_t
db_size
);
unsigned
long
long
cumulativeKeyCountRead
(
redisDb
*
db
,
int
idx
);
...
...
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