Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
803d765d
Commit
803d765d
authored
Jul 19, 2019
by
Madelyn Olson
Browse files
Refactored renaming types in config
parent
45025713
Changes
1
Show whitespace changes
Inline
Side-by-side
src/config.c
View file @
803d765d
...
...
@@ -107,46 +107,70 @@ clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_OBUF_COUNT] = {
/* Configuration values that require no special handling to set, get, load or
* rewrite. */
typedef
struct
configYesNo
{
typedef struct boolConfigData {
int *config; /* The pointer to the server config this value is stored in */
const int default_value; /* The default value of the config on rewrite */
} boolConfigData;
typedef struct stringConfigData {
char **config; /* The pointer to the server config this value is stored in */
const char *default_value; /* The default value of the config on rewrite */
} stringConfigData;
typedef struct enumConfigData {
int *config; /* The pointer to the server config this value is stored in */
configEnum *enum_value; /* The underlying enum type this data represents */
const int default_value; /* The default value of the config on rewrite */
} enumConfigData;
typedef enum numericType {
NUMERIC_TYPE_INT,
NUMERIC_TYPE_LONG_LONG,
NUMERIC_TYPE_UNSIGNED_LONG,
NUMERIC_TYPE_SIZE_T
} numericType;
typedef struct numericConfigData {
union {
int *i;
long long *ll;
unsigned long *ul;
size_t *st;
} config; /* The pointer to the numeric config this value is stored in */
int is_memory; /* Indicates if this value can be loaded as a memory value */
numericType numeric_type; /* An enum indicating the type of this value */
long long lower_bound; /* The lower bound of this numeric value */
long long upper_bound; /* The upper bound of this numeric value */
const long long default_value; /* The default value of the config on rewrite */
} numericConfigData;
typedef union typeData {
boolConfigData yesno;
stringConfigData string;
enumConfigData enumd;
numericConfigData numeric;
} typeData;
typedef struct typeInterface {
/* Called on server start, should return 1 on success, 0 on error and should set err */
int (*load)(typeData data, sds *argc, int argv, char **err);
/* Called on CONFIG SET, returns 1 on success, 0 on error */
int (*set)(typeData data, sds value);
/* Called on CONFIG GET, required to add output to the client */
void (*get)(client *c, typeData data);
/* Called on CONFIG REWRITE, required to rewrite the config state */
void (*rewrite)(typeData data, const char *name, struct rewriteConfigState *state);
} typeInterface;
typedef struct standardConfig {
const char *name; /* The user visible name of this config */
const char *alias; /* An alias that can also be used for this config */
int
*
config
;
/* The pointer to the server config this value is stored in */
const int modifiable; /* Can this value be updated by CONFIG SET? */
const
int
default_value
;
/* The default value of the config on rewrite */
}
configYesNo
;
configYesNo
configs_yesno
[]
=
{
/* Non-Modifiable */
{
"rdbchecksum"
,
NULL
,
&
server
.
rdb_checksum
,
0
,
CONFIG_DEFAULT_RDB_CHECKSUM
},
{
"daemonize"
,
NULL
,
&
server
.
daemonize
,
0
,
0
},
{
"io-threads-do-reads"
,
NULL
,
&
server
.
io_threads_do_reads
,
0
,
CONFIG_DEFAULT_IO_THREADS_DO_READS
},
{
"always-show-logo"
,
NULL
,
&
server
.
always_show_logo
,
0
,
CONFIG_DEFAULT_ALWAYS_SHOW_LOGO
},
/* Modifiable */
{
"protected-mode"
,
NULL
,
&
server
.
protected_mode
,
1
,
CONFIG_DEFAULT_PROTECTED_MODE
},
{
"rdbcompression"
,
NULL
,
&
server
.
rdb_compression
,
1
,
CONFIG_DEFAULT_RDB_COMPRESSION
},
{
"activerehashing"
,
NULL
,
&
server
.
activerehashing
,
1
,
CONFIG_DEFAULT_ACTIVE_REHASHING
},
{
"stop-writes-on-bgsave-error"
,
NULL
,
&
server
.
stop_writes_on_bgsave_err
,
1
,
CONFIG_DEFAULT_STOP_WRITES_ON_BGSAVE_ERROR
},
{
"dynamic-hz"
,
NULL
,
&
server
.
dynamic_hz
,
1
,
CONFIG_DEFAULT_DYNAMIC_HZ
},
{
"lazyfree-lazy-eviction"
,
NULL
,
&
server
.
lazyfree_lazy_eviction
,
1
,
CONFIG_DEFAULT_LAZYFREE_LAZY_EVICTION
},
{
"lazyfree-lazy-expire"
,
NULL
,
&
server
.
lazyfree_lazy_expire
,
1
,
CONFIG_DEFAULT_LAZYFREE_LAZY_EXPIRE
},
{
"lazyfree-lazy-server-del"
,
NULL
,
&
server
.
lazyfree_lazy_server_del
,
1
,
CONFIG_DEFAULT_LAZYFREE_LAZY_SERVER_DEL
},
{
"repl-disable-tcp-nodelay"
,
NULL
,
&
server
.
repl_disable_tcp_nodelay
,
1
,
CONFIG_DEFAULT_REPL_DISABLE_TCP_NODELAY
},
{
"repl-diskless-sync"
,
NULL
,
&
server
.
repl_diskless_sync
,
1
,
CONFIG_DEFAULT_REPL_DISKLESS_SYNC
},
{
"gopher-enabled"
,
NULL
,
&
server
.
gopher_enabled
,
1
,
CONFIG_DEFAULT_GOPHER_ENABLED
},
{
"aof-rewrite-incremental-fsync"
,
NULL
,
&
server
.
aof_rewrite_incremental_fsync
,
1
,
CONFIG_DEFAULT_AOF_REWRITE_INCREMENTAL_FSYNC
},
{
"no-appendfsync-on-rewrite"
,
NULL
,
&
server
.
aof_no_fsync_on_rewrite
,
1
,
CONFIG_DEFAULT_AOF_NO_FSYNC_ON_REWRITE
},
{
"cluster-require-full-coverage"
,
NULL
,
&
server
.
cluster_require_full_coverage
,
CLUSTER_DEFAULT_REQUIRE_FULL_COVERAGE
},
{
"rdb-save-incremental-fsync"
,
NULL
,
&
server
.
rdb_save_incremental_fsync
,
1
,
CONFIG_DEFAULT_RDB_SAVE_INCREMENTAL_FSYNC
},
{
"aof-load-truncated"
,
NULL
,
&
server
.
aof_load_truncated
,
1
,
CONFIG_DEFAULT_AOF_LOAD_TRUNCATED
},
{
"aof-use-rdb-preamble"
,
NULL
,
&
server
.
aof_use_rdb_preamble
,
1
,
CONFIG_DEFAULT_AOF_USE_RDB_PREAMBLE
},
{
"cluster-replica-no-failover"
,
"cluster-slave-no-failover"
,
&
server
.
cluster_slave_no_failover
,
1
,
CLUSTER_DEFAULT_SLAVE_NO_FAILOVER
},
{
"replica-lazy-flush"
,
"slave-lazy-flush"
,
&
server
.
repl_slave_lazy_flush
,
1
,
CONFIG_DEFAULT_SLAVE_LAZY_FLUSH
},
{
"replica-serve-stale-data"
,
"slave-serve-stale-data"
,
&
server
.
repl_serve_stale_data
,
1
,
CONFIG_DEFAULT_SLAVE_SERVE_STALE_DATA
},
{
"replica-read-only"
,
"slave-read-only"
,
&
server
.
repl_slave_ro
,
1
,
CONFIG_DEFAULT_SLAVE_READ_ONLY
},
{
"replica-ignore-maxmemory"
,
"slave-ignore-maxmemory"
,
&
server
.
repl_slave_ignore_maxmemory
,
1
,
CONFIG_DEFAULT_SLAVE_IGNORE_MAXMEMORY
},
{
"jemalloc-bg-thread"
,
NULL
,
&
server
.
jemalloc_bg_thread
,
1
,
1
},
{
NULL
,
NULL
,
0
,
0
}
};
typeInterface interface; /* The function points that define the type interface */
typeData data; /* The type specific data exposed used by the interface */
} standardConfig;
standardConfig configs[];
/*-----------------------------------------------------------------------------
* Enum access functions
...
...
@@ -220,7 +244,7 @@ void queueLoadModule(sds path, sds *argv, int argc) {
}
void loadServerConfigFromString(char *config) {
const
char
*
err
=
NULL
;
char *err = NULL;
int linenum = 0, totlines, i;
int slaveof_linenum = 0;
sds *lines;
...
...
@@ -253,14 +277,14 @@ void loadServerConfigFromString(char *config) {
/* Iterate the configs that are standard */
int match = 0;
for
(
configYesNo
*
config
=
configs
_yesno
;
config
->
name
!=
NULL
;
config
++
)
{
for (
standardConfig
*config = configs; config->name != NULL; config++) {
if ((!strcasecmp(argv[0],config->name) ||
(
config
->
alias
&&
!
strcasecmp
(
argv
[
0
],
config
->
alias
)))
&&
(
argc
==
2
))
(config->alias && !strcasecmp(argv[0],config->alias))))
{
if
(
(
*
(
config
->
config
)
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
if (
!
config->
interface.load(config->data, argv, argc, &err)
) {
goto loaderr;
}
match = 1;
break;
}
...
...
@@ -272,27 +296,7 @@ void loadServerConfigFromString(char *config) {
}
/* Execute config directives */
if
(
!
strcasecmp
(
argv
[
0
],
"timeout"
)
&&
argc
==
2
)
{
server
.
maxidletime
=
atoi
(
argv
[
1
]);
if
(
server
.
maxidletime
<
0
)
{
err
=
"Invalid timeout value"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"tcp-keepalive"
)
&&
argc
==
2
)
{
server
.
tcpkeepalive
=
atoi
(
argv
[
1
]);
if
(
server
.
tcpkeepalive
<
0
)
{
err
=
"Invalid tcp-keepalive value"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"port"
)
&&
argc
==
2
)
{
server
.
port
=
atoi
(
argv
[
1
]);
if
(
server
.
port
<
0
||
server
.
port
>
65535
)
{
err
=
"Invalid port"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"tcp-backlog"
)
&&
argc
==
2
)
{
server
.
tcp_backlog
=
atoi
(
argv
[
1
]);
if
(
server
.
tcp_backlog
<
0
)
{
err
=
"Invalid backlog value"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"bind"
)
&&
argc
>=
2
)
{
if (!strcasecmp(argv[0],"bind") && argc >= 2) {
int j, addresses = argc-1;
if (addresses > CONFIG_BINDADDR_MAX) {
...
...
@@ -301,8 +305,6 @@ void loadServerConfigFromString(char *config) {
for (j = 0; j < addresses; j++)
server.bindaddr[j] = zstrdup(argv[j+1]);
server.bindaddr_count = addresses;
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"unixsocket"
)
&&
argc
==
2
)
{
server
.
unixsocket
=
zstrdup
(
argv
[
1
]);
} else if (!strcasecmp(argv[0],"unixsocketperm") && argc == 2) {
errno = 0;
server.unixsocketperm = (mode_t)strtol(argv[1], NULL, 8);
...
...
@@ -326,13 +328,6 @@ void loadServerConfigFromString(char *config) {
argv[1], strerror(errno));
exit(1);
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"loglevel"
)
&&
argc
==
2
)
{
server
.
verbosity
=
configEnumGetValue
(
loglevel_enum
,
argv
[
1
]);
if
(
server
.
verbosity
==
INT_MIN
)
{
err
=
"Invalid log level. "
"Must be one of debug, verbose, notice, warning"
;
goto
loaderr
;
}
} else if (!strcasecmp(argv[0],"logfile") && argc == 2) {
FILE *logfp;
...
...
@@ -349,9 +344,6 @@ void loadServerConfigFromString(char *config) {
}
fclose(logfp);
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"aclfile"
)
&&
argc
==
2
)
{
zfree
(
server
.
acl_filename
);
server
.
acl_filename
=
zstrdup
(
argv
[
1
]);
} else if (!strcasecmp(argv[0],"syslog-enabled") && argc == 2) {
if ((server.syslog_enabled = yesnotoi(argv[1])) == -1) {
err = "argument must be 'yes' or 'no'"; goto loaderr;
...
...
@@ -359,23 +351,6 @@ void loadServerConfigFromString(char *config) {
} else if (!strcasecmp(argv[0],"syslog-ident") && argc == 2) {
if (server.syslog_ident) zfree(server.syslog_ident);
server.syslog_ident = zstrdup(argv[1]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"syslog-facility"
)
&&
argc
==
2
)
{
server
.
syslog_facility
=
configEnumGetValue
(
syslog_facility_enum
,
argv
[
1
]);
if
(
server
.
syslog_facility
==
INT_MIN
)
{
err
=
"Invalid log facility. Must be one of USER or between LOCAL0-LOCAL7"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"databases"
)
&&
argc
==
2
)
{
server
.
dbnum
=
atoi
(
argv
[
1
]);
if
(
server
.
dbnum
<
1
)
{
err
=
"Invalid number of databases"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"io-threads"
)
&&
argc
==
2
)
{
server
.
io_threads_num
=
atoi
(
argv
[
1
]);
if
(
server
.
io_threads_num
<
1
||
server
.
io_threads_num
>
512
)
{
err
=
"Invalid number of I/O threads"
;
goto
loaderr
;
}
} else if (!strcasecmp(argv[0],"include") && argc == 2) {
loadServerConfig(argv[1],NULL);
} else if (!strcasecmp(argv[0],"maxclients") && argc == 2) {
...
...
@@ -385,68 +360,14 @@ void loadServerConfigFromString(char *config) {
}
} else if (!strcasecmp(argv[0],"maxmemory") && argc == 2) {
server.maxmemory = memtoll(argv[1],NULL);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"maxmemory-policy"
)
&&
argc
==
2
)
{
server
.
maxmemory_policy
=
configEnumGetValue
(
maxmemory_policy_enum
,
argv
[
1
]);
if
(
server
.
maxmemory_policy
==
INT_MIN
)
{
err
=
"Invalid maxmemory policy"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"maxmemory-samples"
)
&&
argc
==
2
)
{
server
.
maxmemory_samples
=
atoi
(
argv
[
1
]);
if
(
server
.
maxmemory_samples
<=
0
)
{
err
=
"maxmemory-samples must be 1 or greater"
;
goto
loaderr
;
}
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"proto-max-bulk-len"
))
&&
argc
==
2
)
{
server
.
proto_max_bulk_len
=
memtoll
(
argv
[
1
],
NULL
);
} else if ((!strcasecmp(argv[0],"client-query-buffer-limit")) && 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
)
{
err
=
"lfu-log-factor must be 0 or greater"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"lfu-decay-time"
)
&&
argc
==
2
)
{
server
.
lfu_decay_time
=
atoi
(
argv
[
1
]);
if
(
server
.
lfu_decay_time
<
0
)
{
err
=
"lfu-decay-time must be 0 or greater"
;
goto
loaderr
;
}
} else if ((!strcasecmp(argv[0],"slaveof") ||
!strcasecmp(argv[0],"replicaof")) && argc == 3) {
slaveof_linenum = linenum;
server.masterhost = sdsnew(argv[1]);
server.masterport = atoi(argv[2]);
server.repl_state = REPL_STATE_CONNECT;
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"repl-ping-slave-period"
)
||
!
strcasecmp
(
argv
[
0
],
"repl-ping-replica-period"
))
&&
argc
==
2
)
{
server
.
repl_ping_slave_period
=
atoi
(
argv
[
1
]);
if
(
server
.
repl_ping_slave_period
<=
0
)
{
err
=
"repl-ping-replica-period must be 1 or greater"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"repl-timeout"
)
&&
argc
==
2
)
{
server
.
repl_timeout
=
atoi
(
argv
[
1
]);
if
(
server
.
repl_timeout
<=
0
)
{
err
=
"repl-timeout must be 1 or greater"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"repl-diskless-load"
)
&&
argc
==
2
)
{
server
.
repl_diskless_load
=
configEnumGetValue
(
repl_diskless_load_enum
,
argv
[
1
]);
if
(
server
.
repl_diskless_load
==
INT_MIN
)
{
err
=
"argument must be 'disabled', 'on-empty-db', 'swapdb' or 'flushdb'"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"repl-diskless-sync-delay"
)
&&
argc
==
2
)
{
server
.
repl_diskless_sync_delay
=
atoi
(
argv
[
1
]);
if
(
server
.
repl_diskless_sync_delay
<
0
)
{
err
=
"repl-diskless-sync-delay can't be negative"
;
goto
loaderr
;
}
} else if (!strcasecmp(argv[0],"repl-backlog-size") && argc == 2) {
long long size = memtoll(argv[1],NULL);
if (size <= 0) {
...
...
@@ -460,12 +381,6 @@ void loadServerConfigFromString(char *config) {
err = "repl-backlog-ttl can't be negative ";
goto loaderr;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"masteruser"
)
&&
argc
==
2
)
{
zfree
(
server
.
masteruser
);
server
.
masteruser
=
argv
[
1
][
0
]
?
zstrdup
(
argv
[
1
])
:
NULL
;
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"masterauth"
)
&&
argc
==
2
)
{
zfree
(
server
.
masterauth
);
server
.
masterauth
=
argv
[
1
][
0
]
?
zstrdup
(
argv
[
1
])
:
NULL
;
} else if (!strcasecmp(argv[0],"activedefrag") && argc == 2) {
if ((server.active_defrag_enabled = yesnotoi(argv[1])) == -1) {
err = "argument must be 'yes' or 'no'"; goto loaderr;
...
...
@@ -491,36 +406,6 @@ void loadServerConfigFromString(char *config) {
}
zfree(server.aof_filename);
server.aof_filename = zstrdup(argv[1]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"appendfsync"
)
&&
argc
==
2
)
{
server
.
aof_fsync
=
configEnumGetValue
(
aof_fsync_enum
,
argv
[
1
]);
if
(
server
.
aof_fsync
==
INT_MIN
)
{
err
=
"argument must be 'no', 'always' or 'everysec'"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"auto-aof-rewrite-percentage"
)
&&
argc
==
2
)
{
server
.
aof_rewrite_perc
=
atoi
(
argv
[
1
]);
if
(
server
.
aof_rewrite_perc
<
0
)
{
err
=
"Invalid negative percentage for AOF auto rewrite"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"auto-aof-rewrite-min-size"
)
&&
argc
==
2
)
{
server
.
aof_rewrite_min_size
=
memtoll
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"rdb-key-save-delay"
)
&&
argc
==
2
)
{
server
.
rdb_key_save_delay
=
atoi
(
argv
[
1
]);
if
(
server
.
rdb_key_save_delay
<
0
)
{
err
=
"rdb-key-save-delay can't be negative"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"key-load-delay"
)
&&
argc
==
2
)
{
server
.
key_load_delay
=
atoi
(
argv
[
1
]);
if
(
server
.
key_load_delay
<
0
)
{
err
=
"key-load-delay can't be negative"
;
goto
loaderr
;
}
} else if (!strcasecmp(argv[0],"requirepass") && argc == 2) {
if (strlen(argv[1]) > CONFIG_AUTHPASS_MAX_LEN) {
err = "Password is longer than CONFIG_AUTHPASS_MAX_LEN";
...
...
@@ -532,9 +417,6 @@ void loadServerConfigFromString(char *config) {
sds aclop = sdscatprintf(sdsempty(),">%s",argv[1]);
ACLSetUser(DefaultUser,aclop,sdslen(aclop));
sdsfree(aclop);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"pidfile"
)
&&
argc
==
2
)
{
zfree
(
server
.
pidfile
);
server
.
pidfile
=
zstrdup
(
argv
[
1
]);
} else if (!strcasecmp(argv[0],"dbfilename") && argc == 2) {
if (!pathIsBaseName(argv[1])) {
err = "dbfilename can't be a path, just a filename";
...
...
@@ -542,76 +424,10 @@ void loadServerConfigFromString(char *config) {
}
zfree(server.rdb_filename);
server.rdb_filename = zstrdup(argv[1]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"active-defrag-threshold-lower"
)
&&
argc
==
2
)
{
server
.
active_defrag_threshold_lower
=
atoi
(
argv
[
1
]);
if
(
server
.
active_defrag_threshold_lower
<
0
||
server
.
active_defrag_threshold_lower
>
1000
)
{
err
=
"active-defrag-threshold-lower must be between 0 and 1000"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"active-defrag-threshold-upper"
)
&&
argc
==
2
)
{
server
.
active_defrag_threshold_upper
=
atoi
(
argv
[
1
]);
if
(
server
.
active_defrag_threshold_upper
<
0
||
server
.
active_defrag_threshold_upper
>
1000
)
{
err
=
"active-defrag-threshold-upper must be between 0 and 1000"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"active-defrag-ignore-bytes"
)
&&
argc
==
2
)
{
server
.
active_defrag_ignore_bytes
=
memtoll
(
argv
[
1
],
NULL
);
if
(
server
.
active_defrag_ignore_bytes
<=
0
)
{
err
=
"active-defrag-ignore-bytes must above 0"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"active-defrag-cycle-min"
)
&&
argc
==
2
)
{
server
.
active_defrag_cycle_min
=
atoi
(
argv
[
1
]);
if
(
server
.
active_defrag_cycle_min
<
1
||
server
.
active_defrag_cycle_min
>
99
)
{
err
=
"active-defrag-cycle-min must be between 1 and 99"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"active-defrag-cycle-max"
)
&&
argc
==
2
)
{
server
.
active_defrag_cycle_max
=
atoi
(
argv
[
1
]);
if
(
server
.
active_defrag_cycle_max
<
1
||
server
.
active_defrag_cycle_max
>
99
)
{
err
=
"active-defrag-cycle-max must be between 1 and 99"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"active-defrag-max-scan-fields"
)
&&
argc
==
2
)
{
server
.
active_defrag_max_scan_fields
=
strtoll
(
argv
[
1
],
NULL
,
10
);
if
(
server
.
active_defrag_max_scan_fields
<
1
)
{
err
=
"active-defrag-max-scan-fields must be positive"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"active-expire-effort"
)
&&
argc
==
2
)
{
server
.
active_expire_effort
=
atoi
(
argv
[
1
]);
if
(
server
.
active_expire_effort
<
1
||
server
.
active_expire_effort
>
10
)
{
err
=
"active-expire-effort must be between 1 and 10"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"hash-max-ziplist-entries"
)
&&
argc
==
2
)
{
server
.
hash_max_ziplist_entries
=
memtoll
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"hash-max-ziplist-value"
)
&&
argc
==
2
)
{
server
.
hash_max_ziplist_value
=
memtoll
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"stream-node-max-bytes"
)
&&
argc
==
2
)
{
server
.
stream_node_max_bytes
=
memtoll
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"stream-node-max-entries"
)
&&
argc
==
2
)
{
server
.
stream_node_max_entries
=
atoi
(
argv
[
1
]);
} else if (!strcasecmp(argv[0],"list-max-ziplist-entries") && argc == 2){
/* DEAD OPTION */
} else if (!strcasecmp(argv[0],"list-max-ziplist-value") && argc == 2) {
/* DEAD OPTION */
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"list-max-ziplist-size"
)
&&
argc
==
2
)
{
server
.
list_max_ziplist_size
=
atoi
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"list-compress-depth"
)
&&
argc
==
2
)
{
server
.
list_compress_depth
=
atoi
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"set-max-intset-entries"
)
&&
argc
==
2
)
{
server
.
set_max_intset_entries
=
memtoll
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"zset-max-ziplist-entries"
)
&&
argc
==
2
)
{
server
.
zset_max_ziplist_entries
=
memtoll
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"zset-max-ziplist-value"
)
&&
argc
==
2
)
{
server
.
zset_max_ziplist_value
=
memtoll
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"hll-sparse-max-bytes"
)
&&
argc
==
2
)
{
server
.
hll_sparse_max_bytes
=
memtoll
(
argv
[
1
],
NULL
);
} else if (!strcasecmp(argv[0],"rename-command") && argc == 3) {
struct redisCommand *cmd = lookupCommand(argv[1]);
int retval;
...
...
@@ -643,80 +459,6 @@ void loadServerConfigFromString(char *config) {
} else if (!strcasecmp(argv[0],"cluster-config-file") && argc == 2) {
zfree(server.cluster_configfile);
server.cluster_configfile = zstrdup(argv[1]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"cluster-announce-ip"
)
&&
argc
==
2
)
{
zfree
(
server
.
cluster_announce_ip
);
server
.
cluster_announce_ip
=
zstrdup
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"cluster-announce-port"
)
&&
argc
==
2
)
{
server
.
cluster_announce_port
=
atoi
(
argv
[
1
]);
if
(
server
.
cluster_announce_port
<
0
||
server
.
cluster_announce_port
>
65535
)
{
err
=
"Invalid port"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"cluster-announce-bus-port"
)
&&
argc
==
2
)
{
server
.
cluster_announce_bus_port
=
atoi
(
argv
[
1
]);
if
(
server
.
cluster_announce_bus_port
<
0
||
server
.
cluster_announce_bus_port
>
65535
)
{
err
=
"Invalid port"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"cluster-node-timeout"
)
&&
argc
==
2
)
{
server
.
cluster_node_timeout
=
strtoll
(
argv
[
1
],
NULL
,
10
);
if
(
server
.
cluster_node_timeout
<=
0
)
{
err
=
"cluster node timeout must be 1 or greater"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"cluster-migration-barrier"
)
&&
argc
==
2
)
{
server
.
cluster_migration_barrier
=
atoi
(
argv
[
1
]);
if
(
server
.
cluster_migration_barrier
<
0
)
{
err
=
"cluster migration barrier must zero or positive"
;
goto
loaderr
;
}
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"cluster-slave-validity-factor"
)
||
!
strcasecmp
(
argv
[
0
],
"cluster-replica-validity-factor"
))
&&
argc
==
2
)
{
server
.
cluster_slave_validity_factor
=
atoi
(
argv
[
1
]);
if
(
server
.
cluster_slave_validity_factor
<
0
)
{
err
=
"cluster replica validity factor must be zero or positive"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"lua-time-limit"
)
&&
argc
==
2
)
{
server
.
lua_time_limit
=
strtoll
(
argv
[
1
],
NULL
,
10
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"lua-replicate-commands"
)
&&
argc
==
2
)
{
server
.
lua_always_replicate_commands
=
yesnotoi
(
argv
[
1
]);
if
(
server
.
lua_always_replicate_commands
==
-
1
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slowlog-log-slower-than"
)
&&
argc
==
2
)
{
server
.
slowlog_log_slower_than
=
strtoll
(
argv
[
1
],
NULL
,
10
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"latency-monitor-threshold"
)
&&
argc
==
2
)
{
server
.
latency_monitor_threshold
=
strtoll
(
argv
[
1
],
NULL
,
10
);
if
(
server
.
latency_monitor_threshold
<
0
)
{
err
=
"The latency threshold can't be negative"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slowlog-max-len"
)
&&
argc
==
2
)
{
server
.
slowlog_max_len
=
strtoll
(
argv
[
1
],
NULL
,
10
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"tracking-table-max-fill"
)
&&
argc
==
2
)
{
server
.
tracking_table_max_fill
=
strtoll
(
argv
[
1
],
NULL
,
10
);
if
(
server
.
tracking_table_max_fill
>
100
||
server
.
tracking_table_max_fill
<
0
)
{
err
=
"The tracking table fill percentage must be an "
"integer between 0 and 100"
;
goto
loaderr
;
}
} else if (!strcasecmp(argv[0],"client-output-buffer-limit") &&
argc == 5)
{
...
...
@@ -739,24 +481,6 @@ void loadServerConfigFromString(char *config) {
server.client_obuf_limits[class].hard_limit_bytes = hard;
server.client_obuf_limits[class].soft_limit_bytes = soft;
server.client_obuf_limits[class].soft_limit_seconds = soft_seconds;
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"slave-priority"
)
||
!
strcasecmp
(
argv
[
0
],
"replica-priority"
))
&&
argc
==
2
)
{
server
.
slave_priority
=
atoi
(
argv
[
1
]);
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"slave-announce-ip"
)
||
!
strcasecmp
(
argv
[
0
],
"replica-announce-ip"
))
&&
argc
==
2
)
{
zfree
(
server
.
slave_announce_ip
);
server
.
slave_announce_ip
=
zstrdup
(
argv
[
1
]);
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"slave-announce-port"
)
||
!
strcasecmp
(
argv
[
0
],
"replica-announce-port"
))
&&
argc
==
2
)
{
server
.
slave_announce_port
=
atoi
(
argv
[
1
]);
if
(
server
.
slave_announce_port
<
0
||
server
.
slave_announce_port
>
65535
)
{
err
=
"Invalid port"
;
goto
loaderr
;
}
} else if ((!strcasecmp(argv[0],"min-slaves-to-write") ||
!strcasecmp(argv[0],"min-replicas-to-write")) && argc == 2)
{
...
...
@@ -779,15 +503,6 @@ void loadServerConfigFromString(char *config) {
goto loaderr;
}
server.notify_keyspace_events = flags;
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"supervised"
)
&&
argc
==
2
)
{
server
.
supervised_mode
=
configEnumGetValue
(
supervised_mode_enum
,
argv
[
1
]);
if
(
server
.
supervised_mode
==
INT_MIN
)
{
err
=
"Invalid option for 'supervised'. "
"Allowed values: 'upstart', 'systemd', 'auto', or 'no'"
;
goto
loaderr
;
}
} else if (!strcasecmp(argv[0],"user") && argc >= 2) {
int argc_err;
if (ACLAppendUserForLoading(argv,argc,&argc_err) == C_ERR) {
...
...
@@ -935,17 +650,11 @@ void loadServerConfig(char *filename, char *options) {
if (err || ll < 0) goto badfmt; \
_var = ll;
#define config_set_enum_field(_name,_var,_enumvar) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \
int enumval = configEnumGetValue(_enumvar,o->ptr); \
if (enumval == INT_MIN) goto badfmt; \
_var = enumval;
#define config_set_special_field(_name) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) {
#define config_set_special_field_with_alias(_name
1
,_name2) \
} else if (!strcasecmp(c->argv[2]->ptr,_name
1
) || \
#define config_set_special_field_with_alias(_name,_name2) \
} else if (!strcasecmp(c->argv[2]->ptr,_name) || \
!strcasecmp(c->argv[2]->ptr,_name2)) {
#define config_set_else } else
...
...
@@ -959,13 +668,13 @@ void configSetCommand(client *c) {
o = c->argv[3];
/* Iterate the configs that are standard */
for
(
configYesNo
*
config
=
configs
_yesno
;
config
->
name
!=
NULL
;
config
++
)
{
for (
standardConfig
*config = configs; config->name != NULL; config++) {
if(config->modifiable && (!strcasecmp(c->argv[2]->ptr,config->name) ||
(config->alias && !strcasecmp(c->argv[2]->ptr,config->alias))))
{
i
nt
yn
=
yesnotoi
(
o
->
ptr
)
;
if
(
yn
==
-
1
)
goto
badfmt
;
*
(
config
->
config
)
=
yn
;
i
f (!config->interface.set(config->data,
o->ptr)
) {
goto badfmt;
}
addReply(c,shared.ok);
return;
}
...
...
@@ -989,15 +698,6 @@ void configSetCommand(client *c) {
sds aclop = sdscatprintf(sdsempty(),">%s",(char*)o->ptr);
ACLSetUser(DefaultUser,aclop,sdslen(aclop));
sdsfree(aclop);
}
config_set_special_field
(
"masteruser"
)
{
zfree
(
server
.
masteruser
);
server
.
masteruser
=
((
char
*
)
o
->
ptr
)[
0
]
?
zstrdup
(
o
->
ptr
)
:
NULL
;
}
config_set_special_field
(
"masterauth"
)
{
zfree
(
server
.
masterauth
);
server
.
masterauth
=
((
char
*
)
o
->
ptr
)[
0
]
?
zstrdup
(
o
->
ptr
)
:
NULL
;
}
config_set_special_field
(
"cluster-announce-ip"
)
{
zfree
(
server
.
cluster_announce_ip
);
server
.
cluster_announce_ip
=
((
char
*
)
o
->
ptr
)[
0
]
?
zstrdup
(
o
->
ptr
)
:
NULL
;
} config_set_special_field("maxclients") {
int orig_value = server.maxclients;
...
...
@@ -1128,12 +828,6 @@ void configSetCommand(client *c) {
if (flags == -1) goto badfmt;
server.notify_keyspace_events = flags;
}
config_set_special_field_with_alias
(
"slave-announce-ip"
,
"replica-announce-ip"
)
{
zfree
(
server
.
slave_announce_ip
);
server
.
slave_announce_ip
=
((
char
*
)
o
->
ptr
)[
0
]
?
zstrdup
(
o
->
ptr
)
:
NULL
;
/* Boolean fields.
* config_set_bool_field(name,var). */
} config_set_bool_field(
...
...
@@ -1151,86 +845,8 @@ void configSetCommand(client *c) {
#endif
/* Numerical fields.
* config_set_numerical_field(name,var,min,max) */
}
config_set_numerical_field
(
"tcp-keepalive"
,
server
.
tcpkeepalive
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"maxmemory-samples"
,
server
.
maxmemory_samples
,
1
,
INT_MAX
)
{
}
config_set_numerical_field
(
"lfu-log-factor"
,
server
.
lfu_log_factor
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"lfu-decay-time"
,
server
.
lfu_decay_time
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"timeout"
,
server
.
maxidletime
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"active-defrag-threshold-lower"
,
server
.
active_defrag_threshold_lower
,
0
,
1000
)
{
}
config_set_numerical_field
(
"active-defrag-threshold-upper"
,
server
.
active_defrag_threshold_upper
,
0
,
1000
)
{
}
config_set_memory_field
(
"active-defrag-ignore-bytes"
,
server
.
active_defrag_ignore_bytes
)
{
}
config_set_numerical_field
(
"active-defrag-cycle-min"
,
server
.
active_defrag_cycle_min
,
1
,
99
)
{
}
config_set_numerical_field
(
"active-defrag-cycle-max"
,
server
.
active_defrag_cycle_max
,
1
,
99
)
{
}
config_set_numerical_field
(
"active-defrag-max-scan-fields"
,
server
.
active_defrag_max_scan_fields
,
1
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"active-expire-effort"
,
server
.
active_expire_effort
,
1
,
10
)
{
}
config_set_numerical_field
(
"auto-aof-rewrite-percentage"
,
server
.
aof_rewrite_perc
,
0
,
INT_MAX
){
}
config_set_numerical_field
(
"hash-max-ziplist-entries"
,
server
.
hash_max_ziplist_entries
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"hash-max-ziplist-value"
,
server
.
hash_max_ziplist_value
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"stream-node-max-bytes"
,
server
.
stream_node_max_bytes
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"stream-node-max-entries"
,
server
.
stream_node_max_entries
,
0
,
LLONG_MAX
)
{
}
config_set_numerical_field
(
"list-max-ziplist-size"
,
server
.
list_max_ziplist_size
,
INT_MIN
,
INT_MAX
)
{
}
config_set_numerical_field
(
"list-compress-depth"
,
server
.
list_compress_depth
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"set-max-intset-entries"
,
server
.
set_max_intset_entries
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"zset-max-ziplist-entries"
,
server
.
zset_max_ziplist_entries
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"zset-max-ziplist-value"
,
server
.
zset_max_ziplist_value
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"hll-sparse-max-bytes"
,
server
.
hll_sparse_max_bytes
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"lua-time-limit"
,
server
.
lua_time_limit
,
0
,
LONG_MAX
)
{
}
config_set_numerical_field
(
"slowlog-log-slower-than"
,
server
.
slowlog_log_slower_than
,
-
1
,
LLONG_MAX
)
{
}
config_set_numerical_field
(
"slowlog-max-len"
,
ll
,
0
,
LONG_MAX
)
{
/* Cast to unsigned. */
server
.
slowlog_max_len
=
(
unsigned
long
)
ll
;
}
config_set_numerical_field
(
"tracking-table-max-fill"
,
server
.
tracking_table_max_fill
,
0
,
100
)
{
}
config_set_numerical_field
(
"latency-monitor-threshold"
,
server
.
latency_monitor_threshold
,
0
,
LLONG_MAX
){
}
config_set_numerical_field
(
"repl-ping-slave-period"
,
server
.
repl_ping_slave_period
,
1
,
INT_MAX
)
{
}
config_set_numerical_field
(
"repl-ping-replica-period"
,
server
.
repl_ping_slave_period
,
1
,
INT_MAX
)
{
}
config_set_numerical_field
(
"repl-timeout"
,
server
.
repl_timeout
,
1
,
INT_MAX
)
{
} config_set_numerical_field(
"repl-backlog-ttl",server.repl_backlog_time_limit,0,LONG_MAX) {
}
config_set_numerical_field
(
"repl-diskless-sync-delay"
,
server
.
repl_diskless_sync_delay
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"slave-priority"
,
server
.
slave_priority
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"replica-priority"
,
server
.
slave_priority
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"rdb-key-save-delay"
,
server
.
rdb_key_save_delay
,
0
,
LLONG_MAX
)
{
}
config_set_numerical_field
(
"key-load-delay"
,
server
.
key_load_delay
,
0
,
LLONG_MAX
)
{
}
config_set_numerical_field
(
"slave-announce-port"
,
server
.
slave_announce_port
,
0
,
65535
)
{
}
config_set_numerical_field
(
"replica-announce-port"
,
server
.
slave_announce_port
,
0
,
65535
)
{
} config_set_numerical_field(
"min-slaves-to-write",server.repl_min_slaves_to_write,0,INT_MAX) {
refreshGoodSlavesCount();
...
...
@@ -1243,18 +859,6 @@ void configSetCommand(client *c) {
} config_set_numerical_field(
"min-replicas-max-lag",server.repl_min_slaves_max_lag,0,INT_MAX) {
refreshGoodSlavesCount();
}
config_set_numerical_field
(
"cluster-node-timeout"
,
server
.
cluster_node_timeout
,
0
,
LLONG_MAX
)
{
}
config_set_numerical_field
(
"cluster-announce-port"
,
server
.
cluster_announce_port
,
0
,
65535
)
{
}
config_set_numerical_field
(
"cluster-announce-bus-port"
,
server
.
cluster_announce_bus_port
,
0
,
65535
)
{
}
config_set_numerical_field
(
"cluster-migration-barrier"
,
server
.
cluster_migration_barrier
,
0
,
INT_MAX
){
}
config_set_numerical_field
(
"cluster-slave-validity-factor"
,
server
.
cluster_slave_validity_factor
,
0
,
INT_MAX
)
{
}
config_set_numerical_field
(
"cluster-replica-validity-factor"
,
server
.
cluster_slave_validity_factor
,
0
,
INT_MAX
)
{
} config_set_numerical_field(
"hz",server.config_hz,0,INT_MAX) {
/* Hz is more an hint from the user, so we accept values out of range
...
...
@@ -1267,7 +871,6 @@ void configSetCommand(client *c) {
enableWatchdog(ll);
else
disableWatchdog();
/* Memory fields.
* config_set_memory_field(name,var) */
} config_set_memory_field("maxmemory",server.maxmemory) {
...
...
@@ -1277,25 +880,10 @@ void configSetCommand(client *c) {
}
freeMemoryIfNeededAndSafe();
}
}
config_set_memory_field
(
"proto-max-bulk-len"
,
server
.
proto_max_bulk_len
)
{
} config_set_memory_field(
"client-query-buffer-limit",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
)
{
server
.
aof_rewrite_min_size
=
ll
;
/* Enumeration fields.
* config_set_enum_field(name,var,enum_var) */
}
config_set_enum_field
(
"loglevel"
,
server
.
verbosity
,
loglevel_enum
)
{
}
config_set_enum_field
(
"maxmemory-policy"
,
server
.
maxmemory_policy
,
maxmemory_policy_enum
)
{
}
config_set_enum_field
(
"appendfsync"
,
server
.
aof_fsync
,
aof_fsync_enum
)
{
}
config_set_enum_field
(
"repl-diskless-load"
,
server
.
repl_diskless_load
,
repl_diskless_load_enum
)
{
#ifdef USE_OPENSSL
/* TLS fields. */
} config_set_special_field("tls-cert-file") {
...
...
@@ -1436,13 +1024,6 @@ badfmt: /* Bad format errors */
} \
} while(0);
#define config_get_enum_field(_name,_var,_enumvar) do { \
if (stringmatch(pattern,_name,1)) { \
addReplyBulkCString(c,_name); \
addReplyBulkCString(c,configEnumGetNameOrUnknown(_enumvar,_var)); \
matches++; \
} \
} while(0);
void configGetCommand(client *c) {
robj *o = c->argv[2];
...
...
@@ -1452,17 +1033,23 @@ void configGetCommand(client *c) {
int matches = 0;
serverAssertWithInfo(c,o,sdsEncodedObject(o));
/* Iterate the configs that are standard */
for (standardConfig *config = configs; config->name != NULL; config++) {
if (stringmatch(pattern,config->name,1)) {
addReplyBulkCString(c,config->name);
config->interface.get(c,config->data);
matches++;
}
if (config->alias && stringmatch(pattern,config->alias,1)) {
addReplyBulkCString(c,config->alias);
config->interface.get(c,config->data);
matches++;
}
}
/* String values */
config_get_string_field("dbfilename",server.rdb_filename);
config_get_string_field
(
"masteruser"
,
server
.
masteruser
);
config_get_string_field
(
"masterauth"
,
server
.
masterauth
);
config_get_string_field
(
"cluster-announce-ip"
,
server
.
cluster_announce_ip
);
config_get_string_field
(
"unixsocket"
,
server
.
unixsocket
);
config_get_string_field("logfile",server.logfile);
config_get_string_field
(
"aclfile"
,
server
.
acl_filename
);
config_get_string_field
(
"pidfile"
,
server
.
pidfile
);
config_get_string_field
(
"slave-announce-ip"
,
server
.
slave_announce_ip
);
config_get_string_field
(
"replica-announce-ip"
,
server
.
slave_announce_ip
);
#ifdef USE_OPENSSL
config_get_string_field("tls-cert-file",server.tls_ctx_config.cert_file);
config_get_string_field("tls-key-file",server.tls_ctx_config.key_file);
...
...
@@ -1476,110 +1063,25 @@ void configGetCommand(client *c) {
/* Numerical values */
config_get_numerical_field("maxmemory",server.maxmemory);
config_get_numerical_field
(
"proto-max-bulk-len"
,
server
.
proto_max_bulk_len
);
config_get_numerical_field("client-query-buffer-limit",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
);
config_get_numerical_field
(
"timeout"
,
server
.
maxidletime
);
config_get_numerical_field
(
"active-defrag-threshold-lower"
,
server
.
active_defrag_threshold_lower
);
config_get_numerical_field
(
"active-defrag-threshold-upper"
,
server
.
active_defrag_threshold_upper
);
config_get_numerical_field
(
"active-defrag-ignore-bytes"
,
server
.
active_defrag_ignore_bytes
);
config_get_numerical_field
(
"active-defrag-cycle-min"
,
server
.
active_defrag_cycle_min
);
config_get_numerical_field
(
"active-defrag-cycle-max"
,
server
.
active_defrag_cycle_max
);
config_get_numerical_field
(
"active-defrag-max-scan-fields"
,
server
.
active_defrag_max_scan_fields
);
config_get_numerical_field
(
"active-expire-effort"
,
server
.
active_expire_effort
);
config_get_numerical_field
(
"auto-aof-rewrite-percentage"
,
server
.
aof_rewrite_perc
);
config_get_numerical_field
(
"auto-aof-rewrite-min-size"
,
server
.
aof_rewrite_min_size
);
config_get_numerical_field
(
"hash-max-ziplist-entries"
,
server
.
hash_max_ziplist_entries
);
config_get_numerical_field
(
"hash-max-ziplist-value"
,
server
.
hash_max_ziplist_value
);
config_get_numerical_field
(
"stream-node-max-bytes"
,
server
.
stream_node_max_bytes
);
config_get_numerical_field
(
"stream-node-max-entries"
,
server
.
stream_node_max_entries
);
config_get_numerical_field
(
"list-max-ziplist-size"
,
server
.
list_max_ziplist_size
);
config_get_numerical_field
(
"list-compress-depth"
,
server
.
list_compress_depth
);
config_get_numerical_field
(
"set-max-intset-entries"
,
server
.
set_max_intset_entries
);
config_get_numerical_field
(
"zset-max-ziplist-entries"
,
server
.
zset_max_ziplist_entries
);
config_get_numerical_field
(
"zset-max-ziplist-value"
,
server
.
zset_max_ziplist_value
);
config_get_numerical_field
(
"hll-sparse-max-bytes"
,
server
.
hll_sparse_max_bytes
);
config_get_numerical_field
(
"lua-time-limit"
,
server
.
lua_time_limit
);
config_get_numerical_field
(
"slowlog-log-slower-than"
,
server
.
slowlog_log_slower_than
);
config_get_numerical_field
(
"latency-monitor-threshold"
,
server
.
latency_monitor_threshold
);
config_get_numerical_field
(
"slowlog-max-len"
,
server
.
slowlog_max_len
);
config_get_numerical_field
(
"tracking-table-max-fill"
,
server
.
tracking_table_max_fill
);
config_get_numerical_field
(
"port"
,
server
.
port
);
config_get_numerical_field("tls-port",server.tls_port);
config_get_numerical_field
(
"cluster-announce-port"
,
server
.
cluster_announce_port
);
config_get_numerical_field
(
"cluster-announce-bus-port"
,
server
.
cluster_announce_bus_port
);
config_get_numerical_field
(
"tcp-backlog"
,
server
.
tcp_backlog
);
config_get_numerical_field
(
"databases"
,
server
.
dbnum
);
config_get_numerical_field
(
"io-threads"
,
server
.
io_threads_num
);
config_get_numerical_field
(
"repl-ping-slave-period"
,
server
.
repl_ping_slave_period
);
config_get_numerical_field
(
"repl-ping-replica-period"
,
server
.
repl_ping_slave_period
);
config_get_numerical_field
(
"repl-timeout"
,
server
.
repl_timeout
);
config_get_numerical_field("repl-backlog-size",server.repl_backlog_size);
config_get_numerical_field("repl-backlog-ttl",server.repl_backlog_time_limit);
config_get_numerical_field("maxclients",server.maxclients);
config_get_numerical_field("watchdog-period",server.watchdog_period);
config_get_numerical_field
(
"slave-priority"
,
server
.
slave_priority
);
config_get_numerical_field
(
"replica-priority"
,
server
.
slave_priority
);
config_get_numerical_field
(
"slave-announce-port"
,
server
.
slave_announce_port
);
config_get_numerical_field
(
"replica-announce-port"
,
server
.
slave_announce_port
);
config_get_numerical_field("min-slaves-to-write",server.repl_min_slaves_to_write);
config_get_numerical_field("min-replicas-to-write",server.repl_min_slaves_to_write);
config_get_numerical_field("min-slaves-max-lag",server.repl_min_slaves_max_lag);
config_get_numerical_field("min-replicas-max-lag",server.repl_min_slaves_max_lag);
config_get_numerical_field("hz",server.config_hz);
config_get_numerical_field
(
"cluster-node-timeout"
,
server
.
cluster_node_timeout
);
config_get_numerical_field
(
"cluster-migration-barrier"
,
server
.
cluster_migration_barrier
);
config_get_numerical_field
(
"cluster-slave-validity-factor"
,
server
.
cluster_slave_validity_factor
);
config_get_numerical_field
(
"cluster-replica-validity-factor"
,
server
.
cluster_slave_validity_factor
);
config_get_numerical_field
(
"repl-diskless-sync-delay"
,
server
.
repl_diskless_sync_delay
);
config_get_numerical_field
(
"rdb-key-save-delay"
,
server
.
rdb_key_save_delay
);
config_get_numerical_field
(
"key-load-delay"
,
server
.
key_load_delay
);
config_get_numerical_field
(
"tcp-keepalive"
,
server
.
tcpkeepalive
);
/* Bool (yes/no) values */
/* Iterate the configs that are standard */
for
(
configYesNo
*
config
=
configs_yesno
;
config
->
name
!=
NULL
;
config
++
)
{
config_get_bool_field
(
config
->
name
,
*
(
config
->
config
));
if
(
config
->
alias
)
{
config_get_bool_field
(
config
->
alias
,
*
(
config
->
config
));
}
}
config_get_bool_field("activedefrag", server.active_defrag_enabled);
config_get_bool_field("tls-cluster",server.tls_cluster);
config_get_bool_field("tls-replication",server.tls_replication);
config_get_bool_field("tls-auth-clients",server.tls_auth_clients);
config_get_bool_field("tls-prefer-server-ciphers",
server.tls_ctx_config.prefer_server_ciphers);
/* Enum values */
config_get_enum_field
(
"maxmemory-policy"
,
server
.
maxmemory_policy
,
maxmemory_policy_enum
);
config_get_enum_field
(
"loglevel"
,
server
.
verbosity
,
loglevel_enum
);
config_get_enum_field
(
"supervised"
,
server
.
supervised_mode
,
supervised_mode_enum
);
config_get_enum_field
(
"appendfsync"
,
server
.
aof_fsync
,
aof_fsync_enum
);
config_get_enum_field
(
"syslog-facility"
,
server
.
syslog_facility
,
syslog_facility_enum
);
config_get_enum_field
(
"repl-diskless-load"
,
server
.
repl_diskless_load
,
repl_diskless_load_enum
);
/* Everything we can't handle with macros follows. */
...
...
@@ -1900,7 +1402,7 @@ int rewriteConfigFormatMemory(char *buf, size_t len, long long bytes) {
}
/* Rewrite a simple "option-name <bytes>" configuration option. */
void
rewriteConfigBytesOption
(
struct
rewriteConfigState
*
state
,
char
*
option
,
long
long
value
,
long
long
defvalue
)
{
void rewriteConfigBytesOption(struct rewriteConfigState *state,
const
char *option, long long value, long long defvalue) {
char buf[64];
int force = value != defvalue;
sds line;
...
...
@@ -1920,7 +1422,7 @@ void rewriteConfigYesNoOption(struct rewriteConfigState *state, const char *opti
}
/* Rewrite a string option. */
void
rewriteConfigStringOption
(
struct
rewriteConfigState
*
state
,
char
*
option
,
char
*
value
,
char
*
defvalue
)
{
void rewriteConfigStringOption(struct rewriteConfigState *state,
const
char *option, char *value,
const
char *defvalue) {
int force = 1;
sds line;
...
...
@@ -1942,7 +1444,7 @@ void rewriteConfigStringOption(struct rewriteConfigState *state, char *option, c
}
/* Rewrite a numerical (long long range) option. */
void
rewriteConfigNumericalOption
(
struct
rewriteConfigState
*
state
,
char
*
option
,
long
long
value
,
long
long
defvalue
)
{
void rewriteConfigNumericalOption(struct rewriteConfigState *state,
const
char *option, long long value, long long defvalue) {
int force = value != defvalue;
sds line = sdscatprintf(sdsempty(),"%s %lld",option,value);
...
...
@@ -1960,7 +1462,7 @@ void rewriteConfigOctalOption(struct rewriteConfigState *state, char *option, in
/* Rewrite an enumeration option. It takes as usually state and option name,
* and in addition the enumeration array and the default value for the
* option. */
void
rewriteConfigEnumOption
(
struct
rewriteConfigState
*
state
,
char
*
option
,
int
value
,
configEnum
*
ce
,
int
defval
)
{
void rewriteConfigEnumOption(struct rewriteConfigState *state,
const
char *option, int value, configEnum *ce, int defval) {
sds line;
const char *name = configEnumGetNameOrUnknown(ce,value);
int force = value != defval;
...
...
@@ -1969,18 +1471,6 @@ void rewriteConfigEnumOption(struct rewriteConfigState *state, char *option, int
rewriteConfigRewriteLine(state,option,line,force);
}
/* Rewrite the syslog-facility option. */
void
rewriteConfigSyslogfacilityOption
(
struct
rewriteConfigState
*
state
)
{
int
value
=
server
.
syslog_facility
;
int
force
=
value
!=
LOG_LOCAL0
;
const
char
*
name
=
NULL
,
*
option
=
"syslog-facility"
;
sds
line
;
name
=
configEnumGetNameOrUnknown
(
syslog_facility_enum
,
value
);
line
=
sdscatprintf
(
sdsempty
(),
"%s %s"
,
option
,
name
);
rewriteConfigRewriteLine
(
state
,
option
,
line
,
force
);
}
/* Rewrite the save option. */
void rewriteConfigSaveOption(struct rewriteConfigState *state) {
int j;
...
...
@@ -2282,95 +1772,35 @@ int rewriteConfig(char *path) {
* the rewrite state. */
/* Iterate the configs that are standard */
for
(
configYesNo
*
config
=
configs
_yesno
;
config
->
name
!=
NULL
;
config
++
)
{
rewriteConfigYesNoOption
(
state
,
config
->
name
,
*
(
config
->
config
),
config
->
default_valu
e
);
for (
standardConfig
*config = configs; config->name != NULL; config++) {
config->interface.rewrite(config->data, config->name, stat
e);
}
rewriteConfigStringOption
(
state
,
"pidfile"
,
server
.
pidfile
,
CONFIG_DEFAULT_PID_FILE
);
rewriteConfigNumericalOption
(
state
,
"tls-port"
,
server
.
tls_port
,
CONFIG_DEFAULT_SERVER_TLS_PORT
);
rewriteConfigNumericalOption
(
state
,
"cluster-announce-port"
,
server
.
cluster_announce_port
,
CONFIG_DEFAULT_CLUSTER_ANNOUNCE_PORT
);
rewriteConfigNumericalOption
(
state
,
"cluster-announce-bus-port"
,
server
.
cluster_announce_bus_port
,
CONFIG_DEFAULT_CLUSTER_ANNOUNCE_BUS_PORT
);
rewriteConfigNumericalOption
(
state
,
"tcp-backlog"
,
server
.
tcp_backlog
,
CONFIG_DEFAULT_TCP_BACKLOG
);
rewriteConfigBindOption(state);
rewriteConfigStringOption
(
state
,
"unixsocket"
,
server
.
unixsocket
,
NULL
);
rewriteConfigOctalOption(state,"unixsocketperm",server.unixsocketperm,CONFIG_DEFAULT_UNIX_SOCKET_PERM);
rewriteConfigNumericalOption
(
state
,
"timeout"
,
server
.
maxidletime
,
CONFIG_DEFAULT_CLIENT_TIMEOUT
);
rewriteConfigNumericalOption
(
state
,
"tcp-keepalive"
,
server
.
tcpkeepalive
,
CONFIG_DEFAULT_TCP_KEEPALIVE
);
rewriteConfigNumericalOption
(
state
,
"replica-announce-port"
,
server
.
slave_announce_port
,
CONFIG_DEFAULT_SLAVE_ANNOUNCE_PORT
);
rewriteConfigEnumOption
(
state
,
"loglevel"
,
server
.
verbosity
,
loglevel_enum
,
CONFIG_DEFAULT_VERBOSITY
);
rewriteConfigStringOption(state,"logfile",server.logfile,CONFIG_DEFAULT_LOGFILE);
rewriteConfigStringOption
(
state
,
"aclfile"
,
server
.
acl_filename
,
CONFIG_DEFAULT_ACL_FILENAME
);
rewriteConfigYesNoOption(state,"syslog-enabled",server.syslog_enabled,CONFIG_DEFAULT_SYSLOG_ENABLED);
rewriteConfigStringOption(state,"syslog-ident",server.syslog_ident,CONFIG_DEFAULT_SYSLOG_IDENT);
rewriteConfigSyslogfacilityOption
(
state
);
rewriteConfigSaveOption(state);
rewriteConfigUserOption(state);
rewriteConfigNumericalOption
(
state
,
"databases"
,
server
.
dbnum
,
CONFIG_DEFAULT_DBNUM
);
rewriteConfigNumericalOption
(
state
,
"io-threads"
,
server
.
dbnum
,
CONFIG_DEFAULT_IO_THREADS_NUM
);
rewriteConfigStringOption(state,"dbfilename",server.rdb_filename,CONFIG_DEFAULT_RDB_FILENAME);
rewriteConfigDirOption(state);
rewriteConfigSlaveofOption(state,"replicaof");
rewriteConfigStringOption
(
state
,
"replica-announce-ip"
,
server
.
slave_announce_ip
,
CONFIG_DEFAULT_SLAVE_ANNOUNCE_IP
);
rewriteConfigStringOption
(
state
,
"masteruser"
,
server
.
masteruser
,
NULL
);
rewriteConfigStringOption
(
state
,
"masterauth"
,
server
.
masterauth
,
NULL
);
rewriteConfigStringOption
(
state
,
"cluster-announce-ip"
,
server
.
cluster_announce_ip
,
NULL
);
rewriteConfigNumericalOption
(
state
,
"repl-ping-replica-period"
,
server
.
repl_ping_slave_period
,
CONFIG_DEFAULT_REPL_PING_SLAVE_PERIOD
);
rewriteConfigNumericalOption
(
state
,
"repl-timeout"
,
server
.
repl_timeout
,
CONFIG_DEFAULT_REPL_TIMEOUT
);
rewriteConfigBytesOption(state,"repl-backlog-size",server.repl_backlog_size,CONFIG_DEFAULT_REPL_BACKLOG_SIZE);
rewriteConfigBytesOption(state,"repl-backlog-ttl",server.repl_backlog_time_limit,CONFIG_DEFAULT_REPL_BACKLOG_TIME_LIMIT);
rewriteConfigEnumOption
(
state
,
"repl-diskless-load"
,
server
.
repl_diskless_load
,
repl_diskless_load_enum
,
CONFIG_DEFAULT_REPL_DISKLESS_LOAD
);
rewriteConfigNumericalOption
(
state
,
"repl-diskless-sync-delay"
,
server
.
repl_diskless_sync_delay
,
CONFIG_DEFAULT_REPL_DISKLESS_SYNC_DELAY
);
rewriteConfigNumericalOption
(
state
,
"replica-priority"
,
server
.
slave_priority
,
CONFIG_DEFAULT_SLAVE_PRIORITY
);
rewriteConfigNumericalOption
(
state
,
"min-replicas-to-write"
,
server
.
repl_min_slaves_to_write
,
CONFIG_DEFAULT_MIN_SLAVES_TO_WRITE
);
rewriteConfigNumericalOption
(
state
,
"min-replicas-max-lag"
,
server
.
repl_min_slaves_max_lag
,
CONFIG_DEFAULT_MIN_SLAVES_MAX_LAG
);
rewriteConfigRequirepassOption(state,"requirepass");
rewriteConfigNumericalOption(state,"maxclients",server.maxclients,CONFIG_DEFAULT_MAX_CLIENTS);
rewriteConfigBytesOption(state,"maxmemory",server.maxmemory,CONFIG_DEFAULT_MAXMEMORY);
rewriteConfigBytesOption
(
state
,
"proto-max-bulk-len"
,
server
.
proto_max_bulk_len
,
CONFIG_DEFAULT_PROTO_MAX_BULK_LEN
);
rewriteConfigBytesOption(state,"client-query-buffer-limit",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
);
rewriteConfigNumericalOption
(
state
,
"lfu-decay-time"
,
server
.
lfu_decay_time
,
CONFIG_DEFAULT_LFU_DECAY_TIME
);
rewriteConfigNumericalOption
(
state
,
"active-defrag-threshold-lower"
,
server
.
active_defrag_threshold_lower
,
CONFIG_DEFAULT_DEFRAG_THRESHOLD_LOWER
);
rewriteConfigNumericalOption
(
state
,
"active-defrag-threshold-upper"
,
server
.
active_defrag_threshold_upper
,
CONFIG_DEFAULT_DEFRAG_THRESHOLD_UPPER
);
rewriteConfigBytesOption
(
state
,
"active-defrag-ignore-bytes"
,
server
.
active_defrag_ignore_bytes
,
CONFIG_DEFAULT_DEFRAG_IGNORE_BYTES
);
rewriteConfigNumericalOption
(
state
,
"active-defrag-cycle-min"
,
server
.
active_defrag_cycle_min
,
CONFIG_DEFAULT_DEFRAG_CYCLE_MIN
);
rewriteConfigNumericalOption
(
state
,
"active-defrag-cycle-max"
,
server
.
active_defrag_cycle_max
,
CONFIG_DEFAULT_DEFRAG_CYCLE_MAX
);
rewriteConfigNumericalOption
(
state
,
"active-defrag-max-scan-fields"
,
server
.
active_defrag_max_scan_fields
,
CONFIG_DEFAULT_DEFRAG_MAX_SCAN_FIELDS
);
rewriteConfigNumericalOption
(
state
,
"active-expire-effort"
,
server
.
active_expire_effort
,
CONFIG_DEFAULT_ACTIVE_EXPIRE_EFFORT
);
rewriteConfigYesNoOption(state,"appendonly",server.aof_enabled,0);
rewriteConfigStringOption(state,"appendfilename",server.aof_filename,CONFIG_DEFAULT_AOF_FILENAME);
rewriteConfigEnumOption
(
state
,
"appendfsync"
,
server
.
aof_fsync
,
aof_fsync_enum
,
CONFIG_DEFAULT_AOF_FSYNC
);
rewriteConfigNumericalOption
(
state
,
"auto-aof-rewrite-percentage"
,
server
.
aof_rewrite_perc
,
AOF_REWRITE_PERC
);
rewriteConfigBytesOption
(
state
,
"auto-aof-rewrite-min-size"
,
server
.
aof_rewrite_min_size
,
AOF_REWRITE_MIN_SIZE
);
rewriteConfigNumericalOption
(
state
,
"lua-time-limit"
,
server
.
lua_time_limit
,
LUA_SCRIPT_TIME_LIMIT
);
rewriteConfigYesNoOption(state,"cluster-enabled",server.cluster_enabled,0);
rewriteConfigStringOption(state,"cluster-config-file",server.cluster_configfile,CONFIG_DEFAULT_CLUSTER_CONFIG_FILE);
rewriteConfigNumericalOption
(
state
,
"cluster-node-timeout"
,
server
.
cluster_node_timeout
,
CLUSTER_DEFAULT_NODE_TIMEOUT
);
rewriteConfigNumericalOption
(
state
,
"cluster-migration-barrier"
,
server
.
cluster_migration_barrier
,
CLUSTER_DEFAULT_MIGRATION_BARRIER
);
rewriteConfigNumericalOption
(
state
,
"cluster-replica-validity-factor"
,
server
.
cluster_slave_validity_factor
,
CLUSTER_DEFAULT_SLAVE_VALIDITY
);
rewriteConfigNumericalOption
(
state
,
"slowlog-log-slower-than"
,
server
.
slowlog_log_slower_than
,
CONFIG_DEFAULT_SLOWLOG_LOG_SLOWER_THAN
);
rewriteConfigNumericalOption
(
state
,
"latency-monitor-threshold"
,
server
.
latency_monitor_threshold
,
CONFIG_DEFAULT_LATENCY_MONITOR_THRESHOLD
);
rewriteConfigNumericalOption
(
state
,
"slowlog-max-len"
,
server
.
slowlog_max_len
,
CONFIG_DEFAULT_SLOWLOG_MAX_LEN
);
rewriteConfigNumericalOption
(
state
,
"tracking-table-max-fill"
,
server
.
tracking_table_max_fill
,
CONFIG_DEFAULT_TRACKING_TABLE_MAX_FILL
);
rewriteConfigNotifykeyspaceeventsOption(state);
rewriteConfigNumericalOption
(
state
,
"hash-max-ziplist-entries"
,
server
.
hash_max_ziplist_entries
,
OBJ_HASH_MAX_ZIPLIST_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"hash-max-ziplist-value"
,
server
.
hash_max_ziplist_value
,
OBJ_HASH_MAX_ZIPLIST_VALUE
);
rewriteConfigNumericalOption
(
state
,
"stream-node-max-bytes"
,
server
.
stream_node_max_bytes
,
OBJ_STREAM_NODE_MAX_BYTES
);
rewriteConfigNumericalOption
(
state
,
"stream-node-max-entries"
,
server
.
stream_node_max_entries
,
OBJ_STREAM_NODE_MAX_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"list-max-ziplist-size"
,
server
.
list_max_ziplist_size
,
OBJ_LIST_MAX_ZIPLIST_SIZE
);
rewriteConfigNumericalOption
(
state
,
"list-compress-depth"
,
server
.
list_compress_depth
,
OBJ_LIST_COMPRESS_DEPTH
);
rewriteConfigNumericalOption
(
state
,
"set-max-intset-entries"
,
server
.
set_max_intset_entries
,
OBJ_SET_MAX_INTSET_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"zset-max-ziplist-entries"
,
server
.
zset_max_ziplist_entries
,
OBJ_ZSET_MAX_ZIPLIST_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"zset-max-ziplist-value"
,
server
.
zset_max_ziplist_value
,
OBJ_ZSET_MAX_ZIPLIST_VALUE
);
rewriteConfigNumericalOption
(
state
,
"hll-sparse-max-bytes"
,
server
.
hll_sparse_max_bytes
,
CONFIG_DEFAULT_HLL_SPARSE_MAX_BYTES
);
rewriteConfigYesNoOption(state,"activedefrag",server.active_defrag_enabled,CONFIG_DEFAULT_ACTIVE_DEFRAG);
rewriteConfigClientoutputbufferlimitOption(state);
rewriteConfigNumericalOption(state,"hz",server.config_hz,CONFIG_DEFAULT_HZ);
rewriteConfigEnumOption
(
state
,
"supervised"
,
server
.
supervised_mode
,
supervised_mode_enum
,
SUPERVISED_NONE
);
rewriteConfigNumericalOption
(
state
,
"rdb-key-save-delay"
,
server
.
rdb_key_save_delay
,
CONFIG_DEFAULT_RDB_KEY_SAVE_DELAY
);
rewriteConfigNumericalOption
(
state
,
"key-load-delay"
,
server
.
key_load_delay
,
CONFIG_DEFAULT_KEY_LOAD_DELAY
);
#ifdef USE_OPENSSL
rewriteConfigYesNoOption(state,"tls-cluster",server.tls_cluster,0);
rewriteConfigYesNoOption(state,"tls-replication",server.tls_replication,0);
...
...
@@ -2404,6 +1834,422 @@ int rewriteConfig(char *path) {
return retval;
}
/*-----------------------------------------------------------------------------
* Configs that fit one of the major types and require no special handling
*----------------------------------------------------------------------------*/
#define LOADBUF_SIZE 256
static char loadbuf[LOADBUF_SIZE];
#define MEMORY_CONFIG 1
#define INTEGER_CONFIG 0
#define MODIFIABLE_CONFIG 1
#define IMMUTABLE_CONFIG 0
#define embedCommonConfig(config_name, config_alias, is_modifiable) \
.name = (config_name), \
.alias = (config_alias), \
.modifiable = (is_modifiable),
#define embedConfigInterface(loadfn, setfn, getfn, rewritefn) .interface = { \
.load = (loadfn), \
.set = (setfn), \
.get = (getfn), \
.rewrite = (rewritefn) \
},
/*
* What follows is the generic config types that are supported. To add a new
* config with one of these types, add it to the standardConfig table with
* the creation macro for each type.
*
* Each type contains the following:
* * A function defining how to load this type on startup.
* * A function defining how to update this type on CONFIG SET.
* * A function defining how to serialize this type on CONFIG SET.
* * A function defining how to rewrite this type on CONFIG REWRITE.
* * A Macro defining how to create this type.
*/
/* Bool Configs */
static int boolConfigLoad(typeData data, sds *argv, int argc, char **err) {
if (argc != 2) {
*err = "wrong number of arguments";
return 0;
}
if ((*(data.yesno.config) = yesnotoi(argv[1])) == -1) {
*err = "argument must be 'yes' or 'no'";
return 0;
}
return 1;
}
static int boolConfigSet(typeData data, sds value) {
int yn = yesnotoi(value);
if (yn == -1) return 0;
*(data.yesno.config) = yn;
return 1;
}
static void boolConfigGet(client *c, typeData data) {
addReplyBulkCString(c, data.yesno.config ? "yes" : "no");
}
static void boolConfigRewrite(typeData data, const char *name, struct rewriteConfigState *state) {
rewriteConfigYesNoOption(state, name,*(data.yesno.config), data.yesno.default_value);
}
#define createBoolConfig(name, alias, modifiable, config_addr, default) { \
embedCommonConfig(name, alias, modifiable) \
embedConfigInterface(boolConfigLoad, boolConfigSet, boolConfigGet, boolConfigRewrite) \
.data.yesno = { \
.config = &(config_addr), \
.default_value = (default) \
} \
}
/* String Configs */
static int stringConfigLoad(typeData data, sds *argv, int argc, char **err) {
if (argc != 2) {
*err = "wrong number of arguments";
return 0;
}
zfree(*data.string.config);
*data.string.config = argv[1][0] ? zstrdup(argv[1]) : NULL;
return 1;
}
static int stringConfigSet(typeData data, sds value) {
zfree(*data.string.config);
*data.string.config = value ? zstrdup(value) : NULL;
return 1;
}
static void stringConfigGet(client *c, typeData data) {
addReplyBulkCString(c, *data.string.config ? *data.string.config : "");
}
static void stringConfigRewrite(typeData data, const char *name, struct rewriteConfigState *state) {
rewriteConfigStringOption(state, name,*(data.string.config), data.string.default_value);
}
#define createStringConfig(name, alias, modifiable, config_addr, default) { \
embedCommonConfig(name, alias, modifiable) \
embedConfigInterface(stringConfigLoad, stringConfigSet, stringConfigGet, stringConfigRewrite) \
.data.string = { \
.config = &(config_addr), \
.default_value = (default), \
} \
}
/* Enum configs */
static int configEnumLoad(typeData data, sds *argv, int argc, char **err) {
if (argc != 2) {
*err = "wrong number of arguments";
return 0;
}
int enumval = configEnumGetValue(data.enumd.enum_value, argv[1]);
if (enumval == INT_MIN) {
sds enumerr = sdsnew("argument must be one of the following: ");
configEnum *enumNode = data.enumd.enum_value;
while(enumNode->name != NULL) {
sdscatlen(enumerr, enumNode->name, strlen(enumNode->name));
sdscatlen(enumerr, ", ", 2);
enumNode++;
}
enumerr[sdslen(enumerr) - 2] = '\0';
/* Make sure we don't overrun the fixed buffer */
enumerr[LOADBUF_SIZE - 1] = '\0';
strncpy(loadbuf, enumerr, LOADBUF_SIZE);
sdsfree(enumerr);
*err = loadbuf;
return 0;
}
*(data.enumd.config) = enumval;
return 1;
}
static int configEnumSet(typeData data, sds value) {
int enumval = configEnumGetValue(data.enumd.enum_value, value);
if (enumval == INT_MIN) return 0;
*(data.enumd.config) = enumval;
return 1;
}
static void configEnumGet(client *c, typeData data) {
addReplyBulkCString(c, configEnumGetNameOrUnknown(data.enumd.enum_value,*data.enumd.config));
}
static void configEnumRewrite(typeData data, const char *name, struct rewriteConfigState *state) {
rewriteConfigEnumOption(state, name,*(data.enumd.config), data.enumd.enum_value, data.enumd.default_value);
}
#define createEnumConfig(name, alias, modifiable, enum, config_addr, default) { \
embedCommonConfig(name, alias, modifiable) \
embedConfigInterface(configEnumLoad, configEnumSet, configEnumGet, configEnumRewrite) \
.data.enumd = { \
.config = &(config_addr), \
.default_value = (default), \
.enum_value = (enum) \
} \
}
/* Numeric configs */
static int numericConfigLoad(typeData data, sds *argv, int argc, char **err) {
long long ll;
if (argc != 2) {
*err = "wrong number of arguments";
return 0;
}
if (data.numeric.is_memory) {
int memerr;
ll = memtoll(argv[1], &memerr);
if (memerr || ll < 0) {
*err = "argument must be a memory value";
return 0;
}
} else {
if (!string2ll(argv[1], sdslen(argv[1]),&ll)) {
*err = "argument couldn't be parsed into an integer" ;
return 0;
}
}
if (ll > data.numeric.upper_bound ||
ll < data.numeric.lower_bound) {
snprintf(loadbuf, LOADBUF_SIZE,
"argument must be between %lld and %lld inclusive",
data.numeric.lower_bound,
data.numeric.upper_bound);
*err = loadbuf;
return 0;
}
if (data.numeric.numeric_type == NUMERIC_TYPE_INT) {
*(data.numeric.config.i) = (int) ll;
} else if (data.numeric.numeric_type == NUMERIC_TYPE_UNSIGNED_LONG) {
*(data.numeric.config.ul) = (unsigned long) ll;
} else if (data.numeric.numeric_type == NUMERIC_TYPE_LONG_LONG) {
*(data.numeric.config.ll) = ll;
} else if (data.numeric.numeric_type == NUMERIC_TYPE_SIZE_T) {
*(data.numeric.config.st) = (size_t) ll;
}
return 1;
}
static int numericConfigSet(typeData data, sds value) {
long long ll;
if (data.numeric.is_memory) {
int memerr;
ll = memtoll(value, &memerr);
if (memerr || ll < 0) return 0;
} else {
if (!string2ll(value, sdslen(value),&ll)) return 0;
}
if (ll > data.numeric.upper_bound ||
ll < data.numeric.lower_bound) {
return 0;
}
if (data.numeric.numeric_type == NUMERIC_TYPE_INT) {
*(data.numeric.config.i) = (int) ll;
} else if (data.numeric.numeric_type == NUMERIC_TYPE_UNSIGNED_LONG) {
*(data.numeric.config.ul) = (unsigned long) ll;
} else if (data.numeric.numeric_type == NUMERIC_TYPE_LONG_LONG) {
*(data.numeric.config.ll) = ll;
} else if (data.numeric.numeric_type == NUMERIC_TYPE_SIZE_T) {
*(data.numeric.config.st) = (size_t) ll;
}
return 1;
}
static void numericConfigGet(client *c, typeData data) {
char buf[128];
long long value = 0;
if (data.numeric.numeric_type == NUMERIC_TYPE_INT) {
value = *(data.numeric.config.i);
} else if (data.numeric.numeric_type == NUMERIC_TYPE_UNSIGNED_LONG) {
value = *(data.numeric.config.ul);
} else if (data.numeric.numeric_type == NUMERIC_TYPE_LONG_LONG) {
value = *(data.numeric.config.ll);
} else if (data.numeric.numeric_type == NUMERIC_TYPE_SIZE_T) {
value = *(data.numeric.config.st);
}
ll2string(buf, sizeof(buf), value);
addReplyBulkCString(c, buf);
}
static void numericConfigRewrite(typeData data, const char *name, struct rewriteConfigState *state) {
long long value;
if (data.numeric.numeric_type == NUMERIC_TYPE_INT) {
value = *(data.numeric.config.i);
} else if (data.numeric.numeric_type == NUMERIC_TYPE_UNSIGNED_LONG) {
value = *(data.numeric.config.ul);
} else if (data.numeric.numeric_type == NUMERIC_TYPE_LONG_LONG) {
value = *(data.numeric.config.ll);
} else if (data.numeric.numeric_type == NUMERIC_TYPE_SIZE_T) {
value = *(data.numeric.config.st);
}
if (data.numeric.is_memory) {
rewriteConfigBytesOption(state, name, value, data.numeric.default_value);
} else {
rewriteConfigNumericalOption(state, name, value, data.numeric.default_value);
}
}
#define embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) { \
embedCommonConfig(name, alias, modifiable) \
embedConfigInterface(numericConfigLoad, numericConfigSet, numericConfigGet, numericConfigRewrite) \
.data.numeric = { \
.lower_bound = (lower), \
.upper_bound = (upper), \
.default_value = (default), \
.is_memory = (memory),
#define createIntConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
.numeric_type = NUMERIC_TYPE_INT, \
.config.i = &(config_addr) \
} \
}
#define createUnsignedLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
.numeric_type = NUMERIC_TYPE_UNSIGNED_LONG, \
.config.ul = &(config_addr) \
} \
}
#define createLongLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
.numeric_type = NUMERIC_TYPE_LONG_LONG, \
.config.ll = &(config_addr) \
} \
}
#define createSizeTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory) \
.numeric_type = NUMERIC_TYPE_SIZE_T, \
.config.st = &(config_addr) \
} \
}
standardConfig configs[] = {
/* Bool configs */
createBoolConfig("rdbchecksum", NULL, IMMUTABLE_CONFIG, server.rdb_checksum, CONFIG_DEFAULT_RDB_CHECKSUM),
createBoolConfig("daemonize", NULL, IMMUTABLE_CONFIG, server.daemonize, 0),
createBoolConfig("io-threads-do-reads", NULL, IMMUTABLE_CONFIG, server.io_threads_do_reads, CONFIG_DEFAULT_IO_THREADS_DO_READS),
createBoolConfig("lua-replicate-commands", NULL, IMMUTABLE_CONFIG, server.lua_always_replicate_commands, 1),
createBoolConfig("always-show-logo", NULL, IMMUTABLE_CONFIG, server.always_show_logo, CONFIG_DEFAULT_ALWAYS_SHOW_LOGO),
createBoolConfig("protected-mode", NULL, MODIFIABLE_CONFIG, server.protected_mode, CONFIG_DEFAULT_PROTECTED_MODE),
createBoolConfig("rdbcompression", NULL, MODIFIABLE_CONFIG, server.rdb_compression, CONFIG_DEFAULT_RDB_COMPRESSION),
createBoolConfig("activerehashing", NULL, MODIFIABLE_CONFIG, server.activerehashing, CONFIG_DEFAULT_ACTIVE_REHASHING),
createBoolConfig("stop-writes-on-bgsave-error", NULL, MODIFIABLE_CONFIG, server.stop_writes_on_bgsave_err, CONFIG_DEFAULT_STOP_WRITES_ON_BGSAVE_ERROR),
createBoolConfig("dynamic-hz", NULL, MODIFIABLE_CONFIG, server.dynamic_hz, CONFIG_DEFAULT_DYNAMIC_HZ),
createBoolConfig("lazyfree-lazy-eviction", NULL, MODIFIABLE_CONFIG, server.lazyfree_lazy_eviction, CONFIG_DEFAULT_LAZYFREE_LAZY_EVICTION),
createBoolConfig("lazyfree-lazy-expire", NULL, MODIFIABLE_CONFIG, server.lazyfree_lazy_expire, CONFIG_DEFAULT_LAZYFREE_LAZY_EXPIRE),
createBoolConfig("lazyfree-lazy-server-del", NULL, MODIFIABLE_CONFIG, server.lazyfree_lazy_server_del, CONFIG_DEFAULT_LAZYFREE_LAZY_SERVER_DEL),
createBoolConfig("repl-disable-tcp-nodelay", NULL, MODIFIABLE_CONFIG, server.repl_disable_tcp_nodelay, CONFIG_DEFAULT_REPL_DISABLE_TCP_NODELAY),
createBoolConfig("repl-diskless-sync", NULL, MODIFIABLE_CONFIG, server.repl_diskless_sync, CONFIG_DEFAULT_REPL_DISKLESS_SYNC),
createBoolConfig("gopher-enabled", NULL, MODIFIABLE_CONFIG, server.gopher_enabled, CONFIG_DEFAULT_GOPHER_ENABLED),
createBoolConfig("aof-rewrite-incremental-fsync", NULL, MODIFIABLE_CONFIG, server.aof_rewrite_incremental_fsync, CONFIG_DEFAULT_AOF_REWRITE_INCREMENTAL_FSYNC),
createBoolConfig("no-appendfsync-on-rewrite", NULL, MODIFIABLE_CONFIG, server.aof_no_fsync_on_rewrite, CONFIG_DEFAULT_AOF_NO_FSYNC_ON_REWRITE),
createBoolConfig("cluster-require-full-coverage", NULL, MODIFIABLE_CONFIG, server.cluster_require_full_coverage, CLUSTER_DEFAULT_REQUIRE_FULL_COVERAGE),
createBoolConfig("rdb-save-incremental-fsync", NULL, MODIFIABLE_CONFIG, server.rdb_save_incremental_fsync, CONFIG_DEFAULT_RDB_SAVE_INCREMENTAL_FSYNC),
createBoolConfig("aof-load-truncated", NULL, MODIFIABLE_CONFIG, server.aof_load_truncated, CONFIG_DEFAULT_AOF_LOAD_TRUNCATED),
createBoolConfig("aof-use-rdb-preamble", NULL, MODIFIABLE_CONFIG, server.aof_use_rdb_preamble, CONFIG_DEFAULT_AOF_USE_RDB_PREAMBLE),
createBoolConfig("cluster-replica-no-failover", "cluster-slave-no-failover", MODIFIABLE_CONFIG, server.cluster_slave_no_failover, CLUSTER_DEFAULT_SLAVE_NO_FAILOVER),
createBoolConfig("replica-lazy-flush", "slave-lazy-flush", MODIFIABLE_CONFIG, server.repl_slave_lazy_flush, CONFIG_DEFAULT_SLAVE_LAZY_FLUSH),
createBoolConfig("replica-serve-stale-data", "slave-serve-stale-data", MODIFIABLE_CONFIG, server.repl_serve_stale_data, CONFIG_DEFAULT_SLAVE_SERVE_STALE_DATA),
createBoolConfig("replica-read-only", "slave-read-only", MODIFIABLE_CONFIG, server.repl_slave_ro, CONFIG_DEFAULT_SLAVE_READ_ONLY),
createBoolConfig("replica-ignore-maxmemory", "slave-ignore-maxmemory", MODIFIABLE_CONFIG, server.repl_slave_ignore_maxmemory, CONFIG_DEFAULT_SLAVE_IGNORE_MAXMEMORY),
createBoolConfig("jemalloc-bg-thread", NULL, MODIFIABLE_CONFIG, server.jemalloc_bg_thread, 1),
/* String Configs */
createStringConfig("aclfile", NULL, IMMUTABLE_CONFIG, server.acl_filename, CONFIG_DEFAULT_ACL_FILENAME),
createStringConfig("unixsocket", NULL, IMMUTABLE_CONFIG, server.unixsocket, NULL),
createStringConfig("pidfile", NULL, IMMUTABLE_CONFIG, server.pidfile, CONFIG_DEFAULT_PID_FILE),
createStringConfig("replica-announce-ip", "slave-announce-ip", MODIFIABLE_CONFIG, server.slave_announce_ip, CONFIG_DEFAULT_SLAVE_ANNOUNCE_IP),
createStringConfig("masteruser", NULL, MODIFIABLE_CONFIG, server.masteruser, NULL),
createStringConfig("masterauth", NULL, MODIFIABLE_CONFIG, server.masterauth, NULL),
createStringConfig("cluster-announce-ip", NULL, MODIFIABLE_CONFIG, server.cluster_announce_ip, NULL),
/* Enum Configs */
createEnumConfig("supervised", NULL, IMMUTABLE_CONFIG, supervised_mode_enum, server.supervised_mode, SUPERVISED_NONE),
createEnumConfig("syslog-facility", NULL, IMMUTABLE_CONFIG, syslog_facility_enum, server.syslog_facility, LOG_LOCAL0),
createEnumConfig("repl-diskless-load", NULL, MODIFIABLE_CONFIG, repl_diskless_load_enum, server.repl_diskless_load, CONFIG_DEFAULT_REPL_DISKLESS_LOAD),
createEnumConfig("loglevel", NULL, MODIFIABLE_CONFIG, loglevel_enum, server.verbosity, CONFIG_DEFAULT_VERBOSITY),
createEnumConfig("maxmemory-policy", NULL, MODIFIABLE_CONFIG, maxmemory_policy_enum, server.maxmemory_policy, CONFIG_DEFAULT_MAXMEMORY_POLICY),
createEnumConfig("appendfsync", NULL, MODIFIABLE_CONFIG, aof_fsync_enum, server.aof_fsync, CONFIG_DEFAULT_AOF_FSYNC),
/* Integer configs */
createIntConfig("databases", NULL, IMMUTABLE_CONFIG, 1, INT_MAX, server.dbnum, CONFIG_DEFAULT_DBNUM, INTEGER_CONFIG),
createIntConfig("port", NULL, IMMUTABLE_CONFIG, 0, 65535, server.port, CONFIG_DEFAULT_SERVER_PORT, INTEGER_CONFIG),
createIntConfig("io-threads", NULL, IMMUTABLE_CONFIG, 1, 512, server.io_threads_num, CONFIG_DEFAULT_IO_THREADS_NUM, INTEGER_CONFIG),
createIntConfig("auto-aof-rewrite-percentage", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.aof_rewrite_perc, AOF_REWRITE_PERC, INTEGER_CONFIG),
createIntConfig("cluster-replica-validity-factor", "cluster-slave-validity-factor", MODIFIABLE_CONFIG, 0, INT_MAX, server.cluster_slave_validity_factor, CLUSTER_DEFAULT_SLAVE_VALIDITY, INTEGER_CONFIG),
createIntConfig("list-max-ziplist-size", NULL, MODIFIABLE_CONFIG, INT_MIN, INT_MAX, server.list_max_ziplist_size, OBJ_LIST_MAX_ZIPLIST_SIZE, INTEGER_CONFIG),
createIntConfig("tcp-keepalive", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.tcpkeepalive, CONFIG_DEFAULT_TCP_KEEPALIVE, INTEGER_CONFIG),
createIntConfig("cluster-migration-barrier", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.cluster_migration_barrier, CLUSTER_DEFAULT_MIGRATION_BARRIER, INTEGER_CONFIG),
createIntConfig("active-defrag-cycle-min", NULL, MODIFIABLE_CONFIG, 1, 99, server.active_defrag_cycle_min, CONFIG_DEFAULT_DEFRAG_CYCLE_MIN, INTEGER_CONFIG),
createIntConfig("active-defrag-cycle-max", NULL, MODIFIABLE_CONFIG, 1, 99, server.active_defrag_cycle_max, CONFIG_DEFAULT_DEFRAG_CYCLE_MAX, INTEGER_CONFIG),
createIntConfig("active-defrag-threshold-lower", NULL, MODIFIABLE_CONFIG, 0, 1000, server.active_defrag_threshold_lower, CONFIG_DEFAULT_DEFRAG_THRESHOLD_LOWER, INTEGER_CONFIG),
createIntConfig("active-defrag-threshold-upper", NULL, MODIFIABLE_CONFIG, 0, 1000, server.active_defrag_threshold_upper, CONFIG_DEFAULT_DEFRAG_THRESHOLD_UPPER, INTEGER_CONFIG),
createIntConfig("lfu-log-factor", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.lfu_log_factor, CONFIG_DEFAULT_LFU_LOG_FACTOR, INTEGER_CONFIG),
createIntConfig("lfu-decay-time", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.lfu_decay_time, CONFIG_DEFAULT_LFU_DECAY_TIME, INTEGER_CONFIG),
createIntConfig("replica-priority", "slave-priority", MODIFIABLE_CONFIG, 0, INT_MAX, server.slave_priority, CONFIG_DEFAULT_SLAVE_PRIORITY, INTEGER_CONFIG),
createIntConfig("repl-diskless-sync-delay", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.repl_diskless_sync_delay, CONFIG_DEFAULT_REPL_DISKLESS_SYNC_DELAY, INTEGER_CONFIG),
createIntConfig("maxmemory-samples", NULL, MODIFIABLE_CONFIG, 1, INT_MAX, server.maxmemory_samples, CONFIG_DEFAULT_MAXMEMORY_SAMPLES, INTEGER_CONFIG),
createIntConfig("timeout", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.maxidletime, CONFIG_DEFAULT_CLIENT_TIMEOUT, INTEGER_CONFIG),
createIntConfig("replica-announce-port", "slave-announce-port", MODIFIABLE_CONFIG, 0, 65535, server.slave_announce_port, CONFIG_DEFAULT_SLAVE_ANNOUNCE_PORT, INTEGER_CONFIG),
createIntConfig("tcp-backlog", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.tcp_backlog, CONFIG_DEFAULT_TCP_BACKLOG, INTEGER_CONFIG),
createIntConfig("cluster-announce-bus-port", NULL, MODIFIABLE_CONFIG, 0, 65535, server.cluster_announce_bus_port, CONFIG_DEFAULT_CLUSTER_ANNOUNCE_BUS_PORT, INTEGER_CONFIG),
createIntConfig("cluster-announce-port", NULL, MODIFIABLE_CONFIG, 0, 65535, server.cluster_announce_port, CONFIG_DEFAULT_CLUSTER_ANNOUNCE_PORT, INTEGER_CONFIG),
createIntConfig("repl-timeout", NULL, MODIFIABLE_CONFIG, 1, INT_MAX, server.repl_timeout, CONFIG_DEFAULT_REPL_TIMEOUT, INTEGER_CONFIG),
createIntConfig("repl-ping-replica-period", "repl-ping-slave-period", MODIFIABLE_CONFIG, 1, INT_MAX, server.repl_ping_slave_period, CONFIG_DEFAULT_REPL_PING_SLAVE_PERIOD, INTEGER_CONFIG),
createIntConfig("list-compress-depth", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.list_compress_depth, OBJ_LIST_COMPRESS_DEPTH, INTEGER_CONFIG),
createIntConfig("rdb-key-save-delay", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.rdb_key_save_delay, CONFIG_DEFAULT_RDB_KEY_SAVE_DELAY, INTEGER_CONFIG),
createIntConfig("key-load-delay", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.key_load_delay, CONFIG_DEFAULT_KEY_LOAD_DELAY, INTEGER_CONFIG),
createIntConfig("tracking-table-max-fill", NULL, MODIFIABLE_CONFIG, 0, 100, server.tracking_table_max_fill, CONFIG_DEFAULT_TRACKING_TABLE_MAX_FILL, INTEGER_CONFIG),
createIntConfig("active-expire-effort", NULL, MODIFIABLE_CONFIG, 1, 10, server.active_expire_effort, CONFIG_DEFAULT_ACTIVE_EXPIRE_EFFORT, INTEGER_CONFIG),
/* Unsigned Long configs */
createUnsignedLongConfig("active-defrag-max-scan-fields", NULL, MODIFIABLE_CONFIG, 1, LONG_MAX, server.active_defrag_max_scan_fields, CONFIG_DEFAULT_DEFRAG_MAX_SCAN_FIELDS, INTEGER_CONFIG),
createUnsignedLongConfig("slowlog-max-len", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.slowlog_max_len, CONFIG_DEFAULT_SLOWLOG_MAX_LEN, INTEGER_CONFIG),
/* Long Long configs */
createLongLongConfig("stream-node-max-entries", NULL, MODIFIABLE_CONFIG, 0, LLONG_MAX, server.stream_node_max_entries, OBJ_STREAM_NODE_MAX_ENTRIES, INTEGER_CONFIG),
createLongLongConfig("lua-time-limit", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.lua_time_limit, LUA_SCRIPT_TIME_LIMIT, INTEGER_CONFIG),
createLongLongConfig("cluster-node-timeout", NULL, MODIFIABLE_CONFIG, 0, LLONG_MAX, server.cluster_node_timeout, CLUSTER_DEFAULT_NODE_TIMEOUT, INTEGER_CONFIG),
createLongLongConfig("slowlog-log-slower-than", NULL, MODIFIABLE_CONFIG, -1, LLONG_MAX, server.slowlog_log_slower_than, CONFIG_DEFAULT_SLOWLOG_LOG_SLOWER_THAN, INTEGER_CONFIG),
createLongLongConfig("latency-monitor-threshold", NULL, MODIFIABLE_CONFIG, 0, LLONG_MAX, server.latency_monitor_threshold, CONFIG_DEFAULT_LATENCY_MONITOR_THRESHOLD, INTEGER_CONFIG),
createLongLongConfig("proto-max-bulk-len", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.proto_max_bulk_len, CONFIG_DEFAULT_PROTO_MAX_BULK_LEN, MEMORY_CONFIG),
createLongLongConfig("auto-aof-rewrite-min-size", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.aof_rewrite_min_size, AOF_REWRITE_MIN_SIZE, MEMORY_CONFIG),
/* Size_t configs */
createSizeTConfig("hash-max-ziplist-entries", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.hash_max_ziplist_entries, OBJ_HASH_MAX_ZIPLIST_ENTRIES, INTEGER_CONFIG),
createSizeTConfig("set-max-intset-entries", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.set_max_intset_entries, OBJ_SET_MAX_INTSET_ENTRIES, INTEGER_CONFIG),
createSizeTConfig("zset-max-ziplist-entries", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.zset_max_ziplist_entries, OBJ_ZSET_MAX_ZIPLIST_ENTRIES, INTEGER_CONFIG),
createSizeTConfig("active-defrag-ignore-bytes", NULL, MODIFIABLE_CONFIG, 1, LONG_MAX, server.active_defrag_ignore_bytes, CONFIG_DEFAULT_DEFRAG_IGNORE_BYTES, MEMORY_CONFIG),
createSizeTConfig("hash-max-ziplist-value", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.hash_max_ziplist_value, OBJ_HASH_MAX_ZIPLIST_VALUE, MEMORY_CONFIG),
createSizeTConfig("stream-node-max-bytes", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.stream_node_max_bytes, OBJ_STREAM_NODE_MAX_BYTES, MEMORY_CONFIG),
createSizeTConfig("zset-max-ziplist-value", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.zset_max_ziplist_value, OBJ_ZSET_MAX_ZIPLIST_VALUE, MEMORY_CONFIG),
createSizeTConfig("hll-sparse-max-bytes", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, server.hll_sparse_max_bytes, CONFIG_DEFAULT_HLL_SPARSE_MAX_BYTES, MEMORY_CONFIG),
/* NULL Terminator */
{NULL}
};
/*-----------------------------------------------------------------------------
* CONFIG command entry point
*----------------------------------------------------------------------------*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment