Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
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