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
249ad25f
Commit
249ad25f
authored
Jan 05, 2011
by
antirez
Browse files
BGSAVE work in progress
parent
51335102
Changes
5
Hide whitespace changes
Inline
Side-by-side
src/diskstore.c
View file @
249ad25f
...
@@ -348,3 +348,50 @@ void dsFlushDb(int dbid) {
...
@@ -348,3 +348,50 @@ void dsFlushDb(int dbid) {
}
}
}
}
}
}
int
dsRdbSave
(
char
*
filename
)
{
char
tmpfile
[
256
];
int
j
,
i
;
time_t
now
=
time
(
NULL
);
snprintf
(
tmpfile
,
256
,
"temp-%d.rdb"
,
(
int
)
getpid
());
fp
=
fopen
(
tmpfile
,
"w"
);
if
(
!
fp
)
{
redisLog
(
REDIS_WARNING
,
"Failed saving the DB: %s"
,
strerror
(
errno
));
return
REDIS_ERR
;
}
if
(
fwrite
(
"REDIS0001"
,
9
,
1
,
fp
)
==
0
)
goto
werr
;
/* Scan all diskstore dirs looking for keys */
for
(
j
=
0
;
j
<
256
;
j
++
)
{
for
(
i
=
0
;
i
<
256
;
i
++
)
{
snprintf
(
buf
,
1024
,
"%s/%02x/%02x"
,
server
.
ds_path
,
j
,
i
);
/* Write the SELECT DB opcode */
if
(
rdbSaveType
(
fp
,
REDIS_SELECTDB
)
==
-
1
)
goto
werr
;
if
(
rdbSaveLen
(
fp
,
j
)
==
-
1
)
goto
werr
;
}
}
/* Make sure data will not remain on the OS's output buffers */
fflush
(
fp
);
fsync
(
fileno
(
fp
));
fclose
(
fp
);
/* Use RENAME to make sure the DB file is changed atomically only
* if the generate DB file is ok. */
if
(
rename
(
tmpfile
,
filename
)
==
-
1
)
{
redisLog
(
REDIS_WARNING
,
"Error moving temp DB file on the final destination: %s"
,
strerror
(
errno
));
unlink
(
tmpfile
);
return
REDIS_ERR
;
}
redisLog
(
REDIS_NOTICE
,
"DB saved on disk"
);
server
.
dirty
=
0
;
server
.
lastsave
=
time
(
NULL
);
return
REDIS_OK
;
werr:
fclose
(
fp
);
unlink
(
tmpfile
);
redisLog
(
REDIS_WARNING
,
"Write error saving DB on disk: %s"
,
strerror
(
errno
));
}
src/dscache.c
View file @
249ad25f
...
@@ -512,7 +512,7 @@ int processActiveIOJobs(int max) {
...
@@ -512,7 +512,7 @@ int processActiveIOJobs(int max) {
#if 0
#if 0
/* If there are new jobs we need to signal the thread to
/* If there are new jobs we need to signal the thread to
* process the next one. */
* process the next one.
FIXME: drop this if useless.
*/
redisLog(REDIS_DEBUG,"waitEmptyIOJobsQueue: new %d, processing %d",
redisLog(REDIS_DEBUG,"waitEmptyIOJobsQueue: new %d, processing %d",
listLength(server.io_newjobs),
listLength(server.io_newjobs),
listLength(server.io_processing));
listLength(server.io_processing));
...
@@ -576,7 +576,21 @@ void queueIOJob(iojob *j) {
...
@@ -576,7 +576,21 @@ void queueIOJob(iojob *j) {
spawnIOThread
();
spawnIOThread
();
}
}
void
dsCreateIOJob
(
int
type
,
redisDb
*
db
,
robj
*
key
,
robj
*
val
)
{
/* Consume all the IO scheduled operations, and all the thread IO jobs
* so that eventually the state of diskstore is a point-in-time snapshot.
*
* This is useful when we need to BGSAVE with diskstore enabled. */
void
cacheForcePointInTime
(
void
)
{
redisLog
(
REDIS_NOTICE
,
"Diskstore: synching on disk to reach point-in-time state."
);
while
(
listLength
(
server
.
cache_io_queue
)
!=
0
)
{
cacheScheduleIOPushJobs
(
REDIS_IO_ASAP
);
processActiveIOJobs
(
1
);
}
waitEmptyIOJobsQueue
();
processAllPendingIOJobs
();
}
void
cacheCreateIOJob
(
int
type
,
redisDb
*
db
,
robj
*
key
,
robj
*
val
)
{
iojob
*
j
;
iojob
*
j
;
j
=
zmalloc
(
sizeof
(
*
j
));
j
=
zmalloc
(
sizeof
(
*
j
));
...
@@ -762,7 +776,7 @@ int cacheScheduleIOPushJobs(int flags) {
...
@@ -762,7 +776,7 @@ int cacheScheduleIOPushJobs(int flags) {
op
->
type
==
REDIS_IO_LOAD
?
"load"
:
"save"
,
op
->
key
->
ptr
);
op
->
type
==
REDIS_IO_LOAD
?
"load"
:
"save"
,
op
->
key
->
ptr
);
if
(
op
->
type
==
REDIS_IO_LOAD
)
{
if
(
op
->
type
==
REDIS_IO_LOAD
)
{
ds
CreateIOJob
(
REDIS_IOJOB_LOAD
,
op
->
db
,
op
->
key
,
NULL
);
cache
CreateIOJob
(
REDIS_IOJOB_LOAD
,
op
->
db
,
op
->
key
,
NULL
);
}
else
{
}
else
{
/* Lookup the key, in order to put the current value in the IO
/* Lookup the key, in order to put the current value in the IO
* Job. Otherwise if the key does not exists we schedule a disk
* Job. Otherwise if the key does not exists we schedule a disk
...
@@ -775,7 +789,7 @@ int cacheScheduleIOPushJobs(int flags) {
...
@@ -775,7 +789,7 @@ int cacheScheduleIOPushJobs(int flags) {
* the key on disk. */
* the key on disk. */
val
=
NULL
;
val
=
NULL
;
}
}
ds
CreateIOJob
(
REDIS_IOJOB_SAVE
,
op
->
db
,
op
->
key
,
val
);
cache
CreateIOJob
(
REDIS_IOJOB_SAVE
,
op
->
db
,
op
->
key
,
val
);
}
}
/* Mark the operation as in progress. */
/* Mark the operation as in progress. */
cacheScheduleIODelFlag
(
op
->
db
,
op
->
key
,
op
->
type
);
cacheScheduleIODelFlag
(
op
->
db
,
op
->
key
,
op
->
type
);
...
...
src/rdb.c
View file @
249ad25f
...
@@ -429,8 +429,10 @@ int rdbSave(char *filename) {
...
@@ -429,8 +429,10 @@ int rdbSave(char *filename) {
int
j
;
int
j
;
time_t
now
=
time
(
NULL
);
time_t
now
=
time
(
NULL
);
/* FIXME: implement .rdb save for disk store properly */
if
(
server
.
ds_enabled
)
{
redisAssert
(
server
.
ds_enabled
==
0
);
cacheForcePointInTime
();
return
dsRdbSave
(
filename
);
}
snprintf
(
tmpfile
,
256
,
"temp-%d.rdb"
,
(
int
)
getpid
());
snprintf
(
tmpfile
,
256
,
"temp-%d.rdb"
,
(
int
)
getpid
());
fp
=
fopen
(
tmpfile
,
"w"
);
fp
=
fopen
(
tmpfile
,
"w"
);
...
@@ -495,17 +497,22 @@ int rdbSaveBackground(char *filename) {
...
@@ -495,17 +497,22 @@ int rdbSaveBackground(char *filename) {
pid_t
childpid
;
pid_t
childpid
;
if
(
server
.
bgsavechildpid
!=
-
1
)
return
REDIS_ERR
;
if
(
server
.
bgsavechildpid
!=
-
1
)
return
REDIS_ERR
;
redisAssert
(
server
.
ds_enabled
==
0
);
server
.
dirty_before_bgsave
=
server
.
dirty
;
server
.
dirty_before_bgsave
=
server
.
dirty
;
if
((
childpid
=
fork
())
==
0
)
{
if
((
childpid
=
fork
())
==
0
)
{
int
retval
;
/* Child */
/* Child */
if
(
server
.
ipfd
>
0
)
close
(
server
.
ipfd
);
if
(
server
.
ipfd
>
0
)
close
(
server
.
ipfd
);
if
(
server
.
sofd
>
0
)
close
(
server
.
sofd
);
if
(
server
.
sofd
>
0
)
close
(
server
.
sofd
);
if
(
rdbSave
(
filename
)
==
REDIS_OK
)
{
if
(
server
.
ds_enabled
)
{
_exit
(
0
);
cacheForcePointInTime
();
dsRdbSave
(
filename
);
}
else
{
}
else
{
_exit
(
1
);
rdbSave
(
filename
);
}
}
_exit
((
retval
==
REDIS_OK
)
?
0
:
1
);
}
else
{
}
else
{
/* Parent */
/* Parent */
if
(
childpid
==
-
1
)
{
if
(
childpid
==
-
1
)
{
...
...
src/redis.h
View file @
249ad25f
...
@@ -813,6 +813,7 @@ void cacheCron(void);
...
@@ -813,6 +813,7 @@ void cacheCron(void);
int
cacheKeyMayExist
(
redisDb
*
db
,
robj
*
key
);
int
cacheKeyMayExist
(
redisDb
*
db
,
robj
*
key
);
void
cacheSetKeyMayExist
(
redisDb
*
db
,
robj
*
key
);
void
cacheSetKeyMayExist
(
redisDb
*
db
,
robj
*
key
);
void
cacheSetKeyDoesNotExist
(
redisDb
*
db
,
robj
*
key
);
void
cacheSetKeyDoesNotExist
(
redisDb
*
db
,
robj
*
key
);
void
cacheForcePointInTime
(
void
);
/* Set data type */
/* Set data type */
robj
*
setTypeCreate
(
robj
*
value
);
robj
*
setTypeCreate
(
robj
*
value
);
...
...
utils/whatisdoing.sh
0 → 100755
View file @
249ad25f
# This script is from http://poormansprofiler.org/
#!/bin/bash
nsamples
=
1
sleeptime
=
0
pid
=
$(
pidof redis-server
)
for
x
in
$(
seq
1
$nsamples
)
do
gdb
-ex
"set pagination 0"
-ex
"thread apply all bt"
-batch
-p
$pid
sleep
$sleeptime
done
|
\
awk
'
BEGIN { s = ""; }
/Thread/ { print s; s = ""; }
/^\#/ { if (s != "" ) { s = s "," $4} else { s = $4 } }
END { print s }'
|
\
sort
|
uniq
-c
|
sort
-r
-n
-k
1,1
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