Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
3554f09d
Commit
3554f09d
authored
May 07, 2011
by
antirez
Browse files
Merge branch '2.2' of github.com:antirez/redis into 2.2
parents
ccab83e7
97ddfbbf
Changes
4
Hide whitespace changes
Inline
Side-by-side
00-RELEASENOTES
View file @
3554f09d
...
@@ -12,6 +12,15 @@ for 2.0.
...
@@ -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
=========================
=========================
...
...
src/networking.c
View file @
3554f09d
...
@@ -523,10 +523,16 @@ void freeClient(redisClient *c) {
...
@@ -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 */
...
...
src/version.h
View file @
3554f09d
#define REDIS_VERSION "2.2.
5
"
#define REDIS_VERSION "2.2.
6
"
src/ziplist.c
View file @
3554f09d
...
@@ -398,12 +398,17 @@ static unsigned char *__ziplistCascadeUpdate(unsigned char *zl, unsigned char *p
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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
,
sdsnew
len
(
buf
,
buflen
));
}
else
if
(
where
==
ZIPLIST_TAIL
)
{
}
else
if
(
where
==
ZIPLIST_TAIL
)
{
listAddNodeTail
(
ref
,
sdsnew
(
buf
));
listAddNodeTail
(
ref
,
sdsnew
len
(
buf
,
buflen
));
}
else
{
}
else
{
assert
(
NULL
);
assert
(
NULL
);
}
}
...
@@ -1295,12 +1297,13 @@ int main(int argc, char **argv) {
...
@@ -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
(
str
cmp
(
buf
,
listNodeValue
(
refnode
))
==
0
);
assert
(
mem
cmp
(
buf
,
listNodeValue
(
refnode
)
,
buflen
)
==
0
);
}
}
zfree
(
zl
);
zfree
(
zl
);
listRelease
(
ref
);
listRelease
(
ref
);
...
...
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