Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Turbo码先生
redis
提交
45ae6501
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,发现更多精彩内容 >>
提交
45ae6501
编写于
5月 10, 2010
作者:
A
antirez
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'check-aof' of
git://github.com/pietern/redis
上级
585af7e2
8063b99d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
192 addition
and
2 deletion
+192
-2
.gitignore
.gitignore
+1
-0
Makefile
Makefile
+7
-2
redis-check-aof.c
redis-check-aof.c
+184
-0
未找到文件。
.gitignore
浏览文件 @
45ae6501
...
...
@@ -6,6 +6,7 @@ redis-cli
redis-server
redis-benchmark
redis-check-dump
redis-check-aof
doc-tools
mkrelease.sh
release
...
...
Makefile
浏览文件 @
45ae6501
...
...
@@ -20,13 +20,15 @@ OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort
BENCHOBJ
=
ae.o anet.o redis-benchmark.o sds.o adlist.o zmalloc.o
CLIOBJ
=
anet.o sds.o adlist.o redis-cli.o zmalloc.o linenoise.o
CHECKDUMPOBJ
=
redis-check-dump.o lzf_c.o lzf_d.o
CHECKAOFOBJ
=
redis-check-aof.o
PRGNAME
=
redis-server
BENCHPRGNAME
=
redis-benchmark
CLIPRGNAME
=
redis-cli
CHECKDUMPPRGNAME
=
redis-check-dump
CHECKAOFPRGNAME
=
redis-check-aof
all
:
redis-server redis-benchmark redis-cli redis-check-dump
all
:
redis-server redis-benchmark redis-cli redis-check-dump
redis-check-aof
# Deps (use make dep to generate this)
adlist.o
:
adlist.c adlist.h zmalloc.h
...
...
@@ -68,11 +70,14 @@ redis-cli: $(CLIOBJ)
redis-check-dump
:
$(CHECKDUMPOBJ)
$(CC)
-o
$(CHECKDUMPPRGNAME)
$(CCOPT)
$(DEBUG)
$(CHECKDUMPOBJ)
redis-check-aof
:
$(CHECKAOFOBJ)
$(CC)
-o
$(CHECKAOFPRGNAME)
$(CCOPT)
$(DEBUG)
$(CHECKAOFOBJ)
.c.o
:
$(CC)
-c
$(CFLAGS)
$(DEBUG)
$(COMPILE_TIME)
$<
clean
:
rm
-rf
$(PRGNAME)
$(BENCHPRGNAME)
$(CLIPRGNAME)
$(CHECKDUMPPRGNAME)
*
.o
*
.gcda
*
.gcno
*
.gcov
rm
-rf
$(PRGNAME)
$(BENCHPRGNAME)
$(CLIPRGNAME)
$(CHECKDUMPPRGNAME)
$(CHECKAOFPRGNAME)
*
.o
*
.gcda
*
.gcno
*
.gcov
dep
:
$(CC)
-MM
*
.c
...
...
redis-check-aof.c
0 → 100644
浏览文件 @
45ae6501
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include "config.h"
#define ERROR(...) { \
char __buf[1024]; \
sprintf(__buf, __VA_ARGS__); \
sprintf(error, "0x%08lx: %s", epos, __buf); \
}
static
char
error
[
1024
];
static
long
epos
;
int
consumeNewline
(
char
*
buf
)
{
if
(
strncmp
(
buf
,
"
\r\n
"
,
2
)
!=
0
)
{
ERROR
(
"Expected
\\
r
\\
n, got: %02x%02x"
,
buf
[
0
],
buf
[
1
]);
return
0
;
}
return
1
;
}
int
readLong
(
FILE
*
fp
,
char
prefix
,
long
*
target
)
{
char
buf
[
128
],
*
eptr
;
epos
=
ftell
(
fp
);
if
(
fgets
(
buf
,
sizeof
(
buf
),
fp
)
==
NULL
)
{
return
0
;
}
if
(
buf
[
0
]
!=
prefix
)
{
ERROR
(
"Expected prefix '%c', got: '%c'"
,
buf
[
0
],
prefix
);
return
0
;
}
*
target
=
strtol
(
buf
+
1
,
&
eptr
,
10
);
return
consumeNewline
(
eptr
);
}
int
readBytes
(
FILE
*
fp
,
char
*
target
,
long
length
)
{
long
real
;
epos
=
ftell
(
fp
);
real
=
fread
(
target
,
1
,
length
,
fp
);
if
(
real
!=
length
)
{
ERROR
(
"Expected to read %ld bytes, got %ld bytes"
,
length
,
real
);
return
0
;
}
return
1
;
}
int
readString
(
FILE
*
fp
,
char
**
target
)
{
long
len
;
*
target
=
NULL
;
if
(
!
readLong
(
fp
,
'$'
,
&
len
))
{
return
0
;
}
/* Increase length to also consume \r\n */
len
+=
2
;
*
target
=
(
char
*
)
malloc
(
len
);
if
(
!
readBytes
(
fp
,
*
target
,
len
))
{
return
0
;
}
if
(
!
consumeNewline
(
*
target
+
len
-
2
))
{
return
0
;
}
(
*
target
)[
len
-
2
]
=
'\0'
;
return
1
;
}
int
readArgc
(
FILE
*
fp
,
long
*
target
)
{
return
readLong
(
fp
,
'*'
,
target
);
}
long
process
(
FILE
*
fp
)
{
long
argc
,
pos
=
0
;
int
i
,
multi
=
0
;
char
*
str
;
while
(
1
)
{
if
(
!
multi
)
pos
=
ftell
(
fp
);
if
(
!
readArgc
(
fp
,
&
argc
))
break
;
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
if
(
!
readString
(
fp
,
&
str
))
break
;
if
(
i
==
0
)
{
if
(
strcasecmp
(
str
,
"multi"
)
==
0
)
{
if
(
multi
++
)
{
ERROR
(
"Unexpected MULTI"
);
break
;
}
}
else
if
(
strcasecmp
(
str
,
"exec"
)
==
0
)
{
if
(
--
multi
)
{
ERROR
(
"Unexpected EXEC"
);
break
;
}
}
}
free
(
str
);
}
/* Stop if the loop did not finish */
if
(
i
<
argc
)
{
if
(
str
)
free
(
str
);
break
;
}
}
if
(
feof
(
fp
)
&&
multi
&&
strlen
(
error
)
==
0
)
{
ERROR
(
"Reached EOF before reading EXEC for MULTI"
);
}
if
(
strlen
(
error
)
>
0
)
{
printf
(
"%s
\n
"
,
error
);
}
return
pos
;
}
int
main
(
int
argc
,
char
**
argv
)
{
char
*
filename
;
int
fix
=
0
;
if
(
argc
<
2
)
{
printf
(
"Usage: %s [--fix] <file.aof>
\n
"
,
argv
[
0
]);
exit
(
1
);
}
else
if
(
argc
==
2
)
{
filename
=
argv
[
1
];
}
else
if
(
argc
==
3
)
{
if
(
strcmp
(
argv
[
1
],
"--fix"
)
!=
0
)
{
printf
(
"Invalid argument: %s
\n
"
,
argv
[
1
]);
exit
(
1
);
}
filename
=
argv
[
2
];
fix
=
1
;
}
else
{
printf
(
"Invalid arguments
\n
"
);
exit
(
1
);
}
FILE
*
fp
=
fopen
(
filename
,
"r+"
);
if
(
fp
==
NULL
)
{
printf
(
"Cannot open file: %s
\n
"
,
filename
);
exit
(
1
);
}
struct
redis_stat
sb
;
if
(
redis_fstat
(
fileno
(
fp
),
&
sb
)
==
-
1
)
{
printf
(
"Cannot stat file: %s
\n
"
,
filename
);
exit
(
1
);
}
long
size
=
sb
.
st_size
;
if
(
size
==
0
)
{
printf
(
"Empty file: %s
\n
"
,
filename
);
exit
(
1
);
}
long
pos
=
process
(
fp
);
long
diff
=
size
-
pos
;
if
(
diff
>
0
)
{
if
(
fix
)
{
char
buf
[
2
];
printf
(
"This will shrink the AOF from %ld bytes, with %ld bytes, to %ld bytes
\n
"
,
size
,
diff
,
pos
);
printf
(
"Continue? [y/N]: "
);
if
(
fgets
(
buf
,
sizeof
(
buf
),
stdin
)
==
NULL
||
strncasecmp
(
buf
,
"y"
,
1
)
!=
0
)
{
printf
(
"Aborting...
\n
"
);
exit
(
1
);
}
if
(
ftruncate
(
fileno
(
fp
),
pos
)
==
-
1
)
{
printf
(
"Failed to truncate AOF
\n
"
);
exit
(
1
);
}
else
{
printf
(
"Successfully truncated AOF
\n
"
);
}
}
else
{
printf
(
"AOF is not valid
\n
"
);
exit
(
1
);
}
}
else
{
printf
(
"AOF is valid
\n
"
);
}
fclose
(
fp
);
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录