提交 cb8ae3c8 编写于 作者: P Pieter Noordhuis

allow AOF to be fixed by truncating to the portion of the file that is valid

上级 b4bd0524
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include "config.h"
......@@ -126,34 +127,58 @@ long process(FILE *fp) {
int main(int argc, char **argv) {
/* expect the first argument to be the dump file */
if (argc <= 1) {
printf("Usage: %s <file.aof>\n", argv[0]);
printf("Usage: %s [--fix] <file.aof>\n", argv[0]);
exit(0);
}
FILE *fp = fopen(argv[1],"r");
char *filename;
int fix = 0;
if (argc == 3) {
if (strcmp(argv[1],"--fix") != 0) {
printf("Invalid argument: %s\n", argv[1]);
exit(1);
}
fix = 1;
filename = argv[2];
} else if (argc == 2) {
filename = argv[1];
} else {
printf("Invalid argument");
exit(1);
}
FILE *fp = fopen(filename,"r+");
if (fp == NULL) {
printf("Cannot open file: %s\n", argv[1]);
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", argv[1]);
printf("Cannot stat file: %s\n", filename);
exit(1);
}
long size = sb.st_size;
if (size == 0) {
printf("Empty file: %s\n", argv[1]);
printf("Empty file: %s\n", filename);
exit(1);
}
long pos = process(fp);
if (pos < size) {
printf("First invalid operation at offset %ld.\n", pos);
exit(1);
if (fix) {
if (ftruncate(fileno(fp), pos) == -1) {
printf("Could not truncate AOF to size %ld\n", pos);
exit(1);
} else {
printf("AOF succesfully truncated to %ld bytes\n", pos);
}
} else {
printf("First invalid operation at offset %ld\n", pos);
}
} else {
printf("AOF is valid.\n");
printf("AOF is valid\n");
}
fclose(fp);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册