summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-02-03 10:25:01 +0100
committerantirez <antirez@gmail.com>2015-02-03 10:25:01 +0100
commit7d1e15808422a1233280440566a5c684de7aa92f (patch)
tree4cdfb13947f83d893d35404f961471bcfdad1316
parent45102a6f639712cd6025112bac6a988dc6e6b897 (diff)
downloadredis-7d1e15808422a1233280440566a5c684de7aa92f.tar.gz
Handle redis-check-rdb as a standalone program.
This also makes it backward compatible in the usage, but for the command name. However the old command name was less obvious so it is worth to break it probably. With the new setup the program main can perform argument parsing and everything else useful for an RDB check regardless of the Redis server itself.
-rw-r--r--.gitignore1
-rw-r--r--src/redis-check-rdb.c12
-rw-r--r--src/redis.c24
-rw-r--r--src/redis.h1
4 files changed, 20 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index cdab2150e..3d346fbcf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ dump.rdb
redis-benchmark
redis-check-aof
redis-check-rdb
+redis-check-dump
redis-cli
redis-sentinel
redis-server
diff --git a/src/redis-check-rdb.c b/src/redis-check-rdb.c
index ff87f142f..21f72c222 100644
--- a/src/redis-check-rdb.c
+++ b/src/redis-check-rdb.c
@@ -696,3 +696,15 @@ int redis_check_rdb(char *rdbfilename) {
close(fd);
return 0;
}
+
+/* RDB check main: called form redis.c when Redis is executed with the
+ * redis-check-rdb alias. */
+int redis_check_rdb_main(char **argv, int argc) {
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <rdb-file-name>\n", argv[0]);
+ exit(1);
+ }
+ redisLog(REDIS_WARNING, "Checking RDB file %s", argv[1]);
+ exit(redis_check_rdb(argv[1]));
+ return 0;
+}
diff --git a/src/redis.c b/src/redis.c
index 24739cc3c..b2f9ffc68 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -3550,17 +3550,6 @@ int checkForSentinelMode(int argc, char **argv) {
return 0;
}
-/* Returns 1 if there is --check-rdb among the arguments or if
- * argv[0] is exactly "redis-check-rdb". */
-int checkForCheckRDBMode(int argc, char **argv) {
- int j;
-
- if (strstr(argv[0],"redis-check-rdb") != NULL) return 1;
- for (j = 1; j < argc; j++)
- if (!strcmp(argv[j],"--check-rdb")) return 1;
- return 0;
-}
-
/* Function called at startup to load RDB or AOF file in memory. */
void loadDataFromDisk(void) {
long long start = ustime();
@@ -3746,6 +3735,12 @@ int main(int argc, char **argv) {
initSentinel();
}
+ /* Check if we need to start in redis-check-rdb mode. We just execute
+ * the program main. However the program is part of the Redis executable
+ * so that we can easily execute an RDB check on loading errors. */
+ if (strstr(argv[0],"redis-check-rdb") != NULL)
+ exit(redis_check_rdb_main(argv,argc));
+
if (argc >= 2) {
int j = 1; /* First option to parse in argv[] */
sds options = sdsempty();
@@ -3807,13 +3802,6 @@ int main(int argc, char **argv) {
redisLog(REDIS_WARNING, "Warning: no config file specified, using the default config. In order to specify a config file use %s /path/to/%s.conf", argv[0], server.sentinel_mode ? "sentinel" : "redis");
}
- if (checkForCheckRDBMode(argc, argv)) {
- redisLog(REDIS_WARNING, "Checking RDB file %s", server.rdb_filename);
- redisLog(REDIS_WARNING, "To check different RDB file: "
- "redis-check-rdb --dbfilename <dump.rdb>");
- exit(redis_check_rdb(server.rdb_filename));
- }
-
server.supervised = redisIsSupervised(server.supervised_mode);
int background = server.daemonize && !server.supervised;
if (background) daemonize();
diff --git a/src/redis.h b/src/redis.h
index 87bb811b2..2170c5d29 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -1382,6 +1382,7 @@ void sentinelIsRunning(void);
/* redis-check-rdb */
int redis_check_rdb(char *rdbfilename);
+int redis_check_rdb_main(char **argv, int argc);
/* Scripting */
void scriptingInit(void);