From 2f62c9663ca48b647d71f21d0cdf499346457f0f Mon Sep 17 00:00:00 2001 From: antirez Date: Thu, 29 Nov 2012 14:20:08 +0100 Subject: [PATCH] Introduced the Build ID in INFO and --version output. The idea is to be able to identify a build in a unique way, so for instance after a bug report we can recognize that the build is the one of a popular Linux distribution and perform the debugging in the same environment. --- src/Makefile | 2 +- src/crc64.h | 8 ++++++++ src/debug.c | 2 +- src/mkreleasehdr.sh | 2 ++ src/redis-check-dump.c | 4 +--- src/redis.c | 7 +++++-- src/redis.h | 1 + src/release.c | 10 ++++++++++ src/rio.c | 3 +-- 9 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 src/crc64.h diff --git a/src/Makefile b/src/Makefile index 358b4cbac..d4b6aad8c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -101,7 +101,7 @@ REDIS_SERVER_NAME= redis-server REDIS_SENTINEL_NAME= redis-sentinel REDIS_SERVER_OBJ= adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o REDIS_CLI_NAME= redis-cli -REDIS_CLI_OBJ= anet.o sds.o adlist.o redis-cli.o zmalloc.o release.o anet.o ae.o +REDIS_CLI_OBJ= anet.o sds.o adlist.o redis-cli.o zmalloc.o release.o anet.o ae.o crc64.o REDIS_BENCHMARK_NAME= redis-benchmark REDIS_BENCHMARK_OBJ= ae.o anet.o redis-benchmark.o sds.o adlist.o zmalloc.o redis-benchmark.o REDIS_CHECK_DUMP_NAME= redis-check-dump diff --git a/src/crc64.h b/src/crc64.h new file mode 100644 index 000000000..ab375d3f4 --- /dev/null +++ b/src/crc64.h @@ -0,0 +1,8 @@ +#ifndef CRC64_H +#define CRC64_H + +#include + +uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l); + +#endif diff --git a/src/debug.c b/src/debug.c index 31cfac65e..7d6fdf97d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -29,6 +29,7 @@ #include "redis.h" #include "sha1.h" /* SHA1 is used for DEBUG DIGEST */ +#include "crc64.h" #include #include @@ -667,7 +668,6 @@ void logCurrentClient(void) { } #if defined(HAVE_PROC_MAPS) -uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l); void memtest_non_destructive_invert(void *addr, size_t size); void memtest_non_destructive_swap(void *addr, size_t size); #define MEMTEST_MAX_REGIONS 128 diff --git a/src/mkreleasehdr.sh b/src/mkreleasehdr.sh index 30984160e..d07cf6ae0 100755 --- a/src/mkreleasehdr.sh +++ b/src/mkreleasehdr.sh @@ -1,9 +1,11 @@ #!/bin/sh GIT_SHA1=`(git show-ref --head --hash=8 2> /dev/null || echo 00000000) | head -n1` GIT_DIRTY=`git diff 2> /dev/null | wc -l` +BUILD_ID=`uname -n`"-"`date +%s` test -f release.h || touch release.h (cat release.h | grep SHA1 | grep $GIT_SHA1) && \ (cat release.h | grep DIRTY | grep $GIT_DIRTY) && exit 0 # Already uptodate echo "#define REDIS_GIT_SHA1 \"$GIT_SHA1\"" > release.h echo "#define REDIS_GIT_DIRTY \"$GIT_DIRTY\"" >> release.h +echo "#define REDIS_BUILD_ID \"$BUILD_ID\"" >> release.h touch release.c # Force recompile of release.c diff --git a/src/redis-check-dump.c b/src/redis-check-dump.c index 7efecb1a3..950655a02 100644 --- a/src/redis-check-dump.c +++ b/src/redis-check-dump.c @@ -40,6 +40,7 @@ #include #include #include "lzf.h" +#include "crc64.h" /* Object types */ #define REDIS_STRING 0 @@ -140,9 +141,6 @@ static double R_Zero, R_PosInf, R_NegInf, R_Nan; /* store string types for output */ static char types[256][16]; -/* Prototypes */ -uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l); - /* Return true if 't' is a valid object type. */ int checkType(unsigned char t) { /* In case a new object type is added, update the following diff --git a/src/redis.c b/src/redis.c index e3db30f75..4d1da27c9 100644 --- a/src/redis.c +++ b/src/redis.c @@ -1929,6 +1929,7 @@ sds genRedisInfoString(char *section) { "redis_version:%s\r\n" "redis_git_sha1:%s\r\n" "redis_git_dirty:%d\r\n" + "redis_build_id:%llx\r\n" "redis_mode:%s\r\n" "os:%s %s %s\r\n" "arch_bits:%d\r\n" @@ -1943,6 +1944,7 @@ sds genRedisInfoString(char *section) { REDIS_VERSION, redisGitSHA1(), strtol(redisGitDirty(),NULL,10) > 0, + redisBuildId(), mode, name.sysname, name.release, name.machine, server.arch_bits, @@ -2489,12 +2491,13 @@ void daemonize(void) { } void version() { - printf("Redis server v=%s sha=%s:%d malloc=%s bits=%d\n", + printf("Redis server v=%s sha=%s:%d malloc=%s bits=%d build=%llx\n", REDIS_VERSION, redisGitSHA1(), atoi(redisGitDirty()) > 0, ZMALLOC_LIB, - sizeof(long) == 4 ? 32 : 64); + sizeof(long) == 4 ? 32 : 64, + redisBuildId()); exit(0); } diff --git a/src/redis.h b/src/redis.h index b51a482fd..c091f653d 100644 --- a/src/redis.h +++ b/src/redis.h @@ -1192,6 +1192,7 @@ void scriptingInit(void); /* Git SHA1 */ char *redisGitSHA1(void); char *redisGitDirty(void); +uint64_t redisBuildId(void); /* Commands prototypes */ void authCommand(redisClient *c); diff --git a/src/release.c b/src/release.c index 46761448c..34c3d813c 100644 --- a/src/release.c +++ b/src/release.c @@ -31,7 +31,11 @@ * small file is recompiled, as we access this information in all the other * files using this functions. */ +#include + #include "release.h" +#include "version.h" +#include "crc64.h" char *redisGitSHA1(void) { return REDIS_GIT_SHA1; @@ -40,3 +44,9 @@ char *redisGitSHA1(void) { char *redisGitDirty(void) { return REDIS_GIT_DIRTY; } + +uint64_t redisBuildId(void) { + char *buildid = REDIS_VERSION REDIS_BUILD_ID REDIS_GIT_DIRTY REDIS_GIT_SHA1; + + return crc64(0,(unsigned char*)buildid,strlen(buildid)); +} diff --git a/src/rio.c b/src/rio.c index 45bb89896..d87d62fd7 100644 --- a/src/rio.c +++ b/src/rio.c @@ -50,8 +50,7 @@ #include #include "rio.h" #include "util.h" - -uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l); +#include "crc64.h" /* Returns 1 or 0 for success/failure. */ static size_t rioBufferWrite(rio *r, const void *buf, size_t len) {