Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
baa14ef9
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
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,发现更多精彩内容 >>
提交
baa14ef9
编写于
11月 29, 2010
作者:
M
Michel Martens & Damian Janowski
提交者:
Michel Martens
11月 29, 2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix BRPOPLPUSH behavior for all use cases.
上级
8987bf23
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
53 addition
and
10 deletion
+53
-10
src/t_list.c
src/t_list.c
+10
-10
tests/unit/type/list.tcl
tests/unit/type/list.tcl
+43
-0
未找到文件。
src/t_list.c
浏览文件 @
baa14ef9
...
...
@@ -748,10 +748,6 @@ void unblockClientWaitingData(redisClient *c) {
decrRefCount
(
c
->
bpop
.
keys
[
j
]);
}
if
(
c
->
bpop
.
target
!=
NULL
)
{
decrRefCount
(
c
->
bpop
.
target
);
}
/* Cleanup the client structure */
zfree
(
c
->
bpop
.
keys
);
c
->
bpop
.
keys
=
NULL
;
...
...
@@ -789,7 +785,11 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
redisAssert
(
ln
!=
NULL
);
receiver
=
ln
->
value
;
if
(
receiver
->
bpop
.
target
==
NULL
)
{
robj
*
target
=
receiver
->
bpop
.
target
;
unblockClientWaitingData
(
receiver
);
if
(
target
==
NULL
)
{
/* BRPOP/BLPOP return a multi-bulk with the name
* of the popped list */
addReplyMultiBulkLen
(
receiver
,
2
);
...
...
@@ -797,23 +797,23 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
addReplyBulk
(
receiver
,
ele
);
}
else
{
/* BRPOPLPUSH */
robj
*
dobj
=
lookupKeyWrite
(
receiver
->
db
,
receiver
->
bpop
.
target
);
robj
*
dobj
=
lookupKeyWrite
(
receiver
->
db
,
target
);
if
(
dobj
&&
checkType
(
receiver
,
dobj
,
REDIS_LIST
))
return
0
;
addReplyBulk
(
receiver
,
ele
);
if
(
!
handleClientsWaitingListPush
(
receiver
,
receiver
->
bpop
.
target
,
ele
))
{
if
(
!
handleClientsWaitingListPush
(
receiver
,
target
,
ele
))
{
/* Create the list if the key does not exist */
if
(
!
dobj
)
{
dobj
=
createZiplistObject
();
dbAdd
(
receiver
->
db
,
receiver
->
bpop
.
target
,
dobj
);
dbAdd
(
receiver
->
db
,
target
,
dobj
);
}
listTypePush
(
dobj
,
ele
,
REDIS_HEAD
);
}
decrRefCount
(
target
);
}
unblockClientWaitingData
(
receiver
);
return
1
;
}
...
...
tests/unit/type/list.tcl
浏览文件 @
baa14ef9
...
...
@@ -191,6 +191,49 @@ start_server {
assert_equal
{
foo
}
[
r lrange blist 0 -1
]
}
test
"linked BRPOPLPUSH"
{
set rd1
[
redis_deferring_client
]
set rd2
[
redis_deferring_client
]
r del list1 list2 list3
$rd1 brpoplpush list1 list2 0
$rd2 brpoplpush list2 list3 0
r rpush list1 foo
assert_equal
{}
[
r lrange list1 0 -1
]
assert_equal
{}
[
r lrange list2 0 -1
]
assert_equal
{
foo
}
[
r lrange list3 0 -1
]
}
test
"circular BRPOPLPUSH"
{
set rd1
[
redis_deferring_client
]
set rd2
[
redis_deferring_client
]
r del list1 list2
$rd1 brpoplpush list1 list2 0
$rd2 brpoplpush list2 list1 0
r rpush list1 foo
assert_equal
{
foo
}
[
r lrange list1 0 -1
]
assert_equal
{}
[
r lrange list2 0 -1
]
}
test
"self-referential BRPOPLPUSH"
{
set rd
[
redis_deferring_client
]
r del blist
$rd brpoplpush blist blist 0
r rpush blist foo
assert_equal
{
foo
}
[
r lrange blist 0 -1
]
}
test
"BRPOPLPUSH inside a transaction"
{
r del xlist target
r lpush xlist foo
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录