mirror of
https://github.com/redis/redis.git
synced 2026-07-15 04:53:26 -04: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> |
||
|---|---|---|
| .. | ||
| aclcheck.c | ||
| auth.c | ||
| basics.c | ||
| blockedclient.c | ||
| blockonbackground.c | ||
| blockonkeys.c | ||
| cmdintrospection.c | ||
| commandfilter.c | ||
| configaccess.c | ||
| crash.c | ||
| datatype.c | ||
| datatype2.c | ||
| defragtest.c | ||
| eventloop.c | ||
| fork.c | ||
| getchannels.c | ||
| getkeys.c | ||
| hash.c | ||
| hooks.c | ||
| infotest.c | ||
| internalsecret.c | ||
| keyspace_events.c | ||
| keyspecs.c | ||
| list.c | ||
| Makefile | ||
| mallocsize.c | ||
| misc.c | ||
| moduleauthtwo.c | ||
| moduleconfigs.c | ||
| moduleconfigstwo.c | ||
| postnotifications.c | ||
| propagate.c | ||
| publish.c | ||
| rdbloadsave.c | ||
| reply.c | ||
| scan.c | ||
| stream.c | ||
| subcommands.c | ||
| test_lazyfree.c | ||
| testrdb.c | ||
| timer.c | ||
| usercall.c | ||
| zset.c | ||