Merge branch '2.2' of github.com:antirez/redis into 2.2

This commit is contained in:
antirez 2011-05-07 12:10:47 +02:00
commit 3554f09ddc
4 changed files with 54 additions and 36 deletions

View File

@ -12,6 +12,15 @@ for 2.0.
CHANGELOG CHANGELOG
--------- ---------
What's new in Redis 2.2.6
=========================
* Fixed bug #543. If you saw Redis instances crashing on List operations
(only happening with a non-default max entry size ziplist setting in
redis.conf) it was almost certainly this problem.
* Fixed a bug with replication where SLAVEOF NO ONE caused a slave to close the
connection with all its slaves.
What's new in Redis 2.2.5 What's new in Redis 2.2.5
========================= =========================

View File

@ -523,10 +523,16 @@ void freeClient(redisClient *c) {
* close the connection with all our slaves if we have any, so * close the connection with all our slaves if we have any, so
* when we'll resync with the master the other slaves will sync again * when we'll resync with the master the other slaves will sync again
* with us as well. Note that also when the slave is not connected * with us as well. Note that also when the slave is not connected
* to the master it will keep refusing connections by other slaves. */ * to the master it will keep refusing connections by other slaves.
while (listLength(server.slaves)) { *
ln = listFirst(server.slaves); * We do this only if server.masterhost != NULL. If it is NULL this
freeClient((redisClient*)ln->value); * means the user called SLAVEOF NO ONE and we are freeing our
* link with the master, so no need to close link with slaves. */
if (server.masterhost != NULL) {
while (listLength(server.slaves)) {
ln = listFirst(server.slaves);
freeClient((redisClient*)ln->value);
}
} }
} }
/* Release memory */ /* Release memory */

View File

@ -1 +1 @@
#define REDIS_VERSION "2.2.5" #define REDIS_VERSION "2.2.6"

View File

@ -398,12 +398,17 @@ static unsigned char *__ziplistCascadeUpdate(unsigned char *zl, unsigned char *p
offset = p-zl; offset = p-zl;
extra = rawlensize-next.prevrawlensize; extra = rawlensize-next.prevrawlensize;
zl = ziplistResize(zl,curlen+extra); zl = ziplistResize(zl,curlen+extra);
ZIPLIST_TAIL_OFFSET(zl) += extra;
p = zl+offset; p = zl+offset;
/* Move the tail to the back. */ /* Current pointer and offset for next element. */
np = p+rawlen; np = p+rawlen;
noffset = np-zl; noffset = np-zl;
/* Update tail offset when next element is not the tail element. */
if ((zl+ZIPLIST_TAIL_OFFSET(zl)) != np)
ZIPLIST_TAIL_OFFSET(zl) += extra;
/* Move the tail to the back. */
memmove(np+rawlensize, memmove(np+rawlensize,
np+next.prevrawlensize, np+next.prevrawlensize,
curlen-noffset-next.prevrawlensize-1); curlen-noffset-next.prevrawlensize-1);
@ -877,7 +882,7 @@ void pop(unsigned char *zl, int where) {
} }
} }
void randstring(char *target, unsigned int min, unsigned int max) { int randstring(char *target, unsigned int min, unsigned int max) {
int p, len = min+rand()%(max-min+1); int p, len = min+rand()%(max-min+1);
int minval, maxval; int minval, maxval;
switch(rand() % 3) { switch(rand() % 3) {
@ -899,10 +904,9 @@ void randstring(char *target, unsigned int min, unsigned int max) {
while(p < len) while(p < len)
target[p++] = minval+rand()%(maxval-minval+1); target[p++] = minval+rand()%(maxval-minval+1);
return; return len;
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
unsigned char *zl, *p; unsigned char *zl, *p;
unsigned char *entry; unsigned char *entry;
@ -1235,6 +1239,7 @@ int main(int argc, char **argv) {
int i,j,len,where; int i,j,len,where;
unsigned char *p; unsigned char *p;
char buf[1024]; char buf[1024];
int buflen;
list *ref; list *ref;
listNode *refnode; listNode *refnode;
@ -1243,10 +1248,6 @@ int main(int argc, char **argv) {
unsigned int slen; unsigned int slen;
long long sval; long long sval;
/* In the regression for the cascade bug, it was triggered
* with a random seed of 2. */
srand(2);
for (i = 0; i < 20000; i++) { for (i = 0; i < 20000; i++) {
zl = ziplistNew(); zl = ziplistNew();
ref = listCreate(); ref = listCreate();
@ -1256,31 +1257,32 @@ int main(int argc, char **argv) {
/* Create lists */ /* Create lists */
for (j = 0; j < len; j++) { for (j = 0; j < len; j++) {
where = (rand() & 1) ? ZIPLIST_HEAD : ZIPLIST_TAIL; where = (rand() & 1) ? ZIPLIST_HEAD : ZIPLIST_TAIL;
switch(rand() % 4) { if (rand() % 2) {
case 0: buflen = randstring(buf,1,sizeof(buf)-1);
sprintf(buf,"%lld",(0LL + rand()) >> 20); } else {
break; switch(rand() % 3) {
case 1: case 0:
sprintf(buf,"%lld",(0LL + rand())); buflen = sprintf(buf,"%lld",(0LL + rand()) >> 20);
break; break;
case 2: case 1:
sprintf(buf,"%lld",(0LL + rand()) << 20); buflen = sprintf(buf,"%lld",(0LL + rand()));
break; break;
case 3: case 2:
randstring(buf,0,256); buflen = sprintf(buf,"%lld",(0LL + rand()) << 20);
break; break;
default: default:
assert(NULL); assert(NULL);
}
} }
/* Add to ziplist */ /* Add to ziplist */
zl = ziplistPush(zl, (unsigned char*)buf, strlen(buf), where); zl = ziplistPush(zl, (unsigned char*)buf, buflen, where);
/* Add to reference list */ /* Add to reference list */
if (where == ZIPLIST_HEAD) { if (where == ZIPLIST_HEAD) {
listAddNodeHead(ref,sdsnew(buf)); listAddNodeHead(ref,sdsnewlen(buf, buflen));
} else if (where == ZIPLIST_TAIL) { } else if (where == ZIPLIST_TAIL) {
listAddNodeTail(ref,sdsnew(buf)); listAddNodeTail(ref,sdsnewlen(buf, buflen));
} else { } else {
assert(NULL); assert(NULL);
} }
@ -1295,12 +1297,13 @@ int main(int argc, char **argv) {
assert(ziplistGet(p,&sstr,&slen,&sval)); assert(ziplistGet(p,&sstr,&slen,&sval));
if (sstr == NULL) { if (sstr == NULL) {
sprintf(buf,"%lld",sval); buflen = sprintf(buf,"%lld",sval);
} else { } else {
memcpy(buf,sstr,slen); buflen = slen;
buf[slen] = '\0'; memcpy(buf,sstr,buflen);
buf[buflen] = '\0';
} }
assert(strcmp(buf,listNodeValue(refnode)) == 0); assert(memcmp(buf,listNodeValue(refnode),buflen) == 0);
} }
zfree(zl); zfree(zl);
listRelease(ref); listRelease(ref);