Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da30c9e1e3 | ||
|
|
3c51d3b36b | ||
|
|
00c7f312cc | ||
|
|
b10913b93d | ||
|
|
cbf01c0e01 | ||
|
|
214cf63730 | ||
|
|
4a4f4cb5ff | ||
|
|
a57bd791e9 | ||
|
|
ed9f997ce5 |
@@ -18,6 +18,19 @@ to modify your program in order to use Redis 2.4.
|
||||
CHANGELOG
|
||||
---------
|
||||
|
||||
What's new in Redis 2.3.10 (2.4 Release Candidate 7)
|
||||
====================================================
|
||||
|
||||
* [BUGFIX] Fixed issue 593 (BRPOPLPUSH related crash).
|
||||
* [BUGFIX] Fixed an issue with the networking layer that may prevent Redis from sending the whole reply back to client under extreme conditions.
|
||||
|
||||
What's new in Redis 2.3.9 (2.4 Release Candidate 6)
|
||||
===================================================
|
||||
|
||||
* [BUGFIX] Fixed a bug with the automatic AOF rewrite causing continuous
|
||||
rewrites for AOF files bigger than 4 GB.
|
||||
* New maxmemory tests.
|
||||
|
||||
What's new in Redis 2.3.8 (2.4 Release Candidate 5)
|
||||
===================================================
|
||||
|
||||
|
||||
@@ -616,7 +616,7 @@ void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask) {
|
||||
}
|
||||
}
|
||||
if (totwritten > 0) c->lastinteraction = time(NULL);
|
||||
if (listLength(c->reply) == 0) {
|
||||
if (c->bufpos == 0 && listLength(c->reply) == 0) {
|
||||
c->sentlen = 0;
|
||||
aeDeleteFileEvent(server.el,c->fd,AE_WRITABLE);
|
||||
|
||||
|
||||
@@ -635,7 +635,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
|
||||
server.auto_aofrewrite_perc &&
|
||||
server.appendonly_current_size > server.auto_aofrewrite_min_size)
|
||||
{
|
||||
int base = server.auto_aofrewrite_base_size ?
|
||||
long long base = server.auto_aofrewrite_base_size ?
|
||||
server.auto_aofrewrite_base_size : 1;
|
||||
long long growth = (server.appendonly_current_size*100/base) - 100;
|
||||
if (growth >= server.auto_aofrewrite_perc) {
|
||||
|
||||
10
src/t_list.c
10
src/t_list.c
@@ -643,7 +643,7 @@ void lremCommand(redisClient *c) {
|
||||
void rpoplpushHandlePush(redisClient *origclient, redisClient *c, robj *dstkey, robj *dstobj, robj *value) {
|
||||
robj *aux;
|
||||
|
||||
if (!handleClientsWaitingListPush(c,dstkey,value)) {
|
||||
if (!handleClientsWaitingListPush(origclient,dstkey,value)) {
|
||||
/* Create the list if the key does not exist */
|
||||
if (!dstobj) {
|
||||
dstobj = createZiplistObject();
|
||||
@@ -653,10 +653,12 @@ void rpoplpushHandlePush(redisClient *origclient, redisClient *c, robj *dstkey,
|
||||
}
|
||||
listTypePush(dstobj,value,REDIS_HEAD);
|
||||
/* If we are pushing as a result of LPUSH against a key
|
||||
* watched by BLPOPLPUSH, we need to rewrite the command vector.
|
||||
* But if this is called directly by RPOPLPUSH (either directly
|
||||
* watched by BRPOPLPUSH, we need to rewrite the command vector
|
||||
* as an LPUSH.
|
||||
*
|
||||
* If this is called directly by RPOPLPUSH (either directly
|
||||
* or via a BRPOPLPUSH where the popped list exists)
|
||||
* we should replicate the BRPOPLPUSH command itself. */
|
||||
* we should replicate the RPOPLPUSH command itself. */
|
||||
if (c != origclient) {
|
||||
aux = createStringObject("LPUSH",5);
|
||||
rewriteClientCommandVector(origclient,3,aux,dstkey,value);
|
||||
|
||||
@@ -1 +1 @@
|
||||
#define REDIS_VERSION "2.3.8"
|
||||
#define REDIS_VERSION "2.3.10"
|
||||
|
||||
@@ -5,7 +5,7 @@ set ::tests_failed {}
|
||||
|
||||
proc assert {condition} {
|
||||
if {![uplevel 1 expr $condition]} {
|
||||
error "assertion:Expected '$value' to be true"
|
||||
error "assertion:Expected condition '$condition' to be true"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ set ::all_tests {
|
||||
integration/aof
|
||||
unit/pubsub
|
||||
unit/slowlog
|
||||
unit/maxmemory
|
||||
}
|
||||
# Index to the next test to run in the ::all_tests list.
|
||||
set ::next_test 0
|
||||
|
||||
120
tests/unit/maxmemory.tcl
Normal file
120
tests/unit/maxmemory.tcl
Normal file
@@ -0,0 +1,120 @@
|
||||
start_server {tags {"maxmemory"}} {
|
||||
foreach policy {
|
||||
allkeys-random allkeys-lru volatile-lru volatile-random volatile-ttl
|
||||
} {
|
||||
test "maxmemory - is the memory limit honoured? (policy $policy)" {
|
||||
# make sure to start with a blank instance
|
||||
r flushall
|
||||
# Get the current memory limit and calculate a new limit.
|
||||
# We just add 100k to the current memory size so that it is
|
||||
# fast for us to reach that limit.
|
||||
set used [s used_memory]
|
||||
set limit [expr {$used+100*1024}]
|
||||
r config set maxmemory $limit
|
||||
r config set maxmemory-policy $policy
|
||||
# Now add keys until the limit is almost reached.
|
||||
set numkeys 0
|
||||
while 1 {
|
||||
r setex [randomKey] 10000 x
|
||||
incr numkeys
|
||||
if {[s used_memory]+4096 > $limit} {
|
||||
assert {$numkeys > 10}
|
||||
break
|
||||
}
|
||||
}
|
||||
# If we add the same number of keys already added again, we
|
||||
# should still be under the limit.
|
||||
for {set j 0} {$j < $numkeys} {incr j} {
|
||||
r setex [randomKey] 10000 x
|
||||
}
|
||||
assert {[s used_memory] < ($limit+4096)}
|
||||
}
|
||||
}
|
||||
|
||||
foreach policy {
|
||||
allkeys-random allkeys-lru volatile-lru volatile-random volatile-ttl
|
||||
} {
|
||||
test "maxmemory - only allkeys-* should remove non-volatile keys ($policy)" {
|
||||
# make sure to start with a blank instance
|
||||
r flushall
|
||||
# Get the current memory limit and calculate a new limit.
|
||||
# We just add 100k to the current memory size so that it is
|
||||
# fast for us to reach that limit.
|
||||
set used [s used_memory]
|
||||
set limit [expr {$used+100*1024}]
|
||||
r config set maxmemory $limit
|
||||
r config set maxmemory-policy $policy
|
||||
# Now add keys until the limit is almost reached.
|
||||
set numkeys 0
|
||||
while 1 {
|
||||
r set [randomKey] x
|
||||
incr numkeys
|
||||
if {[s used_memory]+4096 > $limit} {
|
||||
assert {$numkeys > 10}
|
||||
break
|
||||
}
|
||||
}
|
||||
# If we add the same number of keys already added again and
|
||||
# the policy is allkeys-* we should still be under the limit.
|
||||
# Otherwise we should see an error reported by Redis.
|
||||
set err 0
|
||||
for {set j 0} {$j < $numkeys} {incr j} {
|
||||
if {[catch {r set [randomKey] x} e]} {
|
||||
if {[string match {*used memory*} $e]} {
|
||||
set err 1
|
||||
}
|
||||
}
|
||||
}
|
||||
if {[string match allkeys-* $policy]} {
|
||||
assert {[s used_memory] < ($limit+4096)}
|
||||
} else {
|
||||
assert {$err == 1}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach policy {
|
||||
volatile-lru volatile-random volatile-ttl
|
||||
} {
|
||||
test "maxmemory - policy $policy should only remove volatile keys." {
|
||||
# make sure to start with a blank instance
|
||||
r flushall
|
||||
# Get the current memory limit and calculate a new limit.
|
||||
# We just add 100k to the current memory size so that it is
|
||||
# fast for us to reach that limit.
|
||||
set used [s used_memory]
|
||||
set limit [expr {$used+100*1024}]
|
||||
r config set maxmemory $limit
|
||||
r config set maxmemory-policy $policy
|
||||
# Now add keys until the limit is almost reached.
|
||||
set numkeys 0
|
||||
while 1 {
|
||||
# Odd keys are volatile
|
||||
# Even keys are non volatile
|
||||
if {$numkeys % 2} {
|
||||
r setex "key:$numkeys" 10000 x
|
||||
} else {
|
||||
r set "key:$numkeys" x
|
||||
}
|
||||
if {[s used_memory]+4096 > $limit} {
|
||||
assert {$numkeys > 10}
|
||||
break
|
||||
}
|
||||
incr numkeys
|
||||
}
|
||||
# Now we add the same number of volatile keys already added.
|
||||
# We expect Redis to evict only volatile keys in order to make
|
||||
# space.
|
||||
set err 0
|
||||
for {set j 0} {$j < $numkeys} {incr j} {
|
||||
catch {r setex "foo:$j" 10000 x}
|
||||
}
|
||||
# We should still be under the limit.
|
||||
assert {[s used_memory] < ($limit+4096)}
|
||||
# However all our non volatile keys should be here.
|
||||
for {set j 0} {$j < $numkeys} {incr j 2} {
|
||||
assert {[r exists "key:$j"]}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -728,4 +728,18 @@ start_server {
|
||||
assert_equal 3 [r llen myotherlist]
|
||||
}
|
||||
}
|
||||
|
||||
test "Regression for bug 593 - chaining BRPOPLPUSH with other blocking cmds" {
|
||||
set rd1 [redis_deferring_client]
|
||||
set rd2 [redis_deferring_client]
|
||||
|
||||
$rd1 brpoplpush a b 0
|
||||
$rd1 brpoplpush a b 0
|
||||
$rd2 brpoplpush b c 0
|
||||
after 1000
|
||||
r lpush a data
|
||||
$rd1 close
|
||||
$rd2 close
|
||||
r ping
|
||||
} {PONG}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user