mirror of
https://github.com/fluencelabs/redis
synced 2025-05-22 15:11:20 +00:00
Merge branch '2.2' of git://github.com/antirez/redis into 2.2
This commit is contained in:
commit
8ff1353766
@ -369,8 +369,8 @@ vm-max-threads 4
|
|||||||
# have at max a given numer of elements, and the biggest element does not
|
# have at max a given numer of elements, and the biggest element does not
|
||||||
# exceed a given threshold. You can configure this limits with the following
|
# exceed a given threshold. You can configure this limits with the following
|
||||||
# configuration directives.
|
# configuration directives.
|
||||||
hash-max-zipmap-entries 64
|
hash-max-zipmap-entries 512
|
||||||
hash-max-zipmap-value 512
|
hash-max-zipmap-value 64
|
||||||
|
|
||||||
# Similarly to hashes, small lists are also encoded in a special way in order
|
# Similarly to hashes, small lists are also encoded in a special way in order
|
||||||
# to save a lot of space. The special representation is only used when
|
# to save a lot of space. The special representation is only used when
|
||||||
|
4
src/db.c
4
src/db.c
@ -453,6 +453,8 @@ void propagateExpire(redisDb *db, robj *key) {
|
|||||||
int expireIfNeeded(redisDb *db, robj *key) {
|
int expireIfNeeded(redisDb *db, robj *key) {
|
||||||
time_t when = getExpire(db,key);
|
time_t when = getExpire(db,key);
|
||||||
|
|
||||||
|
if (when < 0) return 0; /* No expire for this key */
|
||||||
|
|
||||||
/* If we are running in the context of a slave, return ASAP:
|
/* If we are running in the context of a slave, return ASAP:
|
||||||
* the slave key expiration is controlled by the master that will
|
* the slave key expiration is controlled by the master that will
|
||||||
* send us synthesized DEL operations for expired keys.
|
* send us synthesized DEL operations for expired keys.
|
||||||
@ -464,8 +466,6 @@ int expireIfNeeded(redisDb *db, robj *key) {
|
|||||||
return time(NULL) > when;
|
return time(NULL) > when;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (when < 0) return 0;
|
|
||||||
|
|
||||||
/* Return when this key has not expired */
|
/* Return when this key has not expired */
|
||||||
if (time(NULL) <= when) return 0;
|
if (time(NULL) <= when) return 0;
|
||||||
|
|
||||||
|
@ -821,3 +821,22 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) {
|
|||||||
}
|
}
|
||||||
processInputBuffer(c);
|
processInputBuffer(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getClientsMaxBuffers(unsigned long *longest_output_list,
|
||||||
|
unsigned long *biggest_input_buffer) {
|
||||||
|
redisClient *c;
|
||||||
|
listNode *ln;
|
||||||
|
listIter li;
|
||||||
|
unsigned long lol = 0, bib = 0;
|
||||||
|
|
||||||
|
listRewind(server.clients,&li);
|
||||||
|
while ((ln = listNext(&li)) != NULL) {
|
||||||
|
c = listNodeValue(ln);
|
||||||
|
|
||||||
|
if (listLength(c->reply) > lol) lol = listLength(c->reply);
|
||||||
|
if (sdslen(c->querybuf) > bib) bib = sdslen(c->querybuf);
|
||||||
|
}
|
||||||
|
*longest_output_list = lol;
|
||||||
|
*biggest_input_buffer = bib;
|
||||||
|
}
|
||||||
|
|
||||||
|
18
src/redis.c
18
src/redis.c
@ -1141,9 +1141,11 @@ sds genRedisInfoString(void) {
|
|||||||
int j;
|
int j;
|
||||||
char hmem[64];
|
char hmem[64];
|
||||||
struct rusage self_ru, c_ru;
|
struct rusage self_ru, c_ru;
|
||||||
|
unsigned long lol, bib;
|
||||||
|
|
||||||
getrusage(RUSAGE_SELF, &self_ru);
|
getrusage(RUSAGE_SELF, &self_ru);
|
||||||
getrusage(RUSAGE_CHILDREN, &c_ru);
|
getrusage(RUSAGE_CHILDREN, &c_ru);
|
||||||
|
getClientsMaxBuffers(&lol,&bib);
|
||||||
|
|
||||||
bytesToHuman(hmem,zmalloc_used_memory());
|
bytesToHuman(hmem,zmalloc_used_memory());
|
||||||
info = sdscatprintf(sdsempty(),
|
info = sdscatprintf(sdsempty(),
|
||||||
@ -1162,6 +1164,8 @@ sds genRedisInfoString(void) {
|
|||||||
"used_cpu_user_childrens:%.2f\r\n"
|
"used_cpu_user_childrens:%.2f\r\n"
|
||||||
"connected_clients:%d\r\n"
|
"connected_clients:%d\r\n"
|
||||||
"connected_slaves:%d\r\n"
|
"connected_slaves:%d\r\n"
|
||||||
|
"client_longest_output_list:%lu\r\n"
|
||||||
|
"client_biggest_input_buf:%lu\r\n"
|
||||||
"blocked_clients:%d\r\n"
|
"blocked_clients:%d\r\n"
|
||||||
"used_memory:%zu\r\n"
|
"used_memory:%zu\r\n"
|
||||||
"used_memory_human:%s\r\n"
|
"used_memory_human:%s\r\n"
|
||||||
@ -1201,6 +1205,7 @@ sds genRedisInfoString(void) {
|
|||||||
(float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000,
|
(float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000,
|
||||||
listLength(server.clients)-listLength(server.slaves),
|
listLength(server.clients)-listLength(server.slaves),
|
||||||
listLength(server.slaves),
|
listLength(server.slaves),
|
||||||
|
lol, bib,
|
||||||
server.bpop_blocked_clients,
|
server.bpop_blocked_clients,
|
||||||
zmalloc_used_memory(),
|
zmalloc_used_memory(),
|
||||||
hmem,
|
hmem,
|
||||||
@ -1313,6 +1318,19 @@ sds genRedisInfoString(void) {
|
|||||||
eta
|
eta
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info = sdscat(info,"allocation_stats:");
|
||||||
|
for (j = 0; j <= ZMALLOC_MAX_ALLOC_STAT; j++) {
|
||||||
|
size_t count = zmalloc_allocations_for_size(j);
|
||||||
|
if (count) {
|
||||||
|
if (info[sdslen(info)-1] != ':') info = sdscatlen(info,",",1);
|
||||||
|
info = sdscatprintf(info,"%s%d=%zu",
|
||||||
|
(j == ZMALLOC_MAX_ALLOC_STAT) ? ">=" : "",
|
||||||
|
j,count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info = sdscat(info,"\r\n");
|
||||||
|
|
||||||
for (j = 0; j < server.dbnum; j++) {
|
for (j = 0; j < server.dbnum; j++) {
|
||||||
long long keys, vkeys;
|
long long keys, vkeys;
|
||||||
|
|
||||||
|
@ -189,8 +189,8 @@
|
|||||||
#define APPENDFSYNC_EVERYSEC 2
|
#define APPENDFSYNC_EVERYSEC 2
|
||||||
|
|
||||||
/* Zip structure related defaults */
|
/* Zip structure related defaults */
|
||||||
#define REDIS_HASH_MAX_ZIPMAP_ENTRIES 64
|
#define REDIS_HASH_MAX_ZIPMAP_ENTRIES 512
|
||||||
#define REDIS_HASH_MAX_ZIPMAP_VALUE 512
|
#define REDIS_HASH_MAX_ZIPMAP_VALUE 64
|
||||||
#define REDIS_LIST_MAX_ZIPLIST_ENTRIES 512
|
#define REDIS_LIST_MAX_ZIPLIST_ENTRIES 512
|
||||||
#define REDIS_LIST_MAX_ZIPLIST_VALUE 64
|
#define REDIS_LIST_MAX_ZIPLIST_VALUE 64
|
||||||
#define REDIS_SET_MAX_INTSET_ENTRIES 512
|
#define REDIS_SET_MAX_INTSET_ENTRIES 512
|
||||||
@ -656,6 +656,8 @@ void addReplyDouble(redisClient *c, double d);
|
|||||||
void addReplyLongLong(redisClient *c, long long ll);
|
void addReplyLongLong(redisClient *c, long long ll);
|
||||||
void addReplyMultiBulkLen(redisClient *c, long length);
|
void addReplyMultiBulkLen(redisClient *c, long length);
|
||||||
void *dupClientReplyValue(void *o);
|
void *dupClientReplyValue(void *o);
|
||||||
|
void getClientsMaxBuffers(unsigned long *longest_output_list,
|
||||||
|
unsigned long *biggest_input_buffer);
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
void addReplyErrorFormat(redisClient *c, const char *fmt, ...)
|
void addReplyErrorFormat(redisClient *c, const char *fmt, ...)
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "zmalloc.h"
|
||||||
|
|
||||||
#ifdef HAVE_MALLOC_SIZE
|
#ifdef HAVE_MALLOC_SIZE
|
||||||
#define PREFIX_SIZE (0)
|
#define PREFIX_SIZE (0)
|
||||||
@ -52,19 +53,22 @@
|
|||||||
#define free(ptr) tc_free(ptr)
|
#define free(ptr) tc_free(ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define increment_used_memory(__n) do { \
|
#define update_zmalloc_stat_alloc(__n,__size) do { \
|
||||||
size_t _n = (__n); \
|
size_t _n = (__n); \
|
||||||
|
size_t _stat_slot = (__size < ZMALLOC_MAX_ALLOC_STAT) ? __size : ZMALLOC_MAX_ALLOC_STAT; \
|
||||||
if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
|
if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
|
||||||
if (zmalloc_thread_safe) { \
|
if (zmalloc_thread_safe) { \
|
||||||
pthread_mutex_lock(&used_memory_mutex); \
|
pthread_mutex_lock(&used_memory_mutex); \
|
||||||
used_memory += _n; \
|
used_memory += _n; \
|
||||||
|
zmalloc_allocations[_stat_slot]++; \
|
||||||
pthread_mutex_unlock(&used_memory_mutex); \
|
pthread_mutex_unlock(&used_memory_mutex); \
|
||||||
} else { \
|
} else { \
|
||||||
used_memory += _n; \
|
used_memory += _n; \
|
||||||
|
zmalloc_allocations[_stat_slot]++; \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define decrement_used_memory(__n) do { \
|
#define update_zmalloc_stat_free(__n) do { \
|
||||||
size_t _n = (__n); \
|
size_t _n = (__n); \
|
||||||
if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
|
if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
|
||||||
if (zmalloc_thread_safe) { \
|
if (zmalloc_thread_safe) { \
|
||||||
@ -79,6 +83,8 @@
|
|||||||
static size_t used_memory = 0;
|
static size_t used_memory = 0;
|
||||||
static int zmalloc_thread_safe = 0;
|
static int zmalloc_thread_safe = 0;
|
||||||
pthread_mutex_t used_memory_mutex = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t used_memory_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
/* Note that malloc_allocations elements are initialized to zero by C */
|
||||||
|
size_t zmalloc_allocations[ZMALLOC_MAX_ALLOC_STAT+1];
|
||||||
|
|
||||||
static void zmalloc_oom(size_t size) {
|
static void zmalloc_oom(size_t size) {
|
||||||
fprintf(stderr, "zmalloc: Out of memory trying to allocate %zu bytes\n",
|
fprintf(stderr, "zmalloc: Out of memory trying to allocate %zu bytes\n",
|
||||||
@ -92,11 +98,11 @@ void *zmalloc(size_t size) {
|
|||||||
|
|
||||||
if (!ptr) zmalloc_oom(size);
|
if (!ptr) zmalloc_oom(size);
|
||||||
#ifdef HAVE_MALLOC_SIZE
|
#ifdef HAVE_MALLOC_SIZE
|
||||||
increment_used_memory(redis_malloc_size(ptr));
|
update_zmalloc_stat_alloc(redis_malloc_size(ptr),size);
|
||||||
return ptr;
|
return ptr;
|
||||||
#else
|
#else
|
||||||
*((size_t*)ptr) = size;
|
*((size_t*)ptr) = size;
|
||||||
increment_used_memory(size+PREFIX_SIZE);
|
update_zmalloc_stat_alloc(size+PREFIX_SIZE,size);
|
||||||
return (char*)ptr+PREFIX_SIZE;
|
return (char*)ptr+PREFIX_SIZE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -106,11 +112,11 @@ void *zcalloc(size_t size) {
|
|||||||
|
|
||||||
if (!ptr) zmalloc_oom(size);
|
if (!ptr) zmalloc_oom(size);
|
||||||
#ifdef HAVE_MALLOC_SIZE
|
#ifdef HAVE_MALLOC_SIZE
|
||||||
increment_used_memory(redis_malloc_size(ptr));
|
update_zmalloc_stat_alloc(redis_malloc_size(ptr),size);
|
||||||
return ptr;
|
return ptr;
|
||||||
#else
|
#else
|
||||||
*((size_t*)ptr) = size;
|
*((size_t*)ptr) = size;
|
||||||
increment_used_memory(size+PREFIX_SIZE);
|
update_zmalloc_stat_alloc(size+PREFIX_SIZE,size);
|
||||||
return (char*)ptr+PREFIX_SIZE;
|
return (char*)ptr+PREFIX_SIZE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -128,8 +134,8 @@ void *zrealloc(void *ptr, size_t size) {
|
|||||||
newptr = realloc(ptr,size);
|
newptr = realloc(ptr,size);
|
||||||
if (!newptr) zmalloc_oom(size);
|
if (!newptr) zmalloc_oom(size);
|
||||||
|
|
||||||
decrement_used_memory(oldsize);
|
update_zmalloc_stat_free(oldsize);
|
||||||
increment_used_memory(redis_malloc_size(newptr));
|
update_zmalloc_stat_alloc(redis_malloc_size(newptr),size);
|
||||||
return newptr;
|
return newptr;
|
||||||
#else
|
#else
|
||||||
realptr = (char*)ptr-PREFIX_SIZE;
|
realptr = (char*)ptr-PREFIX_SIZE;
|
||||||
@ -138,8 +144,8 @@ void *zrealloc(void *ptr, size_t size) {
|
|||||||
if (!newptr) zmalloc_oom(size);
|
if (!newptr) zmalloc_oom(size);
|
||||||
|
|
||||||
*((size_t*)newptr) = size;
|
*((size_t*)newptr) = size;
|
||||||
decrement_used_memory(oldsize);
|
update_zmalloc_stat_free(oldsize);
|
||||||
increment_used_memory(size);
|
update_zmalloc_stat_alloc(size,size);
|
||||||
return (char*)newptr+PREFIX_SIZE;
|
return (char*)newptr+PREFIX_SIZE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -152,12 +158,12 @@ void zfree(void *ptr) {
|
|||||||
|
|
||||||
if (ptr == NULL) return;
|
if (ptr == NULL) return;
|
||||||
#ifdef HAVE_MALLOC_SIZE
|
#ifdef HAVE_MALLOC_SIZE
|
||||||
decrement_used_memory(redis_malloc_size(ptr));
|
update_zmalloc_stat_free(redis_malloc_size(ptr));
|
||||||
free(ptr);
|
free(ptr);
|
||||||
#else
|
#else
|
||||||
realptr = (char*)ptr-PREFIX_SIZE;
|
realptr = (char*)ptr-PREFIX_SIZE;
|
||||||
oldsize = *((size_t*)realptr);
|
oldsize = *((size_t*)realptr);
|
||||||
decrement_used_memory(oldsize+PREFIX_SIZE);
|
update_zmalloc_stat_free(oldsize+PREFIX_SIZE);
|
||||||
free(realptr);
|
free(realptr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -179,6 +185,11 @@ size_t zmalloc_used_memory(void) {
|
|||||||
return um;
|
return um;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t zmalloc_allocations_for_size(size_t size) {
|
||||||
|
if (size > ZMALLOC_MAX_ALLOC_STAT) return 0;
|
||||||
|
return zmalloc_allocations[size];
|
||||||
|
}
|
||||||
|
|
||||||
void zmalloc_enable_thread_safeness(void) {
|
void zmalloc_enable_thread_safeness(void) {
|
||||||
zmalloc_thread_safe = 1;
|
zmalloc_thread_safe = 1;
|
||||||
}
|
}
|
||||||
|
@ -40,5 +40,8 @@ size_t zmalloc_used_memory(void);
|
|||||||
void zmalloc_enable_thread_safeness(void);
|
void zmalloc_enable_thread_safeness(void);
|
||||||
float zmalloc_get_fragmentation_ratio(void);
|
float zmalloc_get_fragmentation_ratio(void);
|
||||||
size_t zmalloc_get_rss(void);
|
size_t zmalloc_get_rss(void);
|
||||||
|
size_t zmalloc_allocations_for_size(size_t size);
|
||||||
|
|
||||||
|
#define ZMALLOC_MAX_ALLOC_STAT 256
|
||||||
|
|
||||||
#endif /* _ZMALLOC_H */
|
#endif /* _ZMALLOC_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user