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
af4707a8
Commit
af4707a8
authored
Sep 16, 2011
by
antirez
Browse files
Merge remote-tracking branch 'origin/unstable' into bg-aof-2
parents
a3fcd6bc
3aa4b009
Changes
5
Hide whitespace changes
Inline
Side-by-side
src/aof.c
View file @
af4707a8
...
@@ -812,6 +812,11 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
...
@@ -812,6 +812,11 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
server
.
appendseldb
=
-
1
;
/* Make sure SELECT is re-issued */
server
.
appendseldb
=
-
1
;
/* Make sure SELECT is re-issued */
aofUpdateCurrentSize
();
aofUpdateCurrentSize
();
server
.
auto_aofrewrite_base_size
=
server
.
appendonly_current_size
;
server
.
auto_aofrewrite_base_size
=
server
.
appendonly_current_size
;
/* Clear regular AOF buffer since its contents was just written to
* the new AOF from the background rewrite buffer. */
sdsfree
(
server
.
aofbuf
);
server
.
aofbuf
=
sdsempty
();
}
}
redisLog
(
REDIS_NOTICE
,
"Background AOF rewrite successful"
);
redisLog
(
REDIS_NOTICE
,
"Background AOF rewrite successful"
);
...
...
src/redis-benchmark.c
View file @
af4707a8
...
@@ -53,9 +53,10 @@ static struct config {
...
@@ -53,9 +53,10 @@ static struct config {
int
hostport
;
int
hostport
;
const
char
*
hostsocket
;
const
char
*
hostsocket
;
int
numclients
;
int
numclients
;
int
requests
;
int
liveclients
;
int
liveclients
;
int
donerequests
;
int
requests
;
int
requests_issued
;
int
requests_finished
;
int
keysize
;
int
keysize
;
int
datasize
;
int
datasize
;
int
randomkeys
;
int
randomkeys
;
...
@@ -148,7 +149,7 @@ static void randomizeClientKey(client c) {
...
@@ -148,7 +149,7 @@ static void randomizeClientKey(client c) {
}
}
static
void
clientDone
(
client
c
)
{
static
void
clientDone
(
client
c
)
{
if
(
config
.
done
requests
==
config
.
requests
)
{
if
(
config
.
requests
_finished
==
config
.
requests
)
{
freeClient
(
c
);
freeClient
(
c
);
aeStop
(
config
.
el
);
aeStop
(
config
.
el
);
return
;
return
;
...
@@ -189,8 +190,8 @@ static void readHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -189,8 +190,8 @@ static void readHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
exit
(
1
);
exit
(
1
);
}
}
if
(
config
.
done
requests
<
config
.
requests
)
if
(
config
.
requests
_finished
<
config
.
requests
)
config
.
latency
[
config
.
done
requests
++
]
=
c
->
latency
;
config
.
latency
[
config
.
requests
_finished
++
]
=
c
->
latency
;
clientDone
(
c
);
clientDone
(
c
);
}
}
}
}
...
@@ -202,8 +203,15 @@ static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -202,8 +203,15 @@ static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
REDIS_NOTUSED
(
fd
);
REDIS_NOTUSED
(
fd
);
REDIS_NOTUSED
(
mask
);
REDIS_NOTUSED
(
mask
);
/*
W
hen nothing was written
yet, randomize keys and set start time
. */
/*
Initialize request w
hen nothing was written. */
if
(
c
->
written
==
0
)
{
if
(
c
->
written
==
0
)
{
/* Enforce upper bound to number of requests. */
if
(
config
.
requests_issued
++
>=
config
.
requests
)
{
freeClient
(
c
);
return
;
}
/* Really initialize: randomize keys and set start time. */
if
(
config
.
randomkeys
)
randomizeClientKey
(
c
);
if
(
config
.
randomkeys
)
randomizeClientKey
(
c
);
c
->
start
=
ustime
();
c
->
start
=
ustime
();
c
->
latency
=
-
1
;
c
->
latency
=
-
1
;
...
@@ -286,10 +294,10 @@ static void showLatencyReport(void) {
...
@@ -286,10 +294,10 @@ static void showLatencyReport(void) {
int
i
,
curlat
=
0
;
int
i
,
curlat
=
0
;
float
perc
,
reqpersec
;
float
perc
,
reqpersec
;
reqpersec
=
(
float
)
config
.
done
requests
/
((
float
)
config
.
totlatency
/
1000
);
reqpersec
=
(
float
)
config
.
requests
_finished
/
((
float
)
config
.
totlatency
/
1000
);
if
(
!
config
.
quiet
)
{
if
(
!
config
.
quiet
)
{
printf
(
"====== %s ======
\n
"
,
config
.
title
);
printf
(
"====== %s ======
\n
"
,
config
.
title
);
printf
(
" %d requests completed in %.2f seconds
\n
"
,
config
.
done
requests
,
printf
(
" %d requests completed in %.2f seconds
\n
"
,
config
.
requests
_finished
,
(
float
)
config
.
totlatency
/
1000
);
(
float
)
config
.
totlatency
/
1000
);
printf
(
" %d parallel clients
\n
"
,
config
.
numclients
);
printf
(
" %d parallel clients
\n
"
,
config
.
numclients
);
printf
(
" %d bytes payload
\n
"
,
config
.
datasize
);
printf
(
" %d bytes payload
\n
"
,
config
.
datasize
);
...
@@ -314,7 +322,8 @@ static void benchmark(const char *title, const char *cmd, int len) {
...
@@ -314,7 +322,8 @@ static void benchmark(const char *title, const char *cmd, int len) {
client
c
;
client
c
;
config
.
title
=
title
;
config
.
title
=
title
;
config
.
donerequests
=
0
;
config
.
requests_issued
=
0
;
config
.
requests_finished
=
0
;
c
=
createClient
(
cmd
,
len
);
c
=
createClient
(
cmd
,
len
);
createMissingClients
(
c
);
createMissingClients
(
c
);
...
@@ -416,7 +425,7 @@ int showThroughput(struct aeEventLoop *eventLoop, long long id, void *clientData
...
@@ -416,7 +425,7 @@ int showThroughput(struct aeEventLoop *eventLoop, long long id, void *clientData
REDIS_NOTUSED
(
clientData
);
REDIS_NOTUSED
(
clientData
);
float
dt
=
(
float
)(
mstime
()
-
config
.
start
)
/
1000
.
0
;
float
dt
=
(
float
)(
mstime
()
-
config
.
start
)
/
1000
.
0
;
float
rps
=
(
float
)
config
.
done
requests
/
dt
;
float
rps
=
(
float
)
config
.
requests
_finished
/
dt
;
printf
(
"%s: %.2f
\r
"
,
config
.
title
,
rps
);
printf
(
"%s: %.2f
\r
"
,
config
.
title
,
rps
);
fflush
(
stdout
);
fflush
(
stdout
);
return
250
;
/* every 250ms */
return
250
;
/* every 250ms */
...
@@ -438,7 +447,6 @@ int main(int argc, const char **argv) {
...
@@ -438,7 +447,6 @@ int main(int argc, const char **argv) {
config
.
el
=
aeCreateEventLoop
();
config
.
el
=
aeCreateEventLoop
();
aeCreateTimeEvent
(
config
.
el
,
1
,
showThroughput
,
NULL
,
NULL
);
aeCreateTimeEvent
(
config
.
el
,
1
,
showThroughput
,
NULL
,
NULL
);
config
.
keepalive
=
1
;
config
.
keepalive
=
1
;
config
.
donerequests
=
0
;
config
.
datasize
=
3
;
config
.
datasize
=
3
;
config
.
randomkeys
=
0
;
config
.
randomkeys
=
0
;
config
.
randomkeys_keyspacelen
=
0
;
config
.
randomkeys_keyspacelen
=
0
;
...
...
src/redis-cli.c
View file @
af4707a8
...
@@ -61,6 +61,7 @@ static struct config {
...
@@ -61,6 +61,7 @@ static struct config {
int
shutdown
;
int
shutdown
;
int
monitor_mode
;
int
monitor_mode
;
int
pubsub_mode
;
int
pubsub_mode
;
int
latency_mode
;
int
stdinarg
;
/* get last arg from stdin. (-x option) */
int
stdinarg
;
/* get last arg from stdin. (-x option) */
char
*
auth
;
char
*
auth
;
int
raw_output
;
/* output mode per command */
int
raw_output
;
/* output mode per command */
...
@@ -567,6 +568,8 @@ static int parseOptions(int argc, char **argv) {
...
@@ -567,6 +568,8 @@ static int parseOptions(int argc, char **argv) {
i
++
;
i
++
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"--raw"
))
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"--raw"
))
{
config
.
raw_output
=
1
;
config
.
raw_output
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"--latency"
))
{
config
.
latency_mode
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-d"
)
&&
!
lastarg
)
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"-d"
)
&&
!
lastarg
)
{
sdsfree
(
config
.
mb_delim
);
sdsfree
(
config
.
mb_delim
);
config
.
mb_delim
=
sdsnew
(
argv
[
i
+
1
]);
config
.
mb_delim
=
sdsnew
(
argv
[
i
+
1
]);
...
@@ -617,6 +620,7 @@ static void usage() {
...
@@ -617,6 +620,7 @@ static void usage() {
" -x Read last argument from STDIN
\n
"
" -x Read last argument from STDIN
\n
"
" -d <delimiter> Multi-bulk delimiter in for raw formatting (default:
\\
n)
\n
"
" -d <delimiter> Multi-bulk delimiter in for raw formatting (default:
\\
n)
\n
"
" --raw Use raw formatting for replies (default when STDOUT is not a tty)
\n
"
" --raw Use raw formatting for replies (default when STDOUT is not a tty)
\n
"
" --latency Enter a special mode continuously sampling latency.
\n
"
" --help Output this help and exit
\n
"
" --help Output this help and exit
\n
"
" --version Output version and exit
\n
"
" --version Output version and exit
\n
"
"
\n
"
"
\n
"
...
@@ -739,6 +743,38 @@ static int noninteractive(int argc, char **argv) {
...
@@ -739,6 +743,38 @@ static int noninteractive(int argc, char **argv) {
return
retval
;
return
retval
;
}
}
static
void
latencyMode
(
void
)
{
redisReply
*
reply
;
long
long
start
,
latency
,
min
,
max
,
tot
,
count
=
0
;
double
avg
;
if
(
!
context
)
exit
(
1
);
while
(
1
)
{
start
=
mstime
();
reply
=
redisCommand
(
context
,
"PING"
);
if
(
reply
==
NULL
)
{
fprintf
(
stderr
,
"
\n
I/O error
\n
"
);
exit
(
1
);
}
latency
=
mstime
()
-
start
;
freeReplyObject
(
reply
);
count
++
;
if
(
count
==
1
)
{
min
=
max
=
tot
=
latency
;
avg
=
(
double
)
latency
;
}
else
{
if
(
latency
<
min
)
min
=
latency
;
if
(
latency
>
max
)
max
=
latency
;
tot
+=
latency
;
avg
=
(
double
)
tot
/
count
;
}
printf
(
"
\x1b
[0G
\x1b
[2Kmin: %lld, max: %lld, avg: %.2f (%lld samples)"
,
min
,
max
,
avg
,
count
);
fflush
(
stdout
);
usleep
(
10000
);
}
}
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
int
firstarg
;
int
firstarg
;
...
@@ -752,6 +788,7 @@ int main(int argc, char **argv) {
...
@@ -752,6 +788,7 @@ int main(int argc, char **argv) {
config
.
shutdown
=
0
;
config
.
shutdown
=
0
;
config
.
monitor_mode
=
0
;
config
.
monitor_mode
=
0
;
config
.
pubsub_mode
=
0
;
config
.
pubsub_mode
=
0
;
config
.
latency_mode
=
0
;
config
.
stdinarg
=
0
;
config
.
stdinarg
=
0
;
config
.
auth
=
NULL
;
config
.
auth
=
NULL
;
config
.
raw_output
=
!
isatty
(
fileno
(
stdout
))
&&
(
getenv
(
"FAKETTY"
)
==
NULL
);
config
.
raw_output
=
!
isatty
(
fileno
(
stdout
))
&&
(
getenv
(
"FAKETTY"
)
==
NULL
);
...
@@ -762,6 +799,12 @@ int main(int argc, char **argv) {
...
@@ -762,6 +799,12 @@ int main(int argc, char **argv) {
argc
-=
firstarg
;
argc
-=
firstarg
;
argv
+=
firstarg
;
argv
+=
firstarg
;
/* Start in latency mode if appropriate */
if
(
config
.
latency_mode
)
{
cliConnect
(
0
);
latencyMode
();
}
/* Start interactive mode when no command is provided */
/* Start interactive mode when no command is provided */
if
(
argc
==
0
)
{
if
(
argc
==
0
)
{
/* Note that in repl mode we don't abort on connection error.
/* Note that in repl mode we don't abort on connection error.
...
...
tests/integration/aof-race.tcl
0 → 100644
View file @
af4707a8
set defaults
{
appendonly
{
yes
}
appendfilename
{
appendonly.aof
}
}
set server_path
[
tmpdir server.aof
]
set aof_path
"
$server
_path/appendonly.aof"
proc start_server_aof
{
overrides code
}
{
upvar defaults defaults srv srv server_path server_path
set config
[
concat $defaults $overrides
]
start_server
[
list overrides $config
]
$code
}
tags
{
"aof"
}
{
# Specific test for a regression where internal buffers were not properly
# cleaned after a child responsible for an AOF rewrite exited. This buffer
# was subsequently appended to the new AOF, resulting in duplicate commands.
start_server_aof
[
list dir $server_path
]
{
set client
[
redis
[
srv host
]
[
srv port
]]
set bench
[
open
"|src/redis-benchmark -q -p
[
srv port
]
-c 20 -n 20000 incr foo"
"r+"
]
after 100
# Benchmark should be running by now: start background rewrite
$client bgrewriteaof
# Read until benchmark pipe reaches EOF
while
{[
string length
[
read $bench
]]
> 0
}
{}
# Check contents of foo
assert_equal 20000
[
$client
get foo
]
}
# Restart server to replay AOF
start_server_aof
[
list dir $server_path
]
{
set client
[
redis
[
srv host
]
[
srv port
]]
assert_equal 20000
[
$client
get foo
]
}
}
tests/test_helper.tcl
View file @
af4707a8
...
@@ -29,6 +29,7 @@ set ::all_tests {
...
@@ -29,6 +29,7 @@ set ::all_tests {
integration/replication-2
integration/replication-2
integration/replication-3
integration/replication-3
integration/aof
integration/aof
integration/aof-race
unit/pubsub
unit/pubsub
unit/slowlog
unit/slowlog
unit/scripting
unit/scripting
...
...
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