mirror of
https://github.com/fluencelabs/redis
synced 2025-05-02 22:12:15 +00:00
Merge branch '2.2' of github.com:antirez/redis into 2.2
This commit is contained in:
commit
3554f09ddc
@ -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
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -1 +1 @@
|
|||||||
#define REDIS_VERSION "2.2.5"
|
#define REDIS_VERSION "2.2.6"
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user