summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-07-28 16:58:04 +0200
committerantirez <antirez@gmail.com>2015-07-28 16:58:35 +0200
commite6f39338e6464fb29f630120d8949b0d535e2e3f (patch)
tree395cd9181f45c6ca15ddea3c5f59e31933bd5ea6
parentc1e94b6b9c6432ade2ec427dc8602189c19758e7 (diff)
downloadredis-e6f39338e6464fb29f630120d8949b0d535e2e3f.tar.gz
CLIENT_MASTER introduced.
-rw-r--r--src/config.c8
-rw-r--r--src/networking.c11
-rw-r--r--src/server.c2
-rw-r--r--src/server.h9
4 files changed, 20 insertions, 10 deletions
diff --git a/src/config.c b/src/config.c
index c77a09973..6fb357eb8 100644
--- a/src/config.c
+++ b/src/config.c
@@ -90,7 +90,7 @@ configEnum aof_fsync_enum[] = {
};
/* Output buffer limits presets. */
-clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_COUNT] = {
+clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_OBUF_COUNT] = {
{0, 0, 0}, /* normal */
{1024*1024*256, 1024*1024*64, 60}, /* slave */
{1024*1024*32, 1024*1024*8, 60} /* pubsub */
@@ -1163,13 +1163,13 @@ void configGetCommand(client *c) {
sds buf = sdsempty();
int j;
- for (j = 0; j < CLIENT_TYPE_COUNT; j++) {
+ for (j = 0; j < CLIENT_TYPE_OBUF_COUNT; j++) {
buf = sdscatprintf(buf,"%s %llu %llu %ld",
getClientTypeName(j),
server.client_obuf_limits[j].hard_limit_bytes,
server.client_obuf_limits[j].soft_limit_bytes,
(long) server.client_obuf_limits[j].soft_limit_seconds);
- if (j != CLIENT_TYPE_COUNT-1)
+ if (j != CLIENT_TYPE_OBUF_COUNT-1)
buf = sdscatlen(buf," ",1);
}
addReplyBulkCString(c,"client-output-buffer-limit");
@@ -1566,7 +1566,7 @@ void rewriteConfigClientoutputbufferlimitOption(struct rewriteConfigState *state
int j;
char *option = "client-output-buffer-limit";
- for (j = 0; j < CLIENT_TYPE_COUNT; j++) {
+ for (j = 0; j < CLIENT_TYPE_OBUF_COUNT; j++) {
int force = (server.client_obuf_limits[j].hard_limit_bytes !=
clientBufferLimitsDefaults[j].hard_limit_bytes) ||
(server.client_obuf_limits[j].soft_limit_bytes !=
diff --git a/src/networking.c b/src/networking.c
index 68b36abb5..5634cf6fe 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -1567,12 +1567,13 @@ unsigned long getClientOutputBufferMemoryUsage(client *c) {
* CLIENT_TYPE_NORMAL -> Normal client
* CLIENT_TYPE_SLAVE -> Slave or client executing MONITOR command
* CLIENT_TYPE_PUBSUB -> Client subscribed to Pub/Sub channels
+ * CLIENT_TYPE_MASTER -> The client representing our replication master.
*/
int getClientType(client *c) {
+ if (c->flags & CLIENT_MASTER) return CLIENT_TYPE_MASTER;
if ((c->flags & CLIENT_SLAVE) && !(c->flags & CLIENT_MONITOR))
return CLIENT_TYPE_SLAVE;
- if (c->flags & CLIENT_PUBSUB)
- return CLIENT_TYPE_PUBSUB;
+ if (c->flags & CLIENT_PUBSUB) return CLIENT_TYPE_PUBSUB;
return CLIENT_TYPE_NORMAL;
}
@@ -1580,6 +1581,7 @@ int getClientTypeByName(char *name) {
if (!strcasecmp(name,"normal")) return CLIENT_TYPE_NORMAL;
else if (!strcasecmp(name,"slave")) return CLIENT_TYPE_SLAVE;
else if (!strcasecmp(name,"pubsub")) return CLIENT_TYPE_PUBSUB;
+ else if (!strcasecmp(name,"master")) return CLIENT_TYPE_MASTER;
else return -1;
}
@@ -1588,6 +1590,7 @@ char *getClientTypeName(int class) {
case CLIENT_TYPE_NORMAL: return "normal";
case CLIENT_TYPE_SLAVE: return "slave";
case CLIENT_TYPE_PUBSUB: return "pubsub";
+ case CLIENT_TYPE_MASTER: return "master";
default: return NULL;
}
}
@@ -1603,6 +1606,10 @@ int checkClientOutputBufferLimits(client *c) {
unsigned long used_mem = getClientOutputBufferMemoryUsage(c);
class = getClientType(c);
+ /* For the purpose of output buffer limiting, masters are handled
+ * like normal clients. */
+ if (class == CLIENT_TYPE_MASTER) class = CLIENT_TYPE_NORMAL;
+
if (server.client_obuf_limits[class].hard_limit_bytes &&
used_mem >= server.client_obuf_limits[class].hard_limit_bytes)
hard = 1;
diff --git a/src/server.c b/src/server.c
index 3440bf543..dd906ed99 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1533,7 +1533,7 @@ void initServerConfig(void) {
server.repl_no_slaves_since = time(NULL);
/* Client output buffer limits */
- for (j = 0; j < CLIENT_TYPE_COUNT; j++)
+ for (j = 0; j < CLIENT_TYPE_OBUF_COUNT; j++)
server.client_obuf_limits[j] = clientBufferLimitsDefaults[j];
/* Double constants initialization */
diff --git a/src/server.h b/src/server.h
index 78823d0e3..c3bea54ea 100644
--- a/src/server.h
+++ b/src/server.h
@@ -276,7 +276,10 @@ typedef long long mstime_t; /* millisecond time type. */
#define CLIENT_TYPE_NORMAL 0 /* Normal req-reply clients + MONITORs */
#define CLIENT_TYPE_SLAVE 1 /* Slaves. */
#define CLIENT_TYPE_PUBSUB 2 /* Clients subscribed to PubSub channels. */
-#define CLIENT_TYPE_COUNT 3
+#define CLIENT_TYPE_MASTER 3 /* Master. */
+#define CLIENT_TYPE_OBUF_COUNT 3 /* Number of clients to expose to output
+ buffer configuration. Just the first
+ three: normal, slave, pubsub. */
/* Slave replication state. Used in server.repl_state for slaves to remember
* what to do next. */
@@ -625,7 +628,7 @@ typedef struct clientBufferLimitsConfig {
time_t soft_limit_seconds;
} clientBufferLimitsConfig;
-extern clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_COUNT];
+extern clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_OBUF_COUNT];
/* The redisOp structure defines a Redis Operation, that is an instance of
* a command with an argument vector, database ID, propagation target
@@ -751,7 +754,7 @@ struct redisServer {
int supervised; /* 1 if supervised, 0 otherwise. */
int supervised_mode; /* See SUPERVISED_* */
int daemonize; /* True if running as a daemon */
- clientBufferLimitsConfig client_obuf_limits[CLIENT_TYPE_COUNT];
+ clientBufferLimitsConfig client_obuf_limits[CLIENT_TYPE_OBUF_COUNT];
/* AOF persistence */
int aof_state; /* AOF_(ON|OFF|WAIT_REWRITE) */
int aof_fsync; /* Kind of fsync() policy */