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
3c49070b
Commit
3c49070b
authored
Dec 23, 2010
by
Pieter Noordhuis
Browse files
Find substrings to randomize when the client is created
parent
d69a4835
Changes
1
Show whitespace changes
Inline
Side-by-side
src/redis-benchmark.c
View file @
3c49070b
...
@@ -80,7 +80,8 @@ typedef struct _client {
...
@@ -80,7 +80,8 @@ typedef struct _client {
redisContext
*
context
;
redisContext
*
context
;
int
state
;
int
state
;
sds
obuf
;
sds
obuf
;
char
*
randptr
;
char
*
randptr
[
10
];
/* needed for MSET against 10 keys */
size_t
randlen
;
unsigned
int
written
;
/* bytes of 'obuf' already written */
unsigned
int
written
;
/* bytes of 'obuf' already written */
long
long
start
;
/* start time of a request */
long
long
start
;
/* start time of a request */
long
long
latency
;
/* request latency */
long
long
latency
;
/* request latency */
...
@@ -145,29 +146,14 @@ static void resetClient(client c) {
...
@@ -145,29 +146,14 @@ static void resetClient(client c) {
}
}
static
void
randomizeClientKey
(
client
c
)
{
static
void
randomizeClientKey
(
client
c
)
{
char
*
p
,
*
newline
;
char
buf
[
32
];
char
buf
[
32
];
long
r
;
size_t
i
,
r
;
if
(
c
->
randptr
==
NULL
)
return
;
for
(
i
=
0
;
i
<
c
->
randlen
;
i
++
)
{
/* Check if we have to randomize (only once per connection) */
if
(
c
->
randptr
==
(
void
*
)
-
1
)
{
p
=
strstr
(
c
->
obuf
,
":rand:"
);
if
(
!
p
)
{
c
->
randptr
=
NULL
;
return
;
}
else
{
newline
=
strstr
(
p
,
"
\r\n
"
);
assert
(
newline
-
(
p
+
6
)
==
12
);
/* 12 chars for randomness */
c
->
randptr
=
p
+
6
;
}
}
/* Set random number in output buffer */
r
=
random
()
%
config
.
randomkeys_keyspacelen
;
r
=
random
()
%
config
.
randomkeys_keyspacelen
;
snprintf
(
buf
,
sizeof
(
buf
),
"%012ld"
,
r
);
snprintf
(
buf
,
sizeof
(
buf
),
"%012lu"
,
r
);
memcpy
(
c
->
randptr
,
buf
,
12
);
memcpy
(
c
->
randptr
[
i
],
buf
,
12
);
}
}
}
static
void
clientDone
(
client
c
)
{
static
void
clientDone
(
client
c
)
{
...
@@ -249,7 +235,7 @@ static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -249,7 +235,7 @@ static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
}
}
}
}
static
client
createClient
()
{
static
client
createClient
(
char
*
cmd
,
int
len
)
{
client
c
=
zmalloc
(
sizeof
(
struct
_client
));
client
c
=
zmalloc
(
sizeof
(
struct
_client
));
if
(
config
.
hostsocket
==
NULL
)
{
if
(
config
.
hostsocket
==
NULL
)
{
c
->
context
=
redisConnectNonBlock
(
config
.
hostip
,
config
.
hostport
);
c
->
context
=
redisConnectNonBlock
(
config
.
hostip
,
config
.
hostport
);
...
@@ -265,9 +251,22 @@ static client createClient() {
...
@@ -265,9 +251,22 @@ static client createClient() {
exit
(
1
);
exit
(
1
);
}
}
c
->
state
=
CLIENT_CONNECTING
;
c
->
state
=
CLIENT_CONNECTING
;
c
->
obuf
=
NULL
;
c
->
obuf
=
sdsnewlen
(
cmd
,
len
)
;
c
->
rand
ptr
=
(
void
*
)
-
1
;
c
->
rand
len
=
0
;
c
->
written
=
0
;
c
->
written
=
0
;
/* Find substrings in the output buffer that need to be randomized. */
if
(
config
.
randomkeys
)
{
char
*
p
=
c
->
obuf
,
*
newline
;
while
((
p
=
strstr
(
p
,
":rand:"
))
!=
NULL
)
{
newline
=
strstr
(
p
,
"
\r\n
"
);
assert
(
newline
-
(
p
+
6
)
==
12
);
/* 12 chars for randomness */
assert
(
c
->
randlen
<
(
signed
)(
sizeof
(
c
->
randptr
)
/
sizeof
(
char
*
)));
c
->
randptr
[
c
->
randlen
++
]
=
p
+
6
;
p
=
newline
+
2
;
}
}
redisSetReplyObjectFunctions
(
c
->
context
,
NULL
);
redisSetReplyObjectFunctions
(
c
->
context
,
NULL
);
aeCreateFileEvent
(
config
.
el
,
c
->
context
->
fd
,
AE_WRITABLE
,
writeHandler
,
c
);
aeCreateFileEvent
(
config
.
el
,
c
->
context
->
fd
,
AE_WRITABLE
,
writeHandler
,
c
);
listAddNodeTail
(
config
.
clients
,
c
);
listAddNodeTail
(
config
.
clients
,
c
);
...
@@ -279,9 +278,8 @@ static void createMissingClients(client c) {
...
@@ -279,9 +278,8 @@ static void createMissingClients(client c) {
int
n
=
0
;
int
n
=
0
;
while
(
config
.
liveclients
<
config
.
numclients
)
{
while
(
config
.
liveclients
<
config
.
numclients
)
{
client
new
=
createClient
();
client
new
=
createClient
(
c
->
obuf
,
sdslen
(
c
->
obuf
));
new
->
obuf
=
sdsdup
(
c
->
obuf
);
if
(
config
.
randomkeys
)
randomizeClientKey
(
new
);
if
(
config
.
randomkeys
)
randomizeClientKey
(
c
);
/* Listen backlog is quite limited on most systems */
/* Listen backlog is quite limited on most systems */
if
(
++
n
>
64
)
{
if
(
++
n
>
64
)
{
...
@@ -329,8 +327,7 @@ static void benchmark(char *title, char *cmd, int len) {
...
@@ -329,8 +327,7 @@ static void benchmark(char *title, char *cmd, int len) {
config
.
title
=
title
;
config
.
title
=
title
;
config
.
donerequests
=
0
;
config
.
donerequests
=
0
;
c
=
createClient
();
c
=
createClient
(
cmd
,
len
);
c
->
obuf
=
sdsnewlen
(
cmd
,
len
);
createMissingClients
(
c
);
createMissingClients
(
c
);
config
.
start
=
mstime
();
config
.
start
=
mstime
();
...
@@ -458,8 +455,7 @@ int main(int argc, char **argv) {
...
@@ -458,8 +455,7 @@ int main(int argc, char **argv) {
if
(
config
.
idlemode
)
{
if
(
config
.
idlemode
)
{
printf
(
"Creating %d idle connections and waiting forever (Ctrl+C when done)
\n
"
,
config
.
numclients
);
printf
(
"Creating %d idle connections and waiting forever (Ctrl+C when done)
\n
"
,
config
.
numclients
);
c
=
createClient
(
0
);
/* will never receive a reply */
c
=
createClient
(
""
,
0
);
/* will never receive a reply */
c
->
obuf
=
sdsempty
();
createMissingClients
(
c
);
createMissingClients
(
c
);
aeMain
(
config
.
el
);
aeMain
(
config
.
el
);
/* and will wait for every */
/* and will wait for every */
...
...
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