Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
db3c2a4f
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,发现更多精彩内容 >>
提交
db3c2a4f
编写于
9月 16, 2011
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
postpone the AOF fsync if policy is everysec and there is a background fsync already going.
上级
9a35eb22
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
54 addition
and
8 deletion
+54
-8
src/aof.c
src/aof.c
+46
-7
src/redis.c
src/redis.c
+7
-1
src/redis.h
src/redis.h
+1
-0
未找到文件。
src/aof.c
浏览文件 @
db3c2a4f
...
...
@@ -18,7 +18,7 @@ void aof_background_fsync(int fd) {
/* Called when the user switches from "appendonly yes" to "appendonly no"
* at runtime using the CONFIG command. */
void
stopAppendOnly
(
void
)
{
flushAppendOnlyFile
();
flushAppendOnlyFile
(
1
);
aof_fsync
(
server
.
appendfd
);
close
(
server
.
appendfd
);
...
...
@@ -63,12 +63,50 @@ int startAppendOnly(void) {
* and the only way the client socket can get a write is entering when the
* the event loop, we accumulate all the AOF writes in a memory
* buffer and write it on disk using this function just before entering
* the event loop again. */
void
flushAppendOnlyFile
(
void
)
{
* the event loop again.
*
* About the 'force' argument:
*
* When the fsync policy is set to 'everysec' we may delay the flush if there
* is still an fsync() going on in the background thread, since for instance
* on Linux write(2) will be blocked by the background fsync anyway.
* When this happens we remember that there is some aof buffer to be
* flushed ASAP, and will try to do that in the serverCron() function.
*
* However if force is set to 1 we'll write regardless of the background
* fsync. */
void
flushAppendOnlyFile
(
int
force
)
{
ssize_t
nwritten
;
int
sync_in_progress
=
0
;
if
(
sdslen
(
server
.
aofbuf
)
==
0
)
return
;
if
(
server
.
appendfsync
==
APPENDFSYNC_EVERYSEC
)
sync_in_progress
=
bioPendingJobsOfType
(
REDIS_BIO_AOF_FSYNC
)
!=
0
;
if
(
server
.
appendfsync
==
APPENDFSYNC_EVERYSEC
&&
!
force
)
{
/* With this append fsync policy we do background fsyncing.
* If the fsync is still in progress we can try to delay
* the write for a couple of seconds. */
if
(
sync_in_progress
)
{
if
(
server
.
aof_flush_postponed_start
==
0
)
{
/* No previous write postponinig, remember that we are
* postponing the flush and return. */
server
.
aof_flush_postponed_start
=
server
.
unixtime
;
return
;
}
else
if
(
server
.
unixtime
-
server
.
aof_flush_postponed_start
<
2
)
{
/* We were already writing for fsync to finish, but for less
* than two seconds this is still ok. Postpone again. */
return
;
}
/* Otherwise fall trough, and go write since we can't wait
* over two seconds. */
}
}
/* If you are following this code path, then we are going to write so
* set reset the postponed flush sentinel to zero. */
server
.
aof_flush_postponed_start
=
0
;
/* We want to perform a single write. This should be guaranteed atomic
* at least if the filesystem we are writing is a real physical one.
* While this will save us against the server being killed I don't think
...
...
@@ -104,14 +142,15 @@ void flushAppendOnlyFile(void) {
return
;
/* Perform the fsync if needed. */
if
(
server
.
appendfsync
==
APPENDFSYNC_ALWAYS
||
(
server
.
appendfsync
==
APPENDFSYNC_EVERYSEC
&&
server
.
unixtime
>
server
.
lastfsync
))
{
if
(
server
.
appendfsync
==
APPENDFSYNC_ALWAYS
)
{
/* aof_fsync is defined as fdatasync() for Linux in order to avoid
* flushing metadata. */
aof_fsync
(
server
.
appendfd
);
/* Let's try to get this data on the disk */
server
.
lastfsync
=
server
.
unixtime
;
}
else
if
((
server
.
appendfsync
==
APPENDFSYNC_EVERYSEC
&&
server
.
unixtime
>
server
.
lastfsync
))
{
if
(
!
sync_in_progress
)
aof_background_fsync
(
server
.
appendfd
);
server
.
lastfsync
=
server
.
unixtime
;
}
}
...
...
src/redis.c
浏览文件 @
db3c2a4f
...
...
@@ -697,6 +697,11 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
}
}
/* If we postponed an AOF buffer flush, let's try to do it every time the
* cron function is called. */
if
(
server
.
aof_flush_postponed_start
)
flushAppendOnlyFile
(
0
);
/* Expire a few keys per cycle, only if this is a master.
* On slaves we wait for DEL operations synthesized by the master
* in order to guarantee a strict consistency. */
...
...
@@ -735,7 +740,7 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
}
/* Write the AOF buffer on disk */
flushAppendOnlyFile
();
flushAppendOnlyFile
(
0
);
}
/* =========================== Server initialization ======================== */
...
...
@@ -822,6 +827,7 @@ void initServerConfig() {
server
.
lastfsync
=
time
(
NULL
);
server
.
appendfd
=
-
1
;
server
.
appendseldb
=
-
1
;
/* Make sure the first time will not match */
server
.
aof_flush_postponed_start
=
0
;
server
.
pidfile
=
zstrdup
(
"/var/run/redis.pid"
);
server
.
dbfilename
=
zstrdup
(
"dump.rdb"
);
server
.
appendfilename
=
zstrdup
(
"appendonly.aof"
);
...
...
src/redis.h
浏览文件 @
db3c2a4f
...
...
@@ -559,6 +559,7 @@ struct redisServer {
time_t
lastfsync
;
int
appendfd
;
int
appendseldb
;
time_t
aof_flush_postponed_start
;
char
*
pidfile
;
pid_t
bgsavechildpid
;
pid_t
bgrewritechildpid
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录