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
306c6a02
Commit
306c6a02
authored
Oct 14, 2010
by
Pieter Noordhuis
Browse files
Replace ziplist stresser and fix regression
parent
b4f2e412
Changes
1
Show whitespace changes
Inline
Side-by-side
src/ziplist.c
View file @
306c6a02
...
@@ -409,6 +409,7 @@ static unsigned char *__ziplistCascadeUpdate(unsigned char *zl, unsigned char *p
...
@@ -409,6 +409,7 @@ static unsigned char *__ziplistCascadeUpdate(unsigned char *zl, unsigned char *p
/* Advance the cursor */
/* Advance the cursor */
p
+=
rawlen
;
p
+=
rawlen
;
curlen
+=
extra
;
}
else
{
}
else
{
if
(
next
.
prevrawlensize
>
rawlensize
)
{
if
(
next
.
prevrawlensize
>
rawlensize
)
{
/* This would result in shrinking, which we want to avoid.
/* This would result in shrinking, which we want to avoid.
...
@@ -781,6 +782,10 @@ void ziplistRepr(unsigned char *zl) {
...
@@ -781,6 +782,10 @@ void ziplistRepr(unsigned char *zl) {
#ifdef ZIPLIST_TEST_MAIN
#ifdef ZIPLIST_TEST_MAIN
#include <sys/time.h>
#include <sys/time.h>
#include "adlist.h"
#include "sds.h"
#define debug(f, ...) { if (DEBUG) printf(f, __VA_ARGS__); }
unsigned
char
*
createList
()
{
unsigned
char
*
createList
()
{
unsigned
char
*
zl
=
ziplistNew
();
unsigned
char
*
zl
=
ziplistNew
();
...
@@ -864,6 +869,32 @@ void pop(unsigned char *zl, int where) {
...
@@ -864,6 +869,32 @@ void pop(unsigned char *zl, int where) {
}
}
}
}
void
randstring
(
char
*
target
,
unsigned
int
min
,
unsigned
int
max
)
{
int
p
,
len
=
min
+
rand
()
%
(
max
-
min
+
1
);
int
minval
,
maxval
;
switch
(
rand
()
%
3
)
{
case
0
:
minval
=
0
;
maxval
=
255
;
break
;
case
1
:
minval
=
48
;
maxval
=
122
;
break
;
case
2
:
minval
=
48
;
maxval
=
52
;
break
;
default:
assert
(
NULL
);
}
while
(
p
<
len
)
target
[
p
++
]
=
minval
+
rand
()
%
(
maxval
-
minval
+
1
);
return
;
}
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
;
...
@@ -1137,10 +1168,10 @@ int main(int argc, char **argv) {
...
@@ -1137,10 +1168,10 @@ int main(int argc, char **argv) {
/* Pop values again and compare their value. */
/* Pop values again and compare their value. */
p
=
ziplistIndex
(
zl
,
0
);
p
=
ziplistIndex
(
zl
,
0
);
assert
(
ziplistGet
(
p
,
&
entry
,
&
elen
,
&
value
));
assert
(
ziplistGet
(
p
,
&
entry
,
&
elen
,
&
value
));
assert
(
strncmp
(
v1
,
entry
,
elen
)
==
0
);
assert
(
strncmp
(
v1
,
(
char
*
)
entry
,
elen
)
==
0
);
p
=
ziplistIndex
(
zl
,
1
);
p
=
ziplistIndex
(
zl
,
1
);
assert
(
ziplistGet
(
p
,
&
entry
,
&
elen
,
&
value
));
assert
(
ziplistGet
(
p
,
&
entry
,
&
elen
,
&
value
));
assert
(
strncmp
(
v2
,
entry
,
elen
)
==
0
);
assert
(
strncmp
(
v2
,
(
char
*
)
entry
,
elen
)
==
0
);
printf
(
"SUCCESS
\n\n
"
);
printf
(
"SUCCESS
\n\n
"
);
}
}
...
@@ -1192,50 +1223,78 @@ int main(int argc, char **argv) {
...
@@ -1192,50 +1223,78 @@ int main(int argc, char **argv) {
printf
(
"Stress with random payloads of different encoding:
\n
"
);
printf
(
"Stress with random payloads of different encoding:
\n
"
);
{
{
int
i
,
idx
,
where
,
len
;
int
i
,
j
,
len
,
where
;
long
long
v
;
unsigned
char
*
p
;
unsigned
char
*
p
;
char
buf
[
0x4041
];
/* max length of generated string */
char
buf
[
1024
];
list
*
ref
;
listNode
*
refnode
;
/* Hold temp vars from ziplist */
unsigned
char
*
sstr
;
unsigned
int
slen
;
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
++
)
{
zl
=
ziplistNew
();
zl
=
ziplistNew
();
for
(
i
=
0
;
i
<
100000
;
i
++
)
{
ref
=
listCreate
();
listSetFreeMethod
(
ref
,
sdsfree
);
len
=
rand
()
%
256
;
/* Create lists */
for
(
j
=
0
;
j
<
len
;
j
++
)
{
where
=
(
rand
()
&
1
)
?
ZIPLIST_HEAD
:
ZIPLIST_TAIL
;
where
=
(
rand
()
&
1
)
?
ZIPLIST_HEAD
:
ZIPLIST_TAIL
;
if
(
rand
()
&
1
)
{
switch
(
rand
()
%
4
)
{
/* equally likely create a 16, 32 or 64 bit int */
case
0
:
v
=
(
rand
()
&
INT16_MAX
)
+
((
1ll
<<
32
)
>>
((
rand
()
%
3
)
*
16
));
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
())
>>
20
);
v
*=
2
*
(
rand
()
&
1
)
-
1
;
/* randomly flip sign */
break
;
sprintf
(
buf
,
"%lld"
,
v
);
case
1
:
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
()));
break
;
case
2
:
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
())
<<
20
);
break
;
case
3
:
randstring
(
buf
,
0
,
256
);
break
;
default:
assert
(
NULL
);
}
/* Add to ziplist */
zl
=
ziplistPush
(
zl
,
(
unsigned
char
*
)
buf
,
strlen
(
buf
),
where
);
zl
=
ziplistPush
(
zl
,
(
unsigned
char
*
)
buf
,
strlen
(
buf
),
where
);
/* Add to reference list */
if
(
where
==
ZIPLIST_HEAD
)
{
listAddNodeHead
(
ref
,
sdsnew
(
buf
));
}
else
if
(
where
==
ZIPLIST_TAIL
)
{
listAddNodeTail
(
ref
,
sdsnew
(
buf
));
}
else
{
}
else
{
/* equally likely generate 6, 14 or >14 bit length */
assert
(
NULL
);
v
=
rand
()
&
0x3f
;
v
+=
0x4000
>>
((
rand
()
%
3
)
*
8
);
memset
(
buf
,
'x'
,
v
);
zl
=
ziplistPush
(
zl
,
(
unsigned
char
*
)
buf
,
v
,
where
);
}
}
/* delete a random element */
if
((
len
=
ziplistLen
(
zl
))
>=
10
)
{
idx
=
rand
()
%
len
;
// printf("Delete index %d\n", idx);
// ziplistRepr(zl);
ziplistDeleteRange
(
zl
,
idx
,
1
);
// ziplistRepr(zl);
len
--
;
}
}
/* iterate from front to back */
assert
(
listLength
(
ref
)
==
ziplistLen
(
zl
));
idx
=
0
;
for
(
j
=
0
;
j
<
len
;
j
++
)
{
p
=
ziplistIndex
(
zl
,
0
);
/* Naive way to get elements, but similar to the stresser
while
((
p
=
ziplistNext
(
zl
,
p
)))
* executed from the Tcl test suite. */
idx
++
;
p
=
ziplistIndex
(
zl
,
j
)
;
assert
(
len
==
idx
+
1
);
refnode
=
listIndex
(
ref
,
j
);
/* iterate from back to front */
assert
(
ziplistGet
(
p
,
&
sstr
,
&
slen
,
&
sval
));
idx
=
0
;
if
(
sstr
==
NULL
)
{
p
=
ziplistIndex
(
zl
,
-
1
);
sprintf
(
buf
,
"%lld"
,
sval
);
while
((
p
=
ziplistPrev
(
zl
,
p
)))
}
else
{
idx
++
;
memcpy
(
buf
,
sstr
,
slen
);
assert
(
len
==
idx
+
1
);
buf
[
slen
]
=
'\0'
;
}
assert
(
strcmp
(
buf
,
listNodeValue
(
refnode
))
==
0
);
}
zfree
(
zl
);
listRelease
(
ref
);
}
}
printf
(
"SUCCESS
\n\n
"
);
printf
(
"SUCCESS
\n\n
"
);
}
}
...
...
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