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
3cce566e
Commit
3cce566e
authored
Sep 28, 2017
by
zhaozhao.zz
Committed by
antirez
Nov 24, 2017
Browse files
Modules: handle the conflict of registering commands
parent
d01f163c
Changes
1
Show whitespace changes
Inline
Side-by-side
src/module.c
View file @
3cce566e
...
...
@@ -613,7 +613,7 @@ int RM_CreateCommand(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc c
sds cmdname = sdsnew(name);
/* Check if the command name is busy. */
if
(
lookupCommand
(
(
char
*
)
name
)
!=
NULL
)
{
if (lookupCommand(
cmd
name) != NULL) {
sdsfree(cmdname);
return REDISMODULE_ERR;
}
...
...
@@ -3736,6 +3736,28 @@ void moduleFreeModuleStructure(struct RedisModule *module) {
zfree(module);
}
void moduleUnregisterCommands(struct RedisModule *module) {
/* Unregister all the commands registered by this module. */
dictIterator *di = dictGetSafeIterator(server.commands);
dictEntry *de;
while ((de = dictNext(di)) != NULL) {
struct redisCommand *cmd = dictGetVal(de);
if (cmd->proc == RedisModuleCommandDispatcher) {
RedisModuleCommandProxy *cp =
(void*)(unsigned long)cmd->getkeys_proc;
sds cmdname = cp->rediscmd->name;
if (cp->module == module) {
dictDelete(server.commands,cmdname);
dictDelete(server.orig_commands,cmdname);
sdsfree(cmdname);
zfree(cp->rediscmd);
zfree(cp);
}
}
}
dictReleaseIterator(di);
}
/* Load a module and initialize it. On success C_OK is returned, otherwise
* C_ERR is returned. */
int moduleLoad(const char *path, void **module_argv, int module_argc) {
...
...
@@ -3756,7 +3778,10 @@ int moduleLoad(const char *path, void **module_argv, int module_argc) {
return C_ERR;
}
if (onload((void*)&ctx,module_argv,module_argc) == REDISMODULE_ERR) {
if
(
ctx
.
module
)
moduleFreeModuleStructure
(
ctx
.
module
);
if (ctx.module) {
moduleUnregisterCommands(ctx.module);
moduleFreeModuleStructure(ctx.module);
}
dlclose(handle);
serverLog(LL_WARNING,
"Module %s initialization failed. Module not loaded",path);
...
...
@@ -3790,25 +3815,7 @@ int moduleUnload(sds name) {
return REDISMODULE_ERR;
}
/* Unregister all the commands registered by this module. */
dictIterator
*
di
=
dictGetSafeIterator
(
server
.
commands
);
dictEntry
*
de
;
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
struct
redisCommand
*
cmd
=
dictGetVal
(
de
);
if
(
cmd
->
proc
==
RedisModuleCommandDispatcher
)
{
RedisModuleCommandProxy
*
cp
=
(
void
*
)(
unsigned
long
)
cmd
->
getkeys_proc
;
sds
cmdname
=
cp
->
rediscmd
->
name
;
if
(
cp
->
module
==
module
)
{
dictDelete
(
server
.
commands
,
cmdname
);
dictDelete
(
server
.
orig_commands
,
cmdname
);
sdsfree
(
cmdname
);
zfree
(
cp
->
rediscmd
);
zfree
(
cp
);
}
}
}
dictReleaseIterator
(
di
);
moduleUnregisterCommands(module);
/* Unregister all the hooks. TODO: Yet no hooks support here. */
...
...
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