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
a5e4c95c
Unverified
Commit
a5e4c95c
authored
Nov 22, 2019
by
Salvatore Sanfilippo
Committed by
GitHub
Nov 22, 2019
Browse files
Merge pull request #6607 from madolson/dev-unstable-new-refactor
Refactored configs into types that can be generic
parents
b9394558
e8f4010e
Changes
1
Show whitespace changes
Inline
Side-by-side
src/config.c
View file @
a5e4c95c
...
@@ -107,46 +107,73 @@ clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_OBUF_COUNT] = {
...
@@ -107,46 +107,73 @@ clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_OBUF_COUNT] = {
/* Configuration values that require no special handling to set, get, load or
/* Configuration values that require no special handling to set, get, load or
* rewrite. */
* 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 */
int
convert_empty_to_null
;
/* A boolean indicating if empty strings should
be stored as a NULL value. */
}
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
*
name
;
/* The user visible name of this config */
const
char
*
alias
;
/* An alias that can also be used for 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
modifiable
;
/* Can this value be updated by CONFIG SET? */
const
int
default_value
;
/* The default value of the config on rewrite */
typeInterface
interface
;
/* The function pointers that define the type interface */
}
configYesNo
;
typeData
data
;
/* The type specific data exposed used by the interface */
}
standardConfig
;
configYesNo
configs_yesno
[]
=
{
/* Non-Modifiable */
standardConfig
configs
[];
{
"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
}
};
/*-----------------------------------------------------------------------------
/*-----------------------------------------------------------------------------
* Enum access functions
* Enum access functions
...
@@ -220,7 +247,7 @@ void queueLoadModule(sds path, sds *argv, int argc) {
...
@@ -220,7 +247,7 @@ void queueLoadModule(sds path, sds *argv, int argc) {
}
}
void
loadServerConfigFromString
(
char
*
config
)
{
void
loadServerConfigFromString
(
char
*
config
)
{
const
char
*
err
=
NULL
;
char
*
err
=
NULL
;
int
linenum
=
0
,
totlines
,
i
;
int
linenum
=
0
,
totlines
,
i
;
int
slaveof_linenum
=
0
;
int
slaveof_linenum
=
0
;
sds
*
lines
;
sds
*
lines
;
...
@@ -253,14 +280,14 @@ void loadServerConfigFromString(char *config) {
...
@@ -253,14 +280,14 @@ void loadServerConfigFromString(char *config) {
/* Iterate the configs that are standard */
/* Iterate the configs that are standard */
int
match
=
0
;
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
)
||
if
((
!
strcasecmp
(
argv
[
0
],
config
->
name
)
||
(
config
->
alias
&&
!
strcasecmp
(
argv
[
0
],
config
->
alias
)))
&&
(
config
->
alias
&&
!
strcasecmp
(
argv
[
0
],
config
->
alias
))))
(
argc
==
2
))
{
{
if
(
(
*
(
config
->
config
)
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
if
(
!
config
->
interface
.
load
(
config
->
data
,
argv
,
argc
,
&
err
)
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
goto
loaderr
;
}
}
match
=
1
;
match
=
1
;
break
;
break
;
}
}
...
@@ -272,27 +299,7 @@ void loadServerConfigFromString(char *config) {
...
@@ -272,27 +299,7 @@ void loadServerConfigFromString(char *config) {
}
}
/* Execute config directives */
/* Execute config directives */
if
(
!
strcasecmp
(
argv
[
0
],
"timeout"
)
&&
argc
==
2
)
{
if
(
!
strcasecmp
(
argv
[
0
],
"bind"
)
&&
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
)
{
int
j
,
addresses
=
argc
-
1
;
int
j
,
addresses
=
argc
-
1
;
if
(
addresses
>
CONFIG_BINDADDR_MAX
)
{
if
(
addresses
>
CONFIG_BINDADDR_MAX
)
{
...
@@ -301,8 +308,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -301,8 +308,6 @@ void loadServerConfigFromString(char *config) {
for
(
j
=
0
;
j
<
addresses
;
j
++
)
for
(
j
=
0
;
j
<
addresses
;
j
++
)
server
.
bindaddr
[
j
]
=
zstrdup
(
argv
[
j
+
1
]);
server
.
bindaddr
[
j
]
=
zstrdup
(
argv
[
j
+
1
]);
server
.
bindaddr_count
=
addresses
;
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"unixsocketperm"
)
&&
argc
==
2
)
{
errno
=
0
;
errno
=
0
;
server
.
unixsocketperm
=
(
mode_t
)
strtol
(
argv
[
1
],
NULL
,
8
);
server
.
unixsocketperm
=
(
mode_t
)
strtol
(
argv
[
1
],
NULL
,
8
);
...
@@ -326,13 +331,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -326,13 +331,6 @@ void loadServerConfigFromString(char *config) {
argv
[
1
],
strerror
(
errno
));
argv
[
1
],
strerror
(
errno
));
exit
(
1
);
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"logfile"
)
&&
argc
==
2
)
{
FILE
*
logfp
;
FILE
*
logfp
;
...
@@ -349,9 +347,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -349,9 +347,6 @@ void loadServerConfigFromString(char *config) {
}
}
fclose
(
logfp
);
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"syslog-enabled"
)
&&
argc
==
2
)
{
if
((
server
.
syslog_enabled
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
if
((
server
.
syslog_enabled
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
...
@@ -359,23 +354,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -359,23 +354,6 @@ void loadServerConfigFromString(char *config) {
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"syslog-ident"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"syslog-ident"
)
&&
argc
==
2
)
{
if
(
server
.
syslog_ident
)
zfree
(
server
.
syslog_ident
);
if
(
server
.
syslog_ident
)
zfree
(
server
.
syslog_ident
);
server
.
syslog_ident
=
zstrdup
(
argv
[
1
]);
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"include"
)
&&
argc
==
2
)
{
loadServerConfig
(
argv
[
1
],
NULL
);
loadServerConfig
(
argv
[
1
],
NULL
);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"maxclients"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"maxclients"
)
&&
argc
==
2
)
{
...
@@ -385,68 +363,14 @@ void loadServerConfigFromString(char *config) {
...
@@ -385,68 +363,14 @@ void loadServerConfigFromString(char *config) {
}
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"maxmemory"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"maxmemory"
)
&&
argc
==
2
)
{
server
.
maxmemory
=
memtoll
(
argv
[
1
],
NULL
);
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
)
{
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"client-query-buffer-limit"
))
&&
argc
==
2
)
{
server
.
client_max_querybuf_len
=
memtoll
(
argv
[
1
],
NULL
);
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"
)
||
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"slaveof"
)
||
!
strcasecmp
(
argv
[
0
],
"replicaof"
))
&&
argc
==
3
)
{
!
strcasecmp
(
argv
[
0
],
"replicaof"
))
&&
argc
==
3
)
{
slaveof_linenum
=
linenum
;
slaveof_linenum
=
linenum
;
server
.
masterhost
=
sdsnew
(
argv
[
1
]);
server
.
masterhost
=
sdsnew
(
argv
[
1
]);
server
.
masterport
=
atoi
(
argv
[
2
]);
server
.
masterport
=
atoi
(
argv
[
2
]);
server
.
repl_state
=
REPL_STATE_CONNECT
;
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"repl-backlog-size"
)
&&
argc
==
2
)
{
long
long
size
=
memtoll
(
argv
[
1
],
NULL
);
long
long
size
=
memtoll
(
argv
[
1
],
NULL
);
if
(
size
<=
0
)
{
if
(
size
<=
0
)
{
...
@@ -460,12 +384,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -460,12 +384,6 @@ void loadServerConfigFromString(char *config) {
err
=
"repl-backlog-ttl can't be negative "
;
err
=
"repl-backlog-ttl can't be negative "
;
goto
loaderr
;
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"activedefrag"
)
&&
argc
==
2
)
{
if
((
server
.
active_defrag_enabled
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
if
((
server
.
active_defrag_enabled
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
...
@@ -491,36 +409,10 @@ void loadServerConfigFromString(char *config) {
...
@@ -491,36 +409,10 @@ void loadServerConfigFromString(char *config) {
}
}
zfree
(
server
.
aof_filename
);
zfree
(
server
.
aof_filename
);
server
.
aof_filename
=
zstrdup
(
argv
[
1
]);
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"
)
&&
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"auto-aof-rewrite-min-size"
)
&&
argc
==
2
)
argc
==
2
)
{
{
server
.
aof_rewrite_min_size
=
memtoll
(
argv
[
1
],
NULL
);
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"requirepass"
)
&&
argc
==
2
)
{
if
(
strlen
(
argv
[
1
])
>
CONFIG_AUTHPASS_MAX_LEN
)
{
if
(
strlen
(
argv
[
1
])
>
CONFIG_AUTHPASS_MAX_LEN
)
{
err
=
"Password is longer than CONFIG_AUTHPASS_MAX_LEN"
;
err
=
"Password is longer than CONFIG_AUTHPASS_MAX_LEN"
;
...
@@ -532,9 +424,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -532,9 +424,6 @@ void loadServerConfigFromString(char *config) {
sds
aclop
=
sdscatprintf
(
sdsempty
(),
">%s"
,
argv
[
1
]);
sds
aclop
=
sdscatprintf
(
sdsempty
(),
">%s"
,
argv
[
1
]);
ACLSetUser
(
DefaultUser
,
aclop
,
sdslen
(
aclop
));
ACLSetUser
(
DefaultUser
,
aclop
,
sdslen
(
aclop
));
sdsfree
(
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"dbfilename"
)
&&
argc
==
2
)
{
if
(
!
pathIsBaseName
(
argv
[
1
]))
{
if
(
!
pathIsBaseName
(
argv
[
1
]))
{
err
=
"dbfilename can't be a path, just a filename"
;
err
=
"dbfilename can't be a path, just a filename"
;
...
@@ -542,76 +431,12 @@ void loadServerConfigFromString(char *config) {
...
@@ -542,76 +431,12 @@ void loadServerConfigFromString(char *config) {
}
}
zfree
(
server
.
rdb_filename
);
zfree
(
server
.
rdb_filename
);
server
.
rdb_filename
=
zstrdup
(
argv
[
1
]);
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"stream-node-max-entries"
)
&&
argc
==
2
)
{
server
.
stream_node_max_entries
=
atoi
(
argv
[
1
]);
server
.
stream_node_max_entries
=
atoi
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"list-max-ziplist-entries"
)
&&
argc
==
2
){
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"list-max-ziplist-entries"
)
&&
argc
==
2
){
/* DEAD OPTION */
/* DEAD OPTION */
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"list-max-ziplist-value"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"list-max-ziplist-value"
)
&&
argc
==
2
)
{
/* DEAD OPTION */
/* 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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"rename-command"
)
&&
argc
==
3
)
{
struct
redisCommand
*
cmd
=
lookupCommand
(
argv
[
1
]);
struct
redisCommand
*
cmd
=
lookupCommand
(
argv
[
1
]);
int
retval
;
int
retval
;
...
@@ -643,80 +468,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -643,80 +468,6 @@ void loadServerConfigFromString(char *config) {
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"cluster-config-file"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"cluster-config-file"
)
&&
argc
==
2
)
{
zfree
(
server
.
cluster_configfile
);
zfree
(
server
.
cluster_configfile
);
server
.
cluster_configfile
=
zstrdup
(
argv
[
1
]);
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"
)
&&
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"client-output-buffer-limit"
)
&&
argc
==
5
)
argc
==
5
)
{
{
...
@@ -739,24 +490,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -739,24 +490,6 @@ void loadServerConfigFromString(char *config) {
server
.
client_obuf_limits
[
class
].
hard_limit_bytes
=
hard
;
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_bytes
=
soft
;
server
.
client_obuf_limits
[
class
].
soft_limit_seconds
=
soft_seconds
;
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"
)
||
}
else
if
((
!
strcasecmp
(
argv
[
0
],
"min-slaves-to-write"
)
||
!
strcasecmp
(
argv
[
0
],
"min-replicas-to-write"
))
&&
argc
==
2
)
!
strcasecmp
(
argv
[
0
],
"min-replicas-to-write"
))
&&
argc
==
2
)
{
{
...
@@ -779,15 +512,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -779,15 +512,6 @@ void loadServerConfigFromString(char *config) {
goto
loaderr
;
goto
loaderr
;
}
}
server
.
notify_keyspace_events
=
flags
;
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
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"user"
)
&&
argc
>=
2
)
{
int
argc_err
;
int
argc_err
;
if
(
ACLAppendUserForLoading
(
argv
,
argc
,
&
argc_err
)
==
C_ERR
)
{
if
(
ACLAppendUserForLoading
(
argv
,
argc
,
&
argc_err
)
==
C_ERR
)
{
...
@@ -935,12 +659,6 @@ void loadServerConfig(char *filename, char *options) {
...
@@ -935,12 +659,6 @@ void loadServerConfig(char *filename, char *options) {
if (err || ll < 0) goto badfmt; \
if (err || ll < 0) goto badfmt; \
_var = ll;
_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) \
#define config_set_special_field(_name) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) {
} else if (!strcasecmp(c->argv[2]->ptr,_name)) {
...
@@ -959,13 +677,13 @@ void configSetCommand(client *c) {
...
@@ -959,13 +677,13 @@ void configSetCommand(client *c) {
o
=
c
->
argv
[
3
];
o
=
c
->
argv
[
3
];
/* Iterate the configs that are standard */
/* 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
)
||
if
(
config
->
modifiable
&&
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
config
->
name
)
||
(
config
->
alias
&&
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
config
->
alias
))))
(
config
->
alias
&&
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
config
->
alias
))))
{
{
i
nt
yn
=
yesnotoi
(
o
->
ptr
)
;
i
f
(
!
config
->
interface
.
set
(
config
->
data
,
o
->
ptr
)
)
{
if
(
yn
==
-
1
)
goto
badfmt
;
goto
badfmt
;
*
(
config
->
config
)
=
yn
;
}
addReply
(
c
,
shared
.
ok
);
addReply
(
c
,
shared
.
ok
);
return
;
return
;
}
}
...
@@ -989,15 +707,6 @@ void configSetCommand(client *c) {
...
@@ -989,15 +707,6 @@ void configSetCommand(client *c) {
sds
aclop
=
sdscatprintf
(
sdsempty
(),
">%s"
,(
char
*
)
o
->
ptr
);
sds
aclop
=
sdscatprintf
(
sdsempty
(),
">%s"
,(
char
*
)
o
->
ptr
);
ACLSetUser
(
DefaultUser
,
aclop
,
sdslen
(
aclop
));
ACLSetUser
(
DefaultUser
,
aclop
,
sdslen
(
aclop
));
sdsfree
(
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"
)
{
}
config_set_special_field
(
"maxclients"
)
{
int
orig_value
=
server
.
maxclients
;
int
orig_value
=
server
.
maxclients
;
...
@@ -1128,12 +837,6 @@ void configSetCommand(client *c) {
...
@@ -1128,12 +837,6 @@ void configSetCommand(client *c) {
if
(
flags
==
-
1
)
goto
badfmt
;
if
(
flags
==
-
1
)
goto
badfmt
;
server
.
notify_keyspace_events
=
flags
;
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.
/* Boolean fields.
* config_set_bool_field(name,var). */
* config_set_bool_field(name,var). */
}
config_set_bool_field
(
}
config_set_bool_field
(
...
@@ -1151,86 +854,10 @@ void configSetCommand(client *c) {
...
@@ -1151,86 +854,10 @@ void configSetCommand(client *c) {
#endif
#endif
/* Numerical fields.
/* Numerical fields.
* config_set_numerical_field(name,var,min,max) */
* 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
(
}
config_set_numerical_field
(
"stream-node-max-entries"
,
server
.
stream_node_max_entries
,
0
,
LLONG_MAX
)
{
"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
(
}
config_set_numerical_field
(
"repl-backlog-ttl"
,
server
.
repl_backlog_time_limit
,
0
,
LONG_MAX
)
{
"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
(
}
config_set_numerical_field
(
"min-slaves-to-write"
,
server
.
repl_min_slaves_to_write
,
0
,
INT_MAX
)
{
"min-slaves-to-write"
,
server
.
repl_min_slaves_to_write
,
0
,
INT_MAX
)
{
refreshGoodSlavesCount
();
refreshGoodSlavesCount
();
...
@@ -1243,18 +870,6 @@ void configSetCommand(client *c) {
...
@@ -1243,18 +870,6 @@ void configSetCommand(client *c) {
}
config_set_numerical_field
(
}
config_set_numerical_field
(
"min-replicas-max-lag"
,
server
.
repl_min_slaves_max_lag
,
0
,
INT_MAX
)
{
"min-replicas-max-lag"
,
server
.
repl_min_slaves_max_lag
,
0
,
INT_MAX
)
{
refreshGoodSlavesCount
();
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
(
}
config_set_numerical_field
(
"hz"
,
server
.
config_hz
,
0
,
INT_MAX
)
{
"hz"
,
server
.
config_hz
,
0
,
INT_MAX
)
{
/* Hz is more an hint from the user, so we accept values out of range
/* Hz is more an hint from the user, so we accept values out of range
...
@@ -1267,7 +882,6 @@ void configSetCommand(client *c) {
...
@@ -1267,7 +882,6 @@ void configSetCommand(client *c) {
enableWatchdog
(
ll
);
enableWatchdog
(
ll
);
else
else
disableWatchdog
();
disableWatchdog
();
/* Memory fields.
/* Memory fields.
* config_set_memory_field(name,var) */
* config_set_memory_field(name,var) */
}
config_set_memory_field
(
"maxmemory"
,
server
.
maxmemory
)
{
}
config_set_memory_field
(
"maxmemory"
,
server
.
maxmemory
)
{
...
@@ -1277,25 +891,12 @@ void configSetCommand(client *c) {
...
@@ -1277,25 +891,12 @@ void configSetCommand(client *c) {
}
}
freeMemoryIfNeededAndSafe
();
freeMemoryIfNeededAndSafe
();
}
}
}
config_set_memory_field
(
"proto-max-bulk-len"
,
server
.
proto_max_bulk_len
)
{
}
config_set_memory_field
(
}
config_set_memory_field
(
"client-query-buffer-limit"
,
server
.
client_max_querybuf_len
)
{
"client-query-buffer-limit"
,
server
.
client_max_querybuf_len
)
{
}
config_set_memory_field
(
"repl-backlog-size"
,
ll
)
{
}
config_set_memory_field
(
"repl-backlog-size"
,
ll
)
{
resizeReplicationBacklog
(
ll
);
resizeReplicationBacklog
(
ll
);
}
config_set_memory_field
(
"auto-aof-rewrite-min-size"
,
ll
)
{
}
config_set_memory_field
(
"auto-aof-rewrite-min-size"
,
ll
)
{
server
.
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
#ifdef USE_OPENSSL
/* TLS fields. */
/* TLS fields. */
}
config_set_special_field
(
"tls-cert-file"
)
{
}
config_set_special_field
(
"tls-cert-file"
)
{
...
@@ -1436,13 +1037,6 @@ badfmt: /* Bad format errors */
...
@@ -1436,13 +1037,6 @@ badfmt: /* Bad format errors */
} \
} \
} while(0);
} 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
)
{
void
configGetCommand
(
client
*
c
)
{
robj
*
o
=
c
->
argv
[
2
];
robj
*
o
=
c
->
argv
[
2
];
...
@@ -1452,17 +1046,23 @@ void configGetCommand(client *c) {
...
@@ -1452,17 +1046,23 @@ void configGetCommand(client *c) {
int
matches
=
0
;
int
matches
=
0
;
serverAssertWithInfo
(
c
,
o
,
sdsEncodedObject
(
o
));
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 */
/* String values */
config_get_string_field
(
"dbfilename"
,
server
.
rdb_filename
);
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
(
"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
#ifdef USE_OPENSSL
config_get_string_field
(
"tls-cert-file"
,
server
.
tls_ctx_config
.
cert_file
);
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
);
config_get_string_field
(
"tls-key-file"
,
server
.
tls_ctx_config
.
key_file
);
...
@@ -1476,110 +1076,29 @@ void configGetCommand(client *c) {
...
@@ -1476,110 +1076,29 @@ void configGetCommand(client *c) {
/* Numerical values */
/* Numerical values */
config_get_numerical_field
(
"maxmemory"
,
server
.
maxmemory
);
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
(
"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"
,
config_get_numerical_field
(
"auto-aof-rewrite-min-size"
,
server
.
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"
,
config_get_numerical_field
(
"stream-node-max-entries"
,
server
.
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
(
"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-size"
,
server
.
repl_backlog_size
);
config_get_numerical_field
(
"repl-backlog-ttl"
,
server
.
repl_backlog_time_limit
);
config_get_numerical_field
(
"repl-backlog-ttl"
,
server
.
repl_backlog_time_limit
);
config_get_numerical_field
(
"maxclients"
,
server
.
maxclients
);
config_get_numerical_field
(
"maxclients"
,
server
.
maxclients
);
config_get_numerical_field
(
"watchdog-period"
,
server
.
watchdog_period
);
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-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-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-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
(
"min-replicas-max-lag"
,
server
.
repl_min_slaves_max_lag
);
config_get_numerical_field
(
"hz"
,
server
.
config_hz
);
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 */
/* 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
(
"activedefrag"
,
server
.
active_defrag_enabled
);
config_get_bool_field
(
"tls-cluster"
,
server
.
tls_cluster
);
config_get_bool_field
(
"tls-cluster"
,
server
.
tls_cluster
);
config_get_bool_field
(
"tls-replication"
,
server
.
tls_replication
);
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-auth-clients"
,
server
.
tls_auth_clients
);
config_get_bool_field
(
"tls-prefer-server-ciphers"
,
config_get_bool_field
(
"tls-prefer-server-ciphers"
,
server
.
tls_ctx_config
.
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. */
/* Everything we can't handle with macros follows. */
...
@@ -1900,7 +1419,7 @@ int rewriteConfigFormatMemory(char *buf, size_t len, long long bytes) {
...
@@ -1900,7 +1419,7 @@ int rewriteConfigFormatMemory(char *buf, size_t len, long long bytes) {
}
}
/* Rewrite a simple "option-name <bytes>" configuration option. */
/* 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
];
char
buf
[
64
];
int
force
=
value
!=
defvalue
;
int
force
=
value
!=
defvalue
;
sds
line
;
sds
line
;
...
@@ -1920,7 +1439,7 @@ void rewriteConfigYesNoOption(struct rewriteConfigState *state, const char *opti
...
@@ -1920,7 +1439,7 @@ void rewriteConfigYesNoOption(struct rewriteConfigState *state, const char *opti
}
}
/* Rewrite a string option. */
/* 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
;
int
force
=
1
;
sds
line
;
sds
line
;
...
@@ -1942,7 +1461,7 @@ void rewriteConfigStringOption(struct rewriteConfigState *state, char *option, c
...
@@ -1942,7 +1461,7 @@ void rewriteConfigStringOption(struct rewriteConfigState *state, char *option, c
}
}
/* Rewrite a numerical (long long range) option. */
/* 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
;
int
force
=
value
!=
defvalue
;
sds
line
=
sdscatprintf
(
sdsempty
(),
"%s %lld"
,
option
,
value
);
sds
line
=
sdscatprintf
(
sdsempty
(),
"%s %lld"
,
option
,
value
);
...
@@ -1960,7 +1479,7 @@ void rewriteConfigOctalOption(struct rewriteConfigState *state, char *option, in
...
@@ -1960,7 +1479,7 @@ void rewriteConfigOctalOption(struct rewriteConfigState *state, char *option, in
/* Rewrite an enumeration option. It takes as usually state and option name,
/* Rewrite an enumeration option. It takes as usually state and option name,
* and in addition the enumeration array and the default value for the
* and in addition the enumeration array and the default value for the
* option. */
* 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
;
sds
line
;
const
char
*
name
=
configEnumGetNameOrUnknown
(
ce
,
value
);
const
char
*
name
=
configEnumGetNameOrUnknown
(
ce
,
value
);
int
force
=
value
!=
defval
;
int
force
=
value
!=
defval
;
...
@@ -1969,18 +1488,6 @@ void rewriteConfigEnumOption(struct rewriteConfigState *state, char *option, int
...
@@ -1969,18 +1488,6 @@ void rewriteConfigEnumOption(struct rewriteConfigState *state, char *option, int
rewriteConfigRewriteLine
(
state
,
option
,
line
,
force
);
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. */
/* Rewrite the save option. */
void
rewriteConfigSaveOption
(
struct
rewriteConfigState
*
state
)
{
void
rewriteConfigSaveOption
(
struct
rewriteConfigState
*
state
)
{
int
j
;
int
j
;
...
@@ -2282,95 +1789,37 @@ int rewriteConfig(char *path) {
...
@@ -2282,95 +1789,37 @@ int rewriteConfig(char *path) {
* the rewrite state. */
* the rewrite state. */
/* Iterate the configs that are standard */
/* Iterate the configs that are standard */
for
(
configYesNo
*
config
=
configs
_yesno
;
config
->
name
!=
NULL
;
config
++
)
{
for
(
standardConfig
*
config
=
configs
;
config
->
name
!=
NULL
;
config
++
)
{
rewriteConfigYesNoOption
(
state
,
config
->
name
,
*
(
config
->
config
),
config
->
default_valu
e
);
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
);
rewriteConfigBindOption
(
state
);
rewriteConfigStringOption
(
state
,
"unixsocket"
,
server
.
unixsocket
,
NULL
);
rewriteConfigOctalOption
(
state
,
"unixsocketperm"
,
server
.
unixsocketperm
,
CONFIG_DEFAULT_UNIX_SOCKET_PERM
);
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
,
"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
);
rewriteConfigYesNoOption
(
state
,
"syslog-enabled"
,
server
.
syslog_enabled
,
CONFIG_DEFAULT_SYSLOG_ENABLED
);
rewriteConfigStringOption
(
state
,
"syslog-ident"
,
server
.
syslog_ident
,
CONFIG_DEFAULT_SYSLOG_IDENT
);
rewriteConfigStringOption
(
state
,
"syslog-ident"
,
server
.
syslog_ident
,
CONFIG_DEFAULT_SYSLOG_IDENT
);
rewriteConfigSyslogfacilityOption
(
state
);
rewriteConfigSaveOption
(
state
);
rewriteConfigSaveOption
(
state
);
rewriteConfigUserOption
(
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
);
rewriteConfigStringOption
(
state
,
"dbfilename"
,
server
.
rdb_filename
,
CONFIG_DEFAULT_RDB_FILENAME
);
rewriteConfigDirOption
(
state
);
rewriteConfigDirOption
(
state
);
rewriteConfigSlaveofOption
(
state
,
"replicaof"
);
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-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
);
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"
);
rewriteConfigRequirepassOption
(
state
,
"requirepass"
);
rewriteConfigNumericalOption
(
state
,
"maxclients"
,
server
.
maxclients
,
CONFIG_DEFAULT_MAX_CLIENTS
);
rewriteConfigNumericalOption
(
state
,
"maxclients"
,
server
.
maxclients
,
CONFIG_DEFAULT_MAX_CLIENTS
);
rewriteConfigBytesOption
(
state
,
"maxmemory"
,
server
.
maxmemory
,
CONFIG_DEFAULT_MAXMEMORY
);
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
);
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
);
rewriteConfigYesNoOption
(
state
,
"appendonly"
,
server
.
aof_enabled
,
0
);
rewriteConfigStringOption
(
state
,
"appendfilename"
,
server
.
aof_filename
,
CONFIG_DEFAULT_AOF_FILENAME
);
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
);
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
);
rewriteConfigYesNoOption
(
state
,
"cluster-enabled"
,
server
.
cluster_enabled
,
0
);
rewriteConfigStringOption
(
state
,
"cluster-config-file"
,
server
.
cluster_configfile
,
CONFIG_DEFAULT_CLUSTER_CONFIG_FILE
);
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
);
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
,
"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
);
rewriteConfigYesNoOption
(
state
,
"activedefrag"
,
server
.
active_defrag_enabled
,
CONFIG_DEFAULT_ACTIVE_DEFRAG
);
rewriteConfigClientoutputbufferlimitOption
(
state
);
rewriteConfigClientoutputbufferlimitOption
(
state
);
rewriteConfigNumericalOption
(
state
,
"hz"
,
server
.
config_hz
,
CONFIG_DEFAULT_HZ
);
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
#ifdef USE_OPENSSL
rewriteConfigYesNoOption
(
state
,
"tls-cluster"
,
server
.
tls_cluster
,
0
);
rewriteConfigYesNoOption
(
state
,
"tls-cluster"
,
server
.
tls_cluster
,
0
);
rewriteConfigYesNoOption
(
state
,
"tls-replication"
,
server
.
tls_replication
,
0
);
rewriteConfigYesNoOption
(
state
,
"tls-replication"
,
server
.
tls_replication
,
0
);
...
@@ -2404,6 +1853,433 @@ int rewriteConfig(char *path) {
...
@@ -2404,6 +1853,433 @@ int rewriteConfig(char *path) {
return
retval
;
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 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
);
if
(
data
.
string
.
convert_empty_to_null
)
{
*
data
.
string
.
config
=
argv
[
1
][
0
]
?
zstrdup
(
argv
[
1
])
:
NULL
;
}
else
{
*
data
.
string
.
config
=
zstrdup
(
argv
[
1
]);
}
return
1
;
}
static
int
stringConfigSet
(
typeData
data
,
sds
value
)
{
zfree
(
*
data
.
string
.
config
);
if
(
data
.
string
.
convert_empty_to_null
)
{
*
data
.
string
.
config
=
value
[
0
]
?
zstrdup
(
value
)
:
NULL
;
}
else
{
*
data
.
string
.
config
=
zstrdup
(
value
);
}
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 ALLOW_EMPTY_STRING 0
#define EMPTY_STRING_IS_NULL 1
#define createStringConfig(name, alias, modifiable, empty_to_null, config_addr, default) { \
embedCommonConfig(name, alias, modifiable) \
embedConfigInterface(stringConfigLoad, stringConfigSet, stringConfigGet, stringConfigRewrite) \
.data.string = { \
.config = &(config_addr), \
.default_value = (default), \
.convert_empty_to_null = (empty_to_null) \
} \
}
/* 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
)
{
enumerr
=
sdscatlen
(
enumerr
,
enumNode
->
name
,
strlen
(
enumNode
->
name
));
enumerr
=
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
=
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
);
}
if
(
data
.
numeric
.
is_memory
)
{
rewriteConfigBytesOption
(
state
,
name
,
value
,
data
.
numeric
.
default_value
);
}
else
{
rewriteConfigNumericalOption
(
state
,
name
,
value
,
data
.
numeric
.
default_value
);
}
}
#define INTEGER_CONFIG 0
#define MEMORY_CONFIG 1
#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
,
ALLOW_EMPTY_STRING
,
server
.
acl_filename
,
CONFIG_DEFAULT_ACL_FILENAME
),
createStringConfig
(
"unixsocket"
,
NULL
,
IMMUTABLE_CONFIG
,
EMPTY_STRING_IS_NULL
,
server
.
unixsocket
,
NULL
),
createStringConfig
(
"pidfile"
,
NULL
,
IMMUTABLE_CONFIG
,
EMPTY_STRING_IS_NULL
,
server
.
pidfile
,
CONFIG_DEFAULT_PID_FILE
),
createStringConfig
(
"replica-announce-ip"
,
"slave-announce-ip"
,
MODIFIABLE_CONFIG
,
EMPTY_STRING_IS_NULL
,
server
.
slave_announce_ip
,
CONFIG_DEFAULT_SLAVE_ANNOUNCE_IP
),
createStringConfig
(
"masteruser"
,
NULL
,
MODIFIABLE_CONFIG
,
EMPTY_STRING_IS_NULL
,
server
.
masteruser
,
NULL
),
createStringConfig
(
"masterauth"
,
NULL
,
MODIFIABLE_CONFIG
,
EMPTY_STRING_IS_NULL
,
server
.
masterauth
,
NULL
),
createStringConfig
(
"cluster-announce-ip"
,
NULL
,
MODIFIABLE_CONFIG
,
EMPTY_STRING_IS_NULL
,
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
(
"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
),
/* 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
* 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