mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
Make representClusterNodeFlags() more robust.
This function failed when an internal-only flag was set as an only flag in a node: the string was trimmed expecting a final comma before exiting the function, causing a crash. See issue #4142. Moreover generation of flags representation only needed at DEBUG log level was always performed: a waste of CPU time. This is fixed as well by this commit.
This commit is contained in:
parent
b1c2e1a19c
commit
a3778f3b0f
@ -1323,14 +1323,16 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) {
|
|||||||
clusterNode *node;
|
clusterNode *node;
|
||||||
sds ci;
|
sds ci;
|
||||||
|
|
||||||
ci = representClusterNodeFlags(sdsempty(), flags);
|
if (server.verbosity == LL_DEBUG) {
|
||||||
serverLog(LL_DEBUG,"GOSSIP %.40s %s:%d@%d %s",
|
ci = representClusterNodeFlags(sdsempty(), flags);
|
||||||
g->nodename,
|
serverLog(LL_DEBUG,"GOSSIP %.40s %s:%d@%d %s",
|
||||||
g->ip,
|
g->nodename,
|
||||||
ntohs(g->port),
|
g->ip,
|
||||||
ntohs(g->cport),
|
ntohs(g->port),
|
||||||
ci);
|
ntohs(g->cport),
|
||||||
sdsfree(ci);
|
ci);
|
||||||
|
sdsfree(ci);
|
||||||
|
}
|
||||||
|
|
||||||
/* Update our state accordingly to the gossip sections */
|
/* Update our state accordingly to the gossip sections */
|
||||||
node = clusterLookupNode(g->nodename);
|
node = clusterLookupNode(g->nodename);
|
||||||
@ -3835,15 +3837,14 @@ static struct redisNodeFlags redisNodeFlagsTable[] = {
|
|||||||
/* Concatenate the comma separated list of node flags to the given SDS
|
/* Concatenate the comma separated list of node flags to the given SDS
|
||||||
* string 'ci'. */
|
* string 'ci'. */
|
||||||
sds representClusterNodeFlags(sds ci, uint16_t flags) {
|
sds representClusterNodeFlags(sds ci, uint16_t flags) {
|
||||||
if (flags == 0) {
|
size_t orig_len = sdslen(ci);
|
||||||
ci = sdscat(ci,"noflags,");
|
int i, size = sizeof(redisNodeFlagsTable)/sizeof(struct redisNodeFlags);
|
||||||
} else {
|
for (i = 0; i < size; i++) {
|
||||||
int i, size = sizeof(redisNodeFlagsTable)/sizeof(struct redisNodeFlags);
|
struct redisNodeFlags *nodeflag = redisNodeFlagsTable + i;
|
||||||
for (i = 0; i < size; i++) {
|
if (flags & nodeflag->flag) ci = sdscat(ci, nodeflag->name);
|
||||||
struct redisNodeFlags *nodeflag = redisNodeFlagsTable + i;
|
|
||||||
if (flags & nodeflag->flag) ci = sdscat(ci, nodeflag->name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
/* If no flag was added, add the "noflags" special flag. */
|
||||||
|
if (sdslen(ci) == orig_len) ci = sdscat(ci,"noflags,");
|
||||||
sdsIncrLen(ci,-1); /* Remove trailing comma. */
|
sdsIncrLen(ci,-1); /* Remove trailing comma. */
|
||||||
return ci;
|
return ci;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user