From b509a14c3e8a76aadd6bd48296cafb4616be25e2 Mon Sep 17 00:00:00 2001 From: Oran Agra Date: Fri, 29 Dec 2017 12:43:48 +0200 Subject: [PATCH] Add config options for max-bulk-len and max-querybuf-len mainly to support RESTORE of large keys --- src/config.c | 12 ++++++++++++ src/networking.c | 2 +- src/server.c | 1 + src/server.h | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 24a590ca..ec0aa753 100644 --- a/src/config.c +++ b/src/config.c @@ -328,6 +328,10 @@ void loadServerConfigFromString(char *config) { err = "maxmemory-samples must be 1 or greater"; goto loaderr; } + } else if ((!strcasecmp(argv[0],"max-bulk-len")) && argc == 2) { + server.max_bulk_len = memtoll(argv[1],NULL); + } else if ((!strcasecmp(argv[0],"max-querybuf-len")) && argc == 2) { + server.client_max_querybuf_len = memtoll(argv[1],NULL); } else if (!strcasecmp(argv[0],"lfu-log-factor") && argc == 2) { server.lfu_log_factor = atoi(argv[1]); if (server.lfu_log_factor < 0) { @@ -1132,6 +1136,10 @@ void configSetCommand(client *c) { } freeMemoryIfNeeded(); } + } config_set_memory_field( + "max-bulk-len",server.max_bulk_len) { + } config_set_memory_field( + "max-querybuf-len",server.client_max_querybuf_len) { } config_set_memory_field("repl-backlog-size",ll) { resizeReplicationBacklog(ll); } config_set_memory_field("auto-aof-rewrite-min-size",ll) { @@ -1220,6 +1228,8 @@ void configGetCommand(client *c) { /* Numerical values */ config_get_numerical_field("maxmemory",server.maxmemory); + config_get_numerical_field("max-bulk-len",server.max_bulk_len); + config_get_numerical_field("max-querybuf-len",server.client_max_querybuf_len); config_get_numerical_field("maxmemory-samples",server.maxmemory_samples); config_get_numerical_field("lfu-log-factor",server.lfu_log_factor); config_get_numerical_field("lfu-decay-time",server.lfu_decay_time); @@ -1992,6 +2002,8 @@ int rewriteConfig(char *path) { rewriteConfigStringOption(state,"requirepass",server.requirepass,NULL); rewriteConfigNumericalOption(state,"maxclients",server.maxclients,CONFIG_DEFAULT_MAX_CLIENTS); rewriteConfigBytesOption(state,"maxmemory",server.maxmemory,CONFIG_DEFAULT_MAXMEMORY); + rewriteConfigBytesOption(state,"max-bulk-len",server.max_bulk_len,CONFIG_DEFAULT_MAX_BULK_LEN); + rewriteConfigBytesOption(state,"max-querybuf-len",server.client_max_querybuf_len,PROTO_MAX_QUERYBUF_LEN); rewriteConfigEnumOption(state,"maxmemory-policy",server.maxmemory_policy,maxmemory_policy_enum,CONFIG_DEFAULT_MAXMEMORY_POLICY); rewriteConfigNumericalOption(state,"maxmemory-samples",server.maxmemory_samples,CONFIG_DEFAULT_MAXMEMORY_SAMPLES); rewriteConfigNumericalOption(state,"lfu-log-factor",server.lfu_log_factor,CONFIG_DEFAULT_LFU_LOG_FACTOR); diff --git a/src/networking.c b/src/networking.c index 33ed6c79..03d32f99 100644 --- a/src/networking.c +++ b/src/networking.c @@ -1254,7 +1254,7 @@ int processMultibulkBuffer(client *c) { } ok = string2ll(c->querybuf+pos+1,newline-(c->querybuf+pos+1),&ll); - if (!ok || ll < 0 || ll > 512*1024*1024) { + if (!ok || ll < 0 || ll > server.max_bulk_len) { addReplyError(c,"Protocol error: invalid bulk length"); setProtocolError("invalid bulk length",c,pos); return C_ERR; diff --git a/src/server.c b/src/server.c index b8f43b3a..6dd0de63 100644 --- a/src/server.c +++ b/src/server.c @@ -1388,6 +1388,7 @@ void initServerConfig(void) { server.active_defrag_threshold_upper = CONFIG_DEFAULT_DEFRAG_THRESHOLD_UPPER; server.active_defrag_cycle_min = CONFIG_DEFAULT_DEFRAG_CYCLE_MIN; server.active_defrag_cycle_max = CONFIG_DEFAULT_DEFRAG_CYCLE_MAX; + server.max_bulk_len = CONFIG_DEFAULT_MAX_BULK_LEN; server.client_max_querybuf_len = PROTO_MAX_QUERYBUF_LEN; server.saveparams = NULL; server.loading = 0; diff --git a/src/server.h b/src/server.h index ee3b7df5..c571c522 100644 --- a/src/server.h +++ b/src/server.h @@ -161,6 +161,7 @@ typedef long long mstime_t; /* millisecond time type. */ #define CONFIG_DEFAULT_DEFRAG_IGNORE_BYTES (100<<20) /* don't defrag if frag overhead is below 100mb */ #define CONFIG_DEFAULT_DEFRAG_CYCLE_MIN 25 /* 25% CPU min (at lower threshold) */ #define CONFIG_DEFAULT_DEFRAG_CYCLE_MAX 75 /* 75% CPU max (at upper threshold) */ +#define CONFIG_DEFAULT_MAX_BULK_LEN (512ll*1024*1024) #define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20 /* Loopkups per loop. */ #define ACTIVE_EXPIRE_CYCLE_FAST_DURATION 1000 /* Microseconds */ @@ -1132,6 +1133,7 @@ struct redisServer { int maxmemory_samples; /* Pricision of random sampling */ int lfu_log_factor; /* LFU logarithmic counter factor. */ int lfu_decay_time; /* LFU counter decay factor. */ + long long max_bulk_len; /* Blocked clients */ unsigned int blocked_clients; /* # of clients executing a blocking cmd.*/ unsigned int blocked_clients_by_type[BLOCKED_NUM];