Unverified Commit a31b516e authored by Filipe Oliveira (Redis)'s avatar Filipe Oliveira (Redis) Committed by GitHub
Browse files

Optimize the HELLO command reply (#13490)

# Overall improvement

TBD ( current is approximately 6% on the achievable ops/sec), coming
from:

- In case of no module we can skip 1.3% CPU cycles on dict Iterator
creation/deletion
- Use addReplyBulkCBuffer instead of addReplyBulkCString to avoid
runtime strlen overhead within HELLO reply on string constants.

## Optimization 1: In case of no module we can skip 1.3% CPU cycles on
dict Iterator creation/deletion.

## Optimization 2: Use addReplyBulkCBuffer instead of
addReplyBulkCString to avoid runtime strlen overhead within HELLO reply
on string constants.
parent c77b8f45
......@@ -12463,10 +12463,15 @@ void modulePipeReadable(aeEventLoop *el, int fd, void *privdata, int mask) {
/* Helper function for the MODULE and HELLO command: send the list of the
* loaded modules to the client. */
void addReplyLoadedModules(client *c) {
const long ln = dictSize(modules);
/* In case no module is load we avoid iterator creation */
addReplyArrayLen(c,ln);
if (ln == 0) {
return;
}
dictIterator *di = dictGetIterator(modules);
dictEntry *de;
 
addReplyArrayLen(c,dictSize(modules));
while ((de = dictNext(di)) != NULL) {
sds name = dictGetKey(de);
struct RedisModule *module = dictGetVal(de);
......
......@@ -3662,29 +3662,30 @@ void helloCommand(client *c) {
if (ver) c->resp = ver;
addReplyMapLen(c,6 + !server.sentinel_mode);
addReplyBulkCString(c,"server");
addReplyBulkCString(c,"redis");
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"server");
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"redis");
addReplyBulkCString(c,"version");
addReplyBulkCString(c,REDIS_VERSION);
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"version");
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,REDIS_VERSION);
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"proto");
addReplyBulkCString(c,"proto");
addReplyLongLong(c,c->resp);
addReplyBulkCString(c,"id");
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"id");
addReplyLongLong(c,c->id);
addReplyBulkCString(c,"mode");
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"mode");
if (server.sentinel_mode) addReplyBulkCString(c,"sentinel");
else if (server.cluster_enabled) addReplyBulkCString(c,"cluster");
else addReplyBulkCString(c,"standalone");
if (!server.sentinel_mode) {
addReplyBulkCString(c,"role");
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"role");
addReplyBulkCString(c,server.masterhost ? "replica" : "master");
}
addReplyBulkCString(c,"modules");
ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c,"modules");
addReplyLoadedModules(c);
}
......
......@@ -2690,6 +2690,8 @@ void initThreadedIO(void);
client *lookupClientByID(uint64_t id);
int authRequired(client *c);
void putClientInPendingWriteQueue(client *c);
/* reply macros */
#define ADD_REPLY_BULK_CBUFFER_STRING_CONSTANT(c, str) addReplyBulkCBuffer(c, str, strlen(str))
/* logreqres.c - logging of requests and responses */
void reqresReset(client *c, int free_buf);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment