mirror of
https://github.com/redis/redis.git
synced 2025-12-18 21:46:08 -05:00
# Problem Some redis modules need to call `CONFIG GET/SET` commands. Server may be ran with `rename-command CONFIG ""`(or something similar) which leads to the module being unable to access the config. # Solution Added new API functions for use by modules ``` RedisModuleConfigIterator* RedisModule_GetConfigIterator(RedisModuleCtx *ctx, const char *pattern); void RedisModule_ReleaseConfigIterator(RedisModuleCtx *ctx, RedisModuleConfigIterator *iter); const char *RedisModule_ConfigIteratorNext(RedisModuleConfigIterator *iter); int RedisModule_GetConfigType(const char *name, RedisModuleConfigType *res); int RedisModule_GetBoolConfig(RedisModuleCtx *ctx, const char *name, int *res); int RedisModule_GetConfig(RedisModuleCtx *ctx, const char *name, RedisModuleString **res); int RedisModule_GetEnumConfig(RedisModuleCtx *ctx, const char *name, RedisModuleString **res); int RedisModule_GetNumericConfig(RedisModuleCtx *ctx, const char *name, long long *res); int RedisModule_SetBoolConfig(RedisModuleCtx *ctx, const char *name, int value, RedisModuleString **err); int RedisModule_SetConfig(RedisModuleCtx *ctx, const char *name, RedisModuleString *value, RedisModuleString **err); int RedisModule_SetEnumConfig(RedisModuleCtx *ctx, const char *name, RedisModuleString *value, RedisModuleString **err); int RedisModule_SetNumericConfig(RedisModuleCtx *ctx, const char *name, long long value, RedisModuleString **err); ``` ## Implementation The work is mostly done inside `config.c` as I didn't want to expose the config dict outside of it. That means each of these module functions has a corresponding method in `config.c` that actually does the job. F.e `RedisModule_SetEnumConfig` calls `moduleSetEnumConfig` which is implemented in `config.c` ## Notes Also, refactored `configSetCommand` and `restoreBackupConfig` functions for the following reasons: - code and logic is now way more clear in `configSetCommand`. Only caveat here is removal of an optimization that skipped running apply functions that already have ran in favour of code clarity. - Both functions needlessly separated logic for module configs and normal configs whereas no such separation is needed. This also had the side effect of removing some allocations. - `restoreBackupConfig` now has clearer interface and can be reused with ease. One of the places I reused it is for the individual `moduleSet*Config` functions, each of which needs the restoration functionality but for a single config only. ## Future Additionally, a couple considerations were made for potentially extending the API in the future - if need be an API for atomically setting multiple config values can be added - `RedisModule_SetConfigsTranscationStart/End` or similar that can be put around `RedisModule_Set*Config` calls. - if performance is an issue an API `RedisModule_GetConfigIteratorNextWithTypehint` or similar may be added in order not to incur the additional cost of calling `RedisModule_GetConfigType`. --------- Co-authored-by: Oran Agra <oran@redislabs.com>
62 lines
1.9 KiB
Bash
Executable file
62 lines
1.9 KiB
Bash
Executable file
#!/bin/sh
|
|
TCL_VERSIONS="8.5 8.6 8.7"
|
|
TCLSH=""
|
|
[ -z "$MAKE" ] && MAKE=make
|
|
|
|
for VERSION in $TCL_VERSIONS; do
|
|
TCL=`which tclsh$VERSION 2>/dev/null` && TCLSH=$TCL
|
|
done
|
|
|
|
if [ -z $TCLSH ]
|
|
then
|
|
echo "You need tcl 8.5 or newer in order to run the Redis ModuleApi test"
|
|
exit 1
|
|
fi
|
|
|
|
$MAKE -C tests/modules && \
|
|
$TCLSH tests/test_helper.tcl \
|
|
--single unit/moduleapi/commandfilter \
|
|
--single unit/moduleapi/basics \
|
|
--single unit/moduleapi/fork \
|
|
--single unit/moduleapi/testrdb \
|
|
--single unit/moduleapi/infotest \
|
|
--single unit/moduleapi/moduleconfigs \
|
|
--single unit/moduleapi/infra \
|
|
--single unit/moduleapi/propagate \
|
|
--single unit/moduleapi/hooks \
|
|
--single unit/moduleapi/misc \
|
|
--single unit/moduleapi/blockonkeys \
|
|
--single unit/moduleapi/blockonbackground \
|
|
--single unit/moduleapi/scan \
|
|
--single unit/moduleapi/datatype \
|
|
--single unit/moduleapi/auth \
|
|
--single unit/moduleapi/keyspace_events \
|
|
--single unit/moduleapi/blockedclient \
|
|
--single unit/moduleapi/getchannels \
|
|
--single unit/moduleapi/getkeys \
|
|
--single unit/moduleapi/test_lazyfree \
|
|
--single unit/moduleapi/defrag \
|
|
--single unit/moduleapi/keyspecs \
|
|
--single unit/moduleapi/hash \
|
|
--single unit/moduleapi/zset \
|
|
--single unit/moduleapi/list \
|
|
--single unit/moduleapi/stream \
|
|
--single unit/moduleapi/mallocsize \
|
|
--single unit/moduleapi/datatype2 \
|
|
--single unit/moduleapi/cluster \
|
|
--single unit/moduleapi/aclcheck \
|
|
--single unit/moduleapi/subcommands \
|
|
--single unit/moduleapi/reply \
|
|
--single unit/moduleapi/cmdintrospection \
|
|
--single unit/moduleapi/eventloop \
|
|
--single unit/moduleapi/timer \
|
|
--single unit/moduleapi/publish \
|
|
--single unit/moduleapi/usercall \
|
|
--single unit/moduleapi/postnotifications \
|
|
--single unit/moduleapi/async_rm_call \
|
|
--single unit/moduleapi/moduleauth \
|
|
--single unit/moduleapi/rdbloadsave \
|
|
--single unit/moduleapi/crash \
|
|
--single unit/moduleapi/internalsecret \
|
|
--single unit/moduleapi/configaccess \
|
|
"${@}"
|