Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
8ff13537
Commit
8ff13537
authored
Jan 17, 2011
by
Pieter Noordhuis
Browse files
Merge branch '2.2' of
git://github.com/antirez/redis
into 2.2
parents
7ac1b364
99677e89
Changes
7
Show whitespace changes
Inline
Side-by-side
redis.conf
View file @
8ff13537
...
@@ -369,8 +369,8 @@ vm-max-threads 4
...
@@ -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
...
...
src/db.c
View file @
8ff13537
...
@@ -453,6 +453,8 @@ void propagateExpire(redisDb *db, robj *key) {
...
@@ -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) {
...
@@ -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
;
...
...
src/networking.c
View file @
8ff13537
...
@@ -821,3 +821,22 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -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
;
}
src/redis.c
View file @
8ff13537
...
@@ -1141,9 +1141,11 @@ sds genRedisInfoString(void) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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
;
...
...
src/redis.h
View file @
8ff13537
...
@@ -189,8 +189,8 @@
...
@@ -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);
...
@@ -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
,
...)
...
...
src/zmalloc.c
View file @
8ff13537
...
@@ -33,6 +33,7 @@
...
@@ -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 @@
...
@@ -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 @@
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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
;
}
}
...
...
src/zmalloc.h
View file @
8ff13537
...
@@ -40,5 +40,8 @@ size_t zmalloc_used_memory(void);
...
@@ -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 */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment