Now in redis.conf it is possible to specify units where appropriate instead of amounts of bytes, like 2Gi or 4M and so forth

This commit is contained in:
antirez 2010-04-22 12:05:51 +02:00
parent dc4be23ec8
commit 2b61932933

67
redis.c
View File

@ -379,7 +379,6 @@ struct redisServer {
char *dbfilename; char *dbfilename;
char *appendfilename; char *appendfilename;
char *requirepass; char *requirepass;
int shareobjects;
int rdbcompression; int rdbcompression;
int activerehashing; int activerehashing;
/* Replication related */ /* Replication related */
@ -970,6 +969,53 @@ static int stringmatch(const char *pattern, const char *string, int nocase) {
return stringmatchlen(pattern,strlen(pattern),string,strlen(string),nocase); return stringmatchlen(pattern,strlen(pattern),string,strlen(string),nocase);
} }
/* Convert a string representing an amount of memory into the number of
* bytes, so for instance memtoll("1Gi") will return 1073741824 that is
* (1024*1024*1024).
*
* On parsing error, if *err is not NULL, it's set to 1, otherwise it's
* set to 0 */
static long long memtoll(const char *p, int *err) {
const char *u;
char buf[128];
long mul; /* unit multiplier */
long long val;
unsigned int digits;
if (err) *err = 0;
/* Search the first non digit character. */
u = p;
if (*u == '-') u++;
while(*u && isdigit(*u)) u++;
if (*u == '\0' || !strcasecmp(u,"b")) {
mul = 1;
} else if (!strcasecmp(u,"k") || !strcasecmp(u,"kb")) {
mul = 1000;
} else if (!strcasecmp(u,"ki") || !strcasecmp(u,"kib")) {
mul = 1024;
} else if (!strcasecmp(u,"m") || !strcasecmp(u,"mb")) {
mul = 1000*1000;
} else if (!strcasecmp(u,"mi") || !strcasecmp(u,"mib")) {
mul = 1024*1024;
} else if (!strcasecmp(u,"g") || !strcasecmp(u,"hb")) {
mul = 1000L*1000*1000;
} else if (!strcasecmp(u,"gi") || !strcasecmp(u,"gib")) {
mul = 1024L*1024*1024;
} else {
if (err) *err = 1;
mul = 1;
}
digits = u-p;
if (digits >= sizeof(buf)) {
if (err) *err = 1;
return LLONG_MAX;
}
memcpy(buf,p,digits);
buf[digits] = '\0';
val = strtoll(buf,NULL,10);
return val*mul;
}
static void redisLog(int level, const char *fmt, ...) { static void redisLog(int level, const char *fmt, ...) {
va_list ap; va_list ap;
FILE *fp; FILE *fp;
@ -1585,7 +1631,6 @@ static void initServerConfig() {
server.dbfilename = zstrdup("dump.rdb"); server.dbfilename = zstrdup("dump.rdb");
server.appendfilename = zstrdup("appendonly.aof"); server.appendfilename = zstrdup("appendonly.aof");
server.requirepass = NULL; server.requirepass = NULL;
server.shareobjects = 0;
server.rdbcompression = 1; server.rdbcompression = 1;
server.activerehashing = 1; server.activerehashing = 1;
server.maxclients = 0; server.maxclients = 0;
@ -1802,7 +1847,7 @@ static void loadServerConfig(char *filename) {
} else if (!strcasecmp(argv[0],"maxclients") && argc == 2) { } else if (!strcasecmp(argv[0],"maxclients") && argc == 2) {
server.maxclients = atoi(argv[1]); server.maxclients = atoi(argv[1]);
} else if (!strcasecmp(argv[0],"maxmemory") && argc == 2) { } else if (!strcasecmp(argv[0],"maxmemory") && argc == 2) {
server.maxmemory = strtoll(argv[1], NULL, 10); server.maxmemory = memtoll(argv[1],NULL);
} else if (!strcasecmp(argv[0],"slaveof") && argc == 3) { } else if (!strcasecmp(argv[0],"slaveof") && argc == 3) {
server.masterhost = sdsnew(argv[1]); server.masterhost = sdsnew(argv[1]);
server.masterport = atoi(argv[2]); server.masterport = atoi(argv[2]);
@ -1813,10 +1858,6 @@ static void loadServerConfig(char *filename) {
if ((server.glueoutputbuf = yesnotoi(argv[1])) == -1) { if ((server.glueoutputbuf = yesnotoi(argv[1])) == -1) {
err = "argument must be 'yes' or 'no'"; goto loaderr; err = "argument must be 'yes' or 'no'"; goto loaderr;
} }
} else if (!strcasecmp(argv[0],"shareobjects") && argc == 2) {
if ((server.shareobjects = yesnotoi(argv[1])) == -1) {
err = "argument must be 'yes' or 'no'"; goto loaderr;
}
} else if (!strcasecmp(argv[0],"rdbcompression") && argc == 2) { } else if (!strcasecmp(argv[0],"rdbcompression") && argc == 2) {
if ((server.rdbcompression = yesnotoi(argv[1])) == -1) { if ((server.rdbcompression = yesnotoi(argv[1])) == -1) {
err = "argument must be 'yes' or 'no'"; goto loaderr; err = "argument must be 'yes' or 'no'"; goto loaderr;
@ -1860,19 +1901,17 @@ static void loadServerConfig(char *filename) {
zfree(server.vm_swap_file); zfree(server.vm_swap_file);
server.vm_swap_file = zstrdup(argv[1]); server.vm_swap_file = zstrdup(argv[1]);
} else if (!strcasecmp(argv[0],"vm-max-memory") && argc == 2) { } else if (!strcasecmp(argv[0],"vm-max-memory") && argc == 2) {
server.vm_max_memory = strtoll(argv[1], NULL, 10); server.vm_max_memory = memtoll(argv[1],NULL);
} else if (!strcasecmp(argv[0],"vm-page-size") && argc == 2) { } else if (!strcasecmp(argv[0],"vm-page-size") && argc == 2) {
server.vm_page_size = strtoll(argv[1], NULL, 10); server.vm_page_size = memtoll(argv[1], NULL);
} else if (!strcasecmp(argv[0],"vm-pages") && argc == 2) { } else if (!strcasecmp(argv[0],"vm-pages") && argc == 2) {
server.vm_pages = strtoll(argv[1], NULL, 10); server.vm_pages = memtoll(argv[1], NULL);
} else if (!strcasecmp(argv[0],"vm-max-threads") && argc == 2) { } else if (!strcasecmp(argv[0],"vm-max-threads") && argc == 2) {
server.vm_max_threads = strtoll(argv[1], NULL, 10); server.vm_max_threads = strtoll(argv[1], NULL, 10);
} else if (!strcasecmp(argv[0],"hash-max-zipmap-entries") && argc == 2){ } else if (!strcasecmp(argv[0],"hash-max-zipmap-entries") && argc == 2){
server.hash_max_zipmap_entries = strtol(argv[1], NULL, 10); server.hash_max_zipmap_entries = memtoll(argv[1], NULL);
} else if (!strcasecmp(argv[0],"hash-max-zipmap-value") && argc == 2){ } else if (!strcasecmp(argv[0],"hash-max-zipmap-value") && argc == 2){
server.hash_max_zipmap_value = strtol(argv[1], NULL, 10); server.hash_max_zipmap_value = memtoll(argv[1], NULL);
} else if (!strcasecmp(argv[0],"vm-max-threads") && argc == 2) {
server.vm_max_threads = strtoll(argv[1], NULL, 10);
} else { } else {
err = "Bad directive or wrong number of arguments"; goto loaderr; err = "Bad directive or wrong number of arguments"; goto loaderr;
} }