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
9fa9ccb0
Commit
9fa9ccb0
authored
Mar 14, 2012
by
antirez
Browse files
Reclaim space from the client querybuf if needed.
parent
6934832e
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/aof.c
View file @
9fa9ccb0
...
...
@@ -287,6 +287,7 @@ struct redisClient *createFakeClient(void) {
selectDb
(
c
,
0
);
c
->
fd
=
-
1
;
c
->
querybuf
=
sdsempty
();
c
->
querybuf_peak
=
0
;
c
->
argc
=
0
;
c
->
argv
=
NULL
;
c
->
bufpos
=
0
;
...
...
src/networking.c
View file @
9fa9ccb0
...
...
@@ -43,6 +43,7 @@ redisClient *createClient(int fd) {
c
->
fd
=
fd
;
c
->
bufpos
=
0
;
c
->
querybuf
=
sdsempty
();
c
->
querybuf_peak
=
0
;
c
->
reqtype
=
0
;
c
->
argc
=
0
;
c
->
argv
=
NULL
;
...
...
@@ -998,6 +999,7 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) {
}
qblen
=
sdslen
(
c
->
querybuf
);
if
(
c
->
querybuf_peak
<
qblen
)
c
->
querybuf_peak
=
qblen
;
c
->
querybuf
=
sdsMakeRoomFor
(
c
->
querybuf
,
readlen
);
nread
=
read
(
fd
,
c
->
querybuf
+
qblen
,
readlen
);
if
(
nread
==
-
1
)
{
...
...
src/redis.c
View file @
9fa9ccb0
...
...
@@ -629,7 +629,7 @@ long long getOperationsPerSecond(void) {
}
void
clientsCronHandleTimeout
(
redisClient
*
c
)
{
time_t
now
=
time
(
NULL
)
;
time_t
now
=
server
.
unixtime
;
if
(
server
.
maxidletime
&&
!
(
c
->
flags
&
REDIS_SLAVE
)
&&
/* no timeout for slaves */
...
...
@@ -649,15 +649,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
)
{
/* 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
* in the worst case we process all the clients in 10 seconds.
* In normal conditions (a reasonable number of clients) we process
* all the clients in a shorter time. */
int
iteration
s
=
listLength
(
server
.
clients
)
/
100
;
i
f
(
iterations
<
50
)
iterations
=
5
0
;
int
numclient
s
=
listLength
(
server
.
clients
);
i
nt
iterations
=
numclients
/
10
0
;
if
(
iterations
<
50
)
iterations
=
(
numclients
<
50
)
?
numclients
:
50
;
while
(
listLength
(
server
.
clients
)
&&
iterations
--
)
{
redisClient
*
c
;
listNode
*
head
;
...
...
@@ -669,6 +694,7 @@ void clientsCron(void) {
head
=
listFirst
(
server
.
clients
);
c
=
listNodeValue
(
head
);
clientsCronHandleTimeout
(
c
);
clientsCronResizeQueryBuffer
(
c
);
}
}
...
...
src/redis.h
View file @
9fa9ccb0
...
...
@@ -323,6 +323,7 @@ typedef struct redisClient {
redisDb
*
db
;
int
dictid
;
sds
querybuf
;
size_t
querybuf_peak
;
/* Recent (100ms or more) peak of querybuf size */
int
argc
;
robj
**
argv
;
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