Skip to content

Commit 84c3c4a

Browse files
committed
New configuration parameter redis_ignore_select, which ignores clients SELECT commands
and always replies with OK.
1 parent 1fde0f4 commit 84c3c4a

File tree

4 files changed

+28
-2
lines changed

4 files changed

+28
-2
lines changed

src/nc_conf.c

+10
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ static struct command conf_commands[] = {
8686
conf_set_num,
8787
offsetof(struct conf_pool, redis_db) },
8888

89+
{ string("redis_ignore_select"),
90+
conf_set_bool,
91+
offsetof(struct conf_pool, redis_ignore_select) },
92+
8993
{ string("preconnect"),
9094
conf_set_bool,
9195
offsetof(struct conf_pool, preconnect) },
@@ -200,6 +204,7 @@ conf_pool_init(struct conf_pool *cp, struct string *name)
200204
cp->redis = CONF_UNSET_NUM;
201205
cp->tcpkeepalive = CONF_UNSET_NUM;
202206
cp->redis_db = CONF_UNSET_NUM;
207+
cp->redis_ignore_select = CONF_UNSET_NUM;
203208
cp->preconnect = CONF_UNSET_NUM;
204209
cp->auto_eject_hosts = CONF_UNSET_NUM;
205210
cp->server_connections = CONF_UNSET_NUM;
@@ -292,6 +297,7 @@ conf_pool_each_transform(void *elem, void *data)
292297
sp->timeout = cp->timeout;
293298
sp->backlog = cp->backlog;
294299
sp->redis_db = cp->redis_db;
300+
sp->redis_ignore_select = cp->redis_ignore_select ? 1 : 0;
295301

296302
sp->redis_auth = cp->redis_auth;
297303
sp->require_auth = cp->redis_auth.len > 0 ? 1 : 0;
@@ -1245,6 +1251,10 @@ conf_validate_pool(struct conf *cf, struct conf_pool *cp)
12451251
if (cp->redis_db == CONF_UNSET_NUM) {
12461252
cp->redis_db = CONF_DEFAULT_REDIS_DB;
12471253
}
1254+
1255+
if (cp->redis_ignore_select == CONF_UNSET_NUM) {
1256+
cp->redis_ignore_select = CONF_DEFAULT_REDIS_IGNORE_SELECT;
1257+
}
12481258

12491259
if (cp->preconnect == CONF_UNSET_NUM) {
12501260
cp->preconnect = CONF_DEFAULT_PRECONNECT;

src/nc_conf.h

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#define CONF_DEFAULT_CLIENT_CONNECTIONS 0
4949
#define CONF_DEFAULT_REDIS false
5050
#define CONF_DEFAULT_REDIS_DB 0
51+
#define CONF_DEFAULT_REDIS_IGNORE_SELECT false
5152
#define CONF_DEFAULT_PRECONNECT false
5253
#define CONF_DEFAULT_AUTO_EJECT_HOSTS false
5354
#define CONF_DEFAULT_SERVER_RETRY_TIMEOUT 30 * 1000 /* in msec */
@@ -88,6 +89,7 @@ struct conf_pool {
8889
int redis; /* redis: */
8990
struct string redis_auth; /* redis_auth: redis auth password (matches requirepass on redis) */
9091
int redis_db; /* redis_db: redis db */
92+
int redis_ignore_select; /* redis_ignore_select: whether to ignore selects and just reply ok */
9193
int preconnect; /* preconnect: */
9294
int auto_eject_hosts; /* auto_eject_hosts: */
9395
int server_connections; /* server_connections: */

src/nc_server.h

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ struct server_pool {
121121
unsigned preconnect:1; /* preconnect? */
122122
unsigned redis:1; /* redis? */
123123
unsigned tcpkeepalive:1; /* tcpkeepalive? */
124+
unsigned redis_ignore_select:1;/* redis ignore select? */
124125
};
125126

126127
void server_ref(struct conn *conn, void *owner);

src/proto/nc_redis.c

+15-2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ static bool
6262
redis_arg0(struct msg *r)
6363
{
6464
switch (r->type) {
65+
case MSG_REQ_REDIS_SELECT:
66+
6567
case MSG_REQ_REDIS_EXISTS:
6668
case MSG_REQ_REDIS_PERSIST:
6769
case MSG_REQ_REDIS_PTTL:
@@ -105,7 +107,7 @@ redis_arg0(struct msg *r)
105107
static bool
106108
redis_arg1(struct msg *r)
107109
{
108-
switch (r->type) {
110+
switch (r->type) {
109111
case MSG_REQ_REDIS_EXPIRE:
110112
case MSG_REQ_REDIS_EXPIREAT:
111113
case MSG_REQ_REDIS_PEXPIRE:
@@ -878,6 +880,12 @@ redis_parse_req(struct msg *r)
878880
r->type = MSG_REQ_REDIS_ZSCORE;
879881
break;
880882
}
883+
884+
if (str6icmp(m, 's', 'e', 'l', 'e', 'c', 't')) {
885+
r->type = MSG_REQ_REDIS_SELECT;
886+
r->noforward = 1;
887+
break;
888+
}
881889

882890
break;
883891

@@ -2682,6 +2690,7 @@ redis_reply(struct msg *r)
26822690
{
26832691
struct conn *c_conn;
26842692
struct msg *response = r->peer;
2693+
struct server_pool *pool;
26852694

26862695
ASSERT(response != NULL && response->owner != NULL);
26872696

@@ -2697,7 +2706,11 @@ redis_reply(struct msg *r)
26972706
switch (r->type) {
26982707
case MSG_REQ_REDIS_PING:
26992708
return msg_append(response, rsp_pong.data, rsp_pong.len);
2700-
2709+
case MSG_REQ_REDIS_SELECT:
2710+
pool = (struct server_pool *)c_conn->owner;
2711+
if (pool->redis_ignore_select) {
2712+
return msg_append(response, rsp_ok.data, rsp_ok.len);
2713+
}
27012714
default:
27022715
NOT_REACHED();
27032716
return NC_ERROR;

0 commit comments

Comments
 (0)