summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-06-16 14:22:55 +0200
committerantirez <antirez@gmail.com>2014-06-16 14:22:55 +0200
commitf26f79ea3725a37cefad7ad5dd6353b1a92ad8e3 (patch)
tree184806a0430caae8f2e5b8ff2954a2972f008793
parent56d26c23801b53458dfe8ac614106a9ab71473f1 (diff)
downloadredis-f26f79ea3725a37cefad7ad5dd6353b1a92ad8e3.tar.gz
Assign an unique non-repeating ID to each new client.
This will be used by CLIENT KILL and is also a good way to ensure a given client is still the same across CLIENT LIST calls. The output of CLIENT LIST was modified to include the new ID, but this change is considered to be backward compatible as the API does not imply you can do positional parsing, since each filed as a different name.
-rw-r--r--src/networking.c4
-rw-r--r--src/redis.c1
-rw-r--r--src/redis.h2
3 files changed, 6 insertions, 1 deletions
diff --git a/src/networking.c b/src/networking.c
index fa3e5ccce..99e61de33 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -83,6 +83,7 @@ redisClient *createClient(int fd) {
}
selectDb(c,0);
+ c->id = server.next_client_id++;
c->fd = fd;
c->name = NULL;
c->bufpos = 0;
@@ -1302,7 +1303,8 @@ sds catClientInfoString(sds s, redisClient *client) {
if (emask & AE_WRITABLE) *p++ = 'w';
*p = '\0';
return sdscatfmt(s,
- "addr=%s fd=%i name=%s age=%I idle=%I flags=%s db=%i sub=%i psub=%i multi=%i qbuf=%U qbuf-free=%U obl=%U oll=%U omem=%U events=%s cmd=%s",
+ "id=%U addr=%s fd=%i name=%s age=%I idle=%I flags=%s db=%i sub=%i psub=%i multi=%i qbuf=%U qbuf-free=%U obl=%U oll=%U omem=%U events=%s cmd=%s",
+ (unsigned long long) client->id,
getClientPeerId(client),
client->fd,
client->name ? (char*)client->name->ptr : "",
diff --git a/src/redis.c b/src/redis.c
index ca4fd7d1a..18e02fd01 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -1451,6 +1451,7 @@ void initServerConfig() {
server.lua_client = NULL;
server.lua_timedout = 0;
server.migrate_cached_sockets = dictCreate(&migrateCacheDictType,NULL);
+ server.next_client_id = 1; /* Client IDs, start from 1 .*/
server.loading_process_events_interval_bytes = (1024*1024*2);
server.lruclock = getLRUClock();
diff --git a/src/redis.h b/src/redis.h
index 4d987d879..d16933d59 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -492,6 +492,7 @@ typedef struct readyList {
/* With multiplexing we need to take per-client state.
* Clients are taken in a liked list. */
typedef struct redisClient {
+ uint64_t id; /* Client incremental unique ID. */
int fd;
redisDb *db;
int dictid;
@@ -655,6 +656,7 @@ struct redisServer {
mstime_t clients_pause_end_time; /* Time when we undo clients_paused */
char neterr[ANET_ERR_LEN]; /* Error buffer for anet.c */
dict *migrate_cached_sockets;/* MIGRATE cached sockets */
+ uint64_t next_client_id; /* Next client unique ID. Incremental. */
/* RDB / AOF loading information */
int loading; /* We are loading data from disk if true */
off_t loading_total_bytes;