Skip to content

Commit

Permalink
small refactor for acls, extract user creation/get into function (Red…
Browse files Browse the repository at this point in the history
…isLabs#578)

Co-authored-by: Hanna Fadida <[email protected]>
  • Loading branch information
sjpotter and fadidahanna authored Mar 15, 2023
1 parent d9fc54a commit 194cb2a
Showing 1 changed file with 28 additions and 23 deletions.
51 changes: 28 additions & 23 deletions src/raft.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ static RRStatus handleSharding(RedisRaftCtx *rr, RedisModuleCtx *ctx, RaftRedisC
/* returns the client session object for this CommandArray if applicable
* starts/creates it if necessary
*/
static void *getClientSession(RedisRaftCtx *rr, RaftRedisCommandArray *cmds)
static void *getClientSession(RedisRaftCtx *rr, RaftRedisCommandArray *cmds, bool local)
{
unsigned long long id = cmds->client_id;
int nokey;
Expand All @@ -312,14 +312,37 @@ static void *getClientSession(RedisRaftCtx *rr, RaftRedisCommandArray *cmds)
if (cmd_len == 5 && strncasecmp("watch", cmd, cmd_len) == 0) {
client_session = RedisModule_Alloc(sizeof(ClientSession));
client_session->client_id = id;
client_session->local = false;
client_session->local = local;
RedisModule_DictSetC(rr->client_session_dict, &id, sizeof(id), client_session);
}
}

return client_session;
}

RedisModuleUser *RaftGetACLUser(RedisModuleCtx *ctx, RedisRaftCtx *rr, RaftRedisCommandArray *cmds)
{
int nokey;
RedisModuleUser *user = RedisModule_DictGet(rr->acl_dict, cmds->acl, &nokey);
if (nokey) {
char user_name[64];
/* Note: This assumes we don't delete "acl users" */
uint64_t count = RedisModule_DictSize(rr->acl_dict);
count++;
snprintf(user_name, 64, "redis_raft%lu", (unsigned long) count);
user = RedisModule_CreateModuleUser(user_name);
RedisModule_Assert(user != NULL);

const char *acl_str = RedisModule_StringPtrLen(cmds->acl, NULL);
int ret = RedisModule_SetModuleUserACLString(ctx, user, acl_str, NULL);
RedisModule_Assert(ret == REDISMODULE_OK);

RedisModule_DictSet(rr->acl_dict, cmds->acl, user);
}

return user;
}

/* Execute all commands in a specified RaftRedisCommandArray.
*
* If reply_ctx is non-NULL, replies are delivered to it.
Expand All @@ -334,22 +357,7 @@ void RaftExecuteCommandArray(RedisRaftCtx *rr,
RedisModuleUser *user = NULL;

if (cmds->acl) {
int nokey;
user = RedisModule_DictGet(rr->acl_dict, cmds->acl, &nokey);
if (nokey) {
char user_name[64];
uint64_t count = RedisModule_DictSize(rr->acl_dict);
count++;
snprintf(user_name, 64, "redis_raft%lu", (unsigned long) count);
user = RedisModule_CreateModuleUser(user_name);
RedisModule_Assert(user != NULL);

const char *acl_str = RedisModule_StringPtrLen(cmds->acl, NULL);
int ret = RedisModule_SetModuleUserACLString(ctx, user, acl_str, NULL);
RedisModule_Assert(ret == REDISMODULE_OK);

RedisModule_DictSet(rr->acl_dict, cmds->acl, user);
}
user = RaftGetACLUser(ctx, rr, cmds);
}

if (rr->config.log_delay_apply) {
Expand All @@ -362,11 +370,8 @@ void RaftExecuteCommandArray(RedisRaftCtx *rr,
return;
}

ClientSession *client_session = getClientSession(rr, cmds);
if (client_session && reply_ctx) {
client_session->local = true;
}
(void) client_session;
ClientSession *client_session = getClientSession(rr, cmds, reply_ctx != NULL);
(void) client_session; /* unused for now */

for (int i = 0; i < cmds->len; i++) {
RaftRedisCommand *c = cmds->commands[i];
Expand Down

0 comments on commit 194cb2a

Please sign in to comment.