Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Turbo码先生
redis
提交
a440ecf0
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,发现更多精彩内容 >>
提交
a440ecf0
编写于
12月 31, 2010
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
major bug and a dead lock fixed
上级
8e6bb671
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
19 addition
and
7 deletion
+19
-7
src/db.c
src/db.c
+4
-1
src/dscache.c
src/dscache.c
+15
-6
未找到文件。
src/db.c
浏览文件 @
a440ecf0
...
...
@@ -97,11 +97,14 @@ int dbAdd(redisDb *db, robj *key, robj *val) {
*
* On update (key already existed) 0 is returned. Otherwise 1. */
int
dbReplace
(
redisDb
*
db
,
robj
*
key
,
robj
*
val
)
{
if
(
dictFind
(
db
->
dict
,
key
->
ptr
)
==
NULL
)
{
robj
*
oldval
;
if
((
oldval
=
dictFetchValue
(
db
->
dict
,
key
->
ptr
))
==
NULL
)
{
sds
copy
=
sdsdup
(
key
->
ptr
);
dictAdd
(
db
->
dict
,
copy
,
val
);
return
1
;
}
else
{
val
->
storage
=
oldval
->
storage
;
dictReplace
(
db
->
dict
,
key
->
ptr
,
val
);
return
0
;
}
...
...
src/dscache.c
浏览文件 @
a440ecf0
...
...
@@ -356,12 +356,10 @@ void *IOThreadEntryPoint(void *arg) {
pthread_detach
(
pthread_self
());
lockThreadedIO
();
while
(
1
)
{
/* Wait for more work to do */
pthread_cond_wait
(
&
server
.
io_condvar
,
&
server
.
io_mutex
);
/* Get a new job to process */
if
(
listLength
(
server
.
io_newjobs
)
==
0
)
{
/*
No new jobs in queue, reiterate.
*/
unlockThreadedIO
(
);
/*
Wait for more work to do
*/
pthread_cond_wait
(
&
server
.
io_condvar
,
&
server
.
io_mutex
);
continue
;
}
ln
=
listFirst
(
server
.
io_newjobs
);
...
...
@@ -439,6 +437,16 @@ void waitEmptyIOJobsQueue(void) {
unlockThreadedIO
();
return
;
}
/* If there are new jobs we need to signal the thread to
* process the next one. */
redisLog
(
REDIS_DEBUG
,
"waitEmptyIOJobsQueue: new %d, processing %d"
,
listLength
(
server
.
io_newjobs
),
listLength
(
server
.
io_processing
));
/*
if (listLength(server.io_newjobs)) {
pthread_cond_signal(&server.io_condvar);
}
*/
/* While waiting for empty jobs queue condition we post-process some
* finshed job, as I/O threads may be hanging trying to write against
* the io_ready_pipe_write FD but there are so much pending jobs that
...
...
@@ -509,7 +517,8 @@ void cacheScheduleForFlush(redisDb *db, robj *key) {
val
->
storage
=
REDIS_DS_DIRTY
;
}
redisLog
(
REDIS_DEBUG
,
"Scheduling key %s for saving"
,
key
->
ptr
);
redisLog
(
REDIS_DEBUG
,
"Scheduling key %s for saving (%s)"
,
key
->
ptr
,
de
?
"key exists"
:
"key does not exist"
);
dk
=
zmalloc
(
sizeof
(
*
dk
));
dk
->
db
=
db
;
dk
->
key
=
key
;
...
...
@@ -533,7 +542,7 @@ void cacheCron(void) {
redisLog
(
REDIS_DEBUG
,
"Creating IO Job to save key %s"
,
dk
->
key
->
ptr
);
/* Lookup the key, in order to put the current value in the IO
* Job and mark
ti
as DS_SAVING.
* Job and mark
it
as DS_SAVING.
* Otherwise if the key does not exists we schedule a disk store
* delete operation, setting the value to NULL. */
de
=
dictFind
(
dk
->
db
->
dict
,
dk
->
key
->
ptr
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录