diff --git a/src/networking.c b/src/networking.c index fa3e5ccc..99e61de3 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 ca4fd7d1..18e02fd0 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 4d987d87..d16933d5 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;