mirror of
http://github.com/valkey-io/valkey
synced 2024-11-22 09:17:20 +00:00
02fd76b97c
Part one of implementing #8702 (taking hashes first before other types) ## Description of the feature 1. Change ziplist encoded hash objects to listpack encoding. 2. Convert existing ziplists on RDB loading time. an O(n) operation. ## Rdb format changes 1. Add RDB_TYPE_HASH_LISTPACK rdb type. 2. Bump RDB_VERSION to 10 ## Interface changes 1. New `hash-max-listpack-entries` config is an alias for `hash-max-ziplist-entries` (same with `hash-max-listpack-value`) 2. OBJECT ENCODING will return `listpack` instead of `ziplist` ## Listpack improvements: 1. Support direct insert, replace integer element (rather than convert back and forth from string) 3. Add more listpack capabilities to match the ziplist ones (like `lpFind`, `lpRandomPairs` and such) 4. Optimize element length fetching, avoid multiple calculations 5. Use inline to avoid function call overhead. ## Tests 1. Add a new test to the RDB load time conversion 2. Adding the listpack unit tests. (based on the one in ziplist.c) 3. Add a few "corrupt payload: fuzzer findings" tests, and slightly modify existing ones. Co-authored-by: Oran Agra <oran@redislabs.com>
40 lines
1.3 KiB
Tcl
40 lines
1.3 KiB
Tcl
tags {"external:skip"} {
|
|
|
|
# Copy RDB with zipmap encoded hash to server path
|
|
set server_path [tmpdir "server.convert-zipmap-hash-on-load"]
|
|
|
|
exec cp -f tests/assets/hash-zipmap.rdb $server_path
|
|
start_server [list overrides [list "dir" $server_path "dbfilename" "hash-zipmap.rdb"]] {
|
|
test "RDB load zipmap hash: converts to listpack" {
|
|
r select 0
|
|
|
|
assert_match "*listpack*" [r debug object hash]
|
|
assert_equal 2 [r hlen hash]
|
|
assert_match {v1 v2} [r hmget hash f1 f2]
|
|
}
|
|
}
|
|
|
|
exec cp -f tests/assets/hash-zipmap.rdb $server_path
|
|
start_server [list overrides [list "dir" $server_path "dbfilename" "hash-zipmap.rdb" "hash-max-ziplist-entries" 1]] {
|
|
test "RDB load zipmap hash: converts to hash table when hash-max-ziplist-entries is exceeded" {
|
|
r select 0
|
|
|
|
assert_match "*hashtable*" [r debug object hash]
|
|
assert_equal 2 [r hlen hash]
|
|
assert_match {v1 v2} [r hmget hash f1 f2]
|
|
}
|
|
}
|
|
|
|
exec cp -f tests/assets/hash-zipmap.rdb $server_path
|
|
start_server [list overrides [list "dir" $server_path "dbfilename" "hash-zipmap.rdb" "hash-max-ziplist-value" 1]] {
|
|
test "RDB load zipmap hash: converts to hash table when hash-max-ziplist-value is exceeded" {
|
|
r select 0
|
|
|
|
assert_match "*hashtable*" [r debug object hash]
|
|
assert_equal 2 [r hlen hash]
|
|
assert_match {v1 v2} [r hmget hash f1 f2]
|
|
}
|
|
}
|
|
|
|
}
|