diff options
author | Madelyn Olson <matolson@amazon.com> | 2019-10-28 12:58:03 -0700 |
---|---|---|
committer | Madelyn Olson <matolson@amazon.com> | 2019-12-16 23:33:53 -0800 |
commit | 44aa22c63553d6be2879c51161feb50c1b31eab8 (patch) | |
tree | 7263eee6ccf4c45d34282ab2f50bbedefffd2204 | |
parent | c95a582a749a83b117bdd51f4a7a29a616a0bf3c (diff) | |
download | redis-44aa22c63553d6be2879c51161feb50c1b31eab8.tar.gz |
Added better exception handling around scripting and module
-rw-r--r-- | src/module.c | 11 | ||||
-rw-r--r-- | src/scripting.c | 16 |
2 files changed, 21 insertions, 6 deletions
diff --git a/src/module.c b/src/module.c index 5d9a39387..31d337b14 100644 --- a/src/module.c +++ b/src/module.c @@ -3174,6 +3174,8 @@ fmterr: * EINVAL: wrong command arity. * ENOENT: command does not exist. * EPERM: operation in Cluster instance with key in non local slot. + * EROFS: operation in Cluster instance when a write command is sent + * in a readonly state. * * This API is documented here: https://redis.io/topics/modules-intro */ @@ -3231,13 +3233,18 @@ RedisModuleCallReply *RM_Call(RedisModuleCtx *ctx, const char *cmdname, const ch * trying to access non-local keys, with the exception of commands * received from our master. */ if (server.cluster_enabled && !(ctx->client->flags & CLIENT_MASTER)) { + int error_code; /* Duplicate relevant flags in the module client. */ c->flags &= ~(CLIENT_READONLY|CLIENT_ASKING); c->flags |= ctx->client->flags & (CLIENT_READONLY|CLIENT_ASKING); - if (getNodeByQuery(c,c->cmd,c->argv,c->argc,NULL,NULL) != + if (getNodeByQuery(c,c->cmd,c->argv,c->argc,NULL,&error_code) != server.cluster->myself) { - errno = EPERM; + if (error_code == CLUSTER_REDIR_DOWN_STATE) { + errno = EROFS; + } else { + errno = EPERM; + } goto cleanup; } } diff --git a/src/scripting.c b/src/scripting.c index 7cf21f408..c627207d5 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -679,15 +679,23 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) { if (server.cluster_enabled && !server.loading && !(server.lua_caller->flags & CLIENT_MASTER)) { + int error_code; /* Duplicate relevant flags in the lua client. */ c->flags &= ~(CLIENT_READONLY|CLIENT_ASKING); c->flags |= server.lua_caller->flags & (CLIENT_READONLY|CLIENT_ASKING); - if (getNodeByQuery(c,c->cmd,c->argv,c->argc,NULL,NULL) != + if (getNodeByQuery(c,c->cmd,c->argv,c->argc,NULL,&error_code) != server.cluster->myself) { - luaPushError(lua, - "Lua script attempted to access a non local key in a " - "cluster node"); + if (error_code == CLUSTER_REDIR_DOWN_STATE) { + luaPushError(lua, + "Lua script attempted execute a write command while " + "cluster is down"); + } else { + luaPushError(lua, + "Lua script attempted to access a non local key in a " + "cluster node"); + } + goto cleanup; } } |