Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
ae22bf1e
Commit
ae22bf1e
authored
Mar 14, 2012
by
antirez
Browse files
Reclaim space from the client querybuf if needed.
parent
739803c0
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/aof.c
View file @
ae22bf1e
...
@@ -287,6 +287,7 @@ struct redisClient *createFakeClient(void) {
...
@@ -287,6 +287,7 @@ struct redisClient *createFakeClient(void) {
selectDb
(
c
,
0
);
selectDb
(
c
,
0
);
c
->
fd
=
-
1
;
c
->
fd
=
-
1
;
c
->
querybuf
=
sdsempty
();
c
->
querybuf
=
sdsempty
();
c
->
querybuf_peak
=
0
;
c
->
argc
=
0
;
c
->
argc
=
0
;
c
->
argv
=
NULL
;
c
->
argv
=
NULL
;
c
->
bufpos
=
0
;
c
->
bufpos
=
0
;
...
...
src/networking.c
View file @
ae22bf1e
...
@@ -43,6 +43,7 @@ redisClient *createClient(int fd) {
...
@@ -43,6 +43,7 @@ redisClient *createClient(int fd) {
c
->
fd
=
fd
;
c
->
fd
=
fd
;
c
->
bufpos
=
0
;
c
->
bufpos
=
0
;
c
->
querybuf
=
sdsempty
();
c
->
querybuf
=
sdsempty
();
c
->
querybuf_peak
=
0
;
c
->
reqtype
=
0
;
c
->
reqtype
=
0
;
c
->
argc
=
0
;
c
->
argc
=
0
;
c
->
argv
=
NULL
;
c
->
argv
=
NULL
;
...
@@ -998,6 +999,7 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -998,6 +999,7 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) {
}
}
qblen
=
sdslen
(
c
->
querybuf
);
qblen
=
sdslen
(
c
->
querybuf
);
if
(
c
->
querybuf_peak
<
qblen
)
c
->
querybuf_peak
=
qblen
;
c
->
querybuf
=
sdsMakeRoomFor
(
c
->
querybuf
,
readlen
);
c
->
querybuf
=
sdsMakeRoomFor
(
c
->
querybuf
,
readlen
);
nread
=
read
(
fd
,
c
->
querybuf
+
qblen
,
readlen
);
nread
=
read
(
fd
,
c
->
querybuf
+
qblen
,
readlen
);
if
(
nread
==
-
1
)
{
if
(
nread
==
-
1
)
{
...
...
src/redis.c
View file @
ae22bf1e
...
@@ -642,7 +642,7 @@ long long getOperationsPerSecond(void) {
...
@@ -642,7 +642,7 @@ long long getOperationsPerSecond(void) {
}
}
void
clientsCronHandleTimeout
(
redisClient
*
c
)
{
void
clientsCronHandleTimeout
(
redisClient
*
c
)
{
time_t
now
=
time
(
NULL
)
;
time_t
now
=
server
.
unixtime
;
if
(
server
.
maxidletime
&&
if
(
server
.
maxidletime
&&
!
(
c
->
flags
&
REDIS_SLAVE
)
&&
/* no timeout for slaves */
!
(
c
->
flags
&
REDIS_SLAVE
)
&&
/* no timeout for slaves */
...
@@ -662,15 +662,40 @@ void clientsCronHandleTimeout(redisClient *c) {
...
@@ -662,15 +662,40 @@ void clientsCronHandleTimeout(redisClient *c) {
}
}
}
}
/* The client query buffer is an sds.c string that can end with a lot of
* free space not used, this function reclaims space if needed. */
void
clientsCronResizeQueryBuffer
(
redisClient
*
c
)
{
size_t
querybuf_size
=
sdsAllocSize
(
c
->
querybuf
);
time_t
idletime
=
server
.
unixtime
-
c
->
lastinteraction
;
/* There are two conditions to resize the query buffer:
* 1) Query buffer is > BIG_ARG and too big for latest peak.
* 2) Client is inactive and the buffer is bigger than 1k. */
if
(((
querybuf_size
>
REDIS_MBULK_BIG_ARG
)
&&
(
querybuf_size
/
(
c
->
querybuf_peak
+
1
))
>
2
)
||
(
querybuf_size
>
1024
&&
idletime
>
2
))
{
/* Only resize the query buffer if it is actually wasting space. */
if
(
sdsavail
(
c
->
querybuf
)
>
1024
)
{
c
->
querybuf
=
sdsRemoveFreeSpace
(
c
->
querybuf
);
}
}
/* Reset the peak again to capture the peak memory usage in the next
* cycle. */
c
->
querybuf_peak
=
0
;
}
void
clientsCron
(
void
)
{
void
clientsCron
(
void
)
{
/* Make sure to process at least 1/100 of clients per call.
/* Make sure to process at least 1/100 of clients per call.
* Since this function is called 10 times per second we are sure that
* Since this function is called 10 times per second we are sure that
* in the worst case we process all the clients in 10 seconds.
* in the worst case we process all the clients in 10 seconds.
* In normal conditions (a reasonable number of clients) we process
* In normal conditions (a reasonable number of clients) we process
* all the clients in a shorter time. */
* all the clients in a shorter time. */
int
iteration
s
=
listLength
(
server
.
clients
)
/
100
;
int
numclient
s
=
listLength
(
server
.
clients
);
i
f
(
iterations
<
50
)
iterations
=
5
0
;
i
nt
iterations
=
numclients
/
10
0
;
if
(
iterations
<
50
)
iterations
=
(
numclients
<
50
)
?
numclients
:
50
;
while
(
listLength
(
server
.
clients
)
&&
iterations
--
)
{
while
(
listLength
(
server
.
clients
)
&&
iterations
--
)
{
redisClient
*
c
;
redisClient
*
c
;
listNode
*
head
;
listNode
*
head
;
...
@@ -682,6 +707,7 @@ void clientsCron(void) {
...
@@ -682,6 +707,7 @@ void clientsCron(void) {
head
=
listFirst
(
server
.
clients
);
head
=
listFirst
(
server
.
clients
);
c
=
listNodeValue
(
head
);
c
=
listNodeValue
(
head
);
clientsCronHandleTimeout
(
c
);
clientsCronHandleTimeout
(
c
);
clientsCronResizeQueryBuffer
(
c
);
}
}
}
}
...
...
src/redis.h
View file @
ae22bf1e
...
@@ -323,6 +323,7 @@ typedef struct redisClient {
...
@@ -323,6 +323,7 @@ typedef struct redisClient {
redisDb
*
db
;
redisDb
*
db
;
int
dictid
;
int
dictid
;
sds
querybuf
;
sds
querybuf
;
size_t
querybuf_peak
;
/* Recent (100ms or more) peak of querybuf size */
int
argc
;
int
argc
;
robj
**
argv
;
robj
**
argv
;
struct
redisCommand
*
cmd
,
*
lastcmd
;
struct
redisCommand
*
cmd
,
*
lastcmd
;
...
...
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