Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Turbo码先生
redis
提交
81ceef7d
R
redis
项目概览
Turbo码先生
/
redis
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
81ceef7d
编写于
4月 14, 2014
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
PFMERGE fixed to work with sparse encoding.
上级
9df77fc0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
47 addition
and
10 deletion
+47
-10
src/hyperloglog.c
src/hyperloglog.c
+45
-8
tests/unit/hyperloglog.tcl
tests/unit/hyperloglog.tcl
+2
-2
未找到文件。
src/hyperloglog.c
浏览文件 @
81ceef7d
...
...
@@ -1130,7 +1130,7 @@ void pfcountCommand(redisClient *c) {
/* Recompute it and update the cached value. */
card
=
hllCount
(
hdr
,
&
invalid
);
if
(
invalid
)
{
addReplyError
(
c
,
"Invalid HLL object"
);
addReplyError
(
c
,
"Invalid HLL object
detected
"
);
return
;
}
hdr
->
card
[
0
]
=
card
&
0xff
;
...
...
@@ -1163,8 +1163,6 @@ void pfmergeCommand(redisClient *c) {
* it to the target variable later. */
memset
(
max
,
0
,
sizeof
(
max
));
for
(
j
=
1
;
j
<
c
->
argc
;
j
++
)
{
uint8_t
val
;
/* Check type and size. */
robj
*
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
j
]);
if
(
o
==
NULL
)
continue
;
/* Assume empty HLL for non existing var. */
...
...
@@ -1173,14 +1171,47 @@ void pfmergeCommand(redisClient *c) {
/* Merge with this HLL with our 'max' HHL by setting max[i]
* to MAX(max[i],hll[i]). */
hdr
=
o
->
ptr
;
for
(
i
=
0
;
i
<
HLL_REGISTERS
;
i
++
)
{
HLL_DENSE_GET_REGISTER
(
val
,
hdr
->
registers
,
i
);
if
(
val
>
max
[
i
])
max
[
i
]
=
val
;
if
(
hdr
->
encoding
==
HLL_DENSE
)
{
uint8_t
val
;
for
(
i
=
0
;
i
<
HLL_REGISTERS
;
i
++
)
{
HLL_DENSE_GET_REGISTER
(
val
,
hdr
->
registers
,
i
);
if
(
val
>
max
[
i
])
max
[
i
]
=
val
;
}
}
else
{
uint8_t
*
p
=
o
->
ptr
,
*
end
=
p
+
sdslen
(
o
->
ptr
);
long
runlen
,
regval
;
p
+=
HLL_HDR_SIZE
;
i
=
0
;
while
(
p
<
end
)
{
if
(
HLL_SPARSE_IS_ZERO
(
p
))
{
runlen
=
HLL_SPARSE_ZERO_LEN
(
p
);
i
+=
runlen
;
p
++
;
}
else
if
(
HLL_SPARSE_IS_XZERO
(
p
))
{
runlen
=
HLL_SPARSE_XZERO_LEN
(
p
);
i
+=
runlen
;
p
+=
2
;
}
else
{
runlen
=
HLL_SPARSE_VAL_LEN
(
p
);
regval
=
HLL_SPARSE_VAL_VALUE
(
p
);
while
(
runlen
--
)
{
if
(
regval
>
max
[
i
])
max
[
i
]
=
regval
;
i
++
;
}
p
++
;
}
}
if
(
i
!=
HLL_REGISTERS
)
{
addReplyError
(
c
,
"Invalid HLL object detected"
);
return
;
}
}
}
/* Create / unshare the destination key's value if needed. */
robj
*
o
=
lookupKey
Read
(
c
->
db
,
c
->
argv
[
1
]);
robj
*
o
=
lookupKey
Write
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
/* Create the key with a string value of the exact length to
* hold our HLL data structure. sdsnewlen() when NULL is passed
...
...
@@ -1194,6 +1225,12 @@ void pfmergeCommand(redisClient *c) {
o
=
dbUnshareStringValue
(
c
->
db
,
c
->
argv
[
1
],
o
);
}
/* Only support dense objects as destination. */
if
(
hllSparseToDense
(
o
)
==
REDIS_ERR
)
{
addReplyError
(
c
,
"Invalid HLL object detected"
);
return
;
}
/* Write the resulting HLL to the destination HLL registers and
* invalidate the cached value. */
hdr
=
o
->
ptr
;
...
...
@@ -1308,7 +1345,7 @@ void pfdebugCommand(redisClient *c) {
if
(
hdr
->
encoding
==
HLL_SPARSE
)
{
if
(
hllSparseToDense
(
o
)
==
REDIS_ERR
)
{
addReplyError
(
c
,
"
HLL sparse encoding is corrup
ted"
);
addReplyError
(
c
,
"
Invalid HLL object detec
ted"
);
return
;
}
server
.
dirty
++
;
/* Force propagation on encoding change. */
...
...
tests/unit/hyperloglog.tcl
浏览文件 @
81ceef7d
...
...
@@ -60,9 +60,9 @@ start_server {tags {"hll"}} {
r pfcount hll
}
{
5
}
test
{
PFGETREG returns the HyperLogLog raw registers
}
{
test
{
PF
DEBUG
GETREG returns the HyperLogLog raw registers
}
{
r del hll
r pfadd hll 1 2 3
llength
[
r pfgetreg hll
]
llength
[
r pf
debug
getreg hll
]
}
{
16384
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录