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
5b8ce853
Commit
5b8ce853
authored
Jan 07, 2011
by
antirez
Browse files
more work towards diskstore bgsave
parent
36c17a53
Changes
6
Hide whitespace changes
Inline
Side-by-side
TODO
View file @
5b8ce853
...
...
@@ -17,6 +17,9 @@ DISKSTORE TODO
* Implement MULTI/EXEC as transaction abstract API to diskstore.c, with transaction_start, transaction_end, and a journal to recover.
* Stop BGSAVE thread on shutdown and any other condition where the child is killed during normal bgsave.
* Use a mutex to log on the file, so that we don't get overlapping messages, or even better make sure to use a single write against it.
* Fix RANDOMKEY to really do something interesting
* Fix DBSIZE to really do something interesting
* Add a DEBUG command to check if an entry is or not in memory currently
REPLICATION
===========
...
...
src/aof.c
View file @
5b8ce853
...
...
@@ -633,7 +633,7 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
}
else
{
redisLog
(
REDIS_WARNING
,
"Background append only file rewriting terminated by signal %d"
,
bysi
t
nal
);
bysi
g
nal
);
}
cleanup:
sdsfree
(
server
.
bgrewritebuf
);
...
...
src/diskstore.c
View file @
5b8ce853
...
...
@@ -349,10 +349,17 @@ void dsFlushDb(int dbid) {
}
}
void
dsRdbSaveSetState
(
int
state
)
{
pthread_mutex_lock
(
&
server
.
bgsavethread_mutex
);
server
.
bgsavethread_state
=
state
;
pthread_mutex_unlock
(
&
server
.
bgsavethread_mutex
);
}
void
*
dsRdbSave_thread
(
void
*
arg
)
{
char
tmpfile
[
256
],
*
filename
=
(
char
*
)
arg
;
int
j
,
i
;
time_t
now
=
time
(
NULL
);
FILE
*
fp
;
/* Change state to ACTIVE, to signal there is a saving thead working. */
pthread_mutex_lock
(
&
server
.
bgsavethread_mutex
);
...
...
@@ -362,11 +369,16 @@ void *dsRdbSave_thread(void *arg) {
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
;
redisLog
(
REDIS_WARNING
,
"Failed opening .rdb for saving: %s"
,
strerror
(
errno
));
dsRdbSaveSetState
(
REDIS_BGSAVE_THREAD_DONE_ERR
);
return
NULL
;
}
if
(
fwrite
(
"REDIS0001"
,
9
,
1
,
fp
)
==
0
)
goto
werr
;
sleep
(
5
);
#if 0
/* Scan all diskstore dirs looking for keys */
for (j = 0; j < 256; j++) {
for (i = 0; i < 256; i++) {
...
...
@@ -377,6 +389,7 @@ void *dsRdbSave_thread(void *arg) {
if (rdbSaveLen(fp,j) == -1) goto werr;
}
}
#endif
/* Make sure data will not remain on the OS's output buffers */
fflush
(
fp
);
...
...
@@ -389,16 +402,20 @@ void *dsRdbSave_thread(void *arg) {
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
;
dsRdbSaveSetState
(
REDIS_BGSAVE_THREAD_DONE_ERR
);
return
NULL
;
}
redisLog
(
REDIS_NOTICE
,
"DB saved on disk"
);
return
REDIS_OK
;
dsRdbSaveSetState
(
REDIS_BGSAVE_THREAD_DONE_OK
);
return
NULL
;
werr:
zfree
(
filename
);
fclose
(
fp
);
unlink
(
tmpfile
);
dsRdbSaveSetState
(
REDIS_BGSAVE_THREAD_DONE_ERR
);
redisLog
(
REDIS_WARNING
,
"Write error saving DB on disk: %s"
,
strerror
(
errno
));
return
NULL
;
}
int
dsRdbSave
(
char
*
filename
)
{
...
...
src/rdb.c
View file @
5b8ce853
...
...
@@ -437,7 +437,8 @@ int rdbSave(char *filename) {
snprintf
(
tmpfile
,
256
,
"temp-%d.rdb"
,
(
int
)
getpid
());
fp
=
fopen
(
tmpfile
,
"w"
);
if
(
!
fp
)
{
redisLog
(
REDIS_WARNING
,
"Failed saving the DB: %s"
,
strerror
(
errno
));
redisLog
(
REDIS_WARNING
,
"Failed opening .rdb for saving: %s"
,
strerror
(
errno
));
return
REDIS_ERR
;
}
if
(
fwrite
(
"REDIS0001"
,
9
,
1
,
fp
)
==
0
)
goto
werr
;
...
...
@@ -973,7 +974,7 @@ void backgroundSaveDoneHandler(int exitcode, int bysignal) {
}
void
saveCommand
(
redisClient
*
c
)
{
if
(
server
.
bgsavechildpid
!=
-
1
||
server
.
bgsavethread
!=
(
pthread
-
t
)
-
1
)
{
if
(
server
.
bgsavechildpid
!=
-
1
||
server
.
bgsavethread
!=
(
pthread
_
t
)
-
1
)
{
addReplyError
(
c
,
"Background save already in progress"
);
return
;
}
...
...
@@ -985,7 +986,7 @@ void saveCommand(redisClient *c) {
}
void
bgsaveCommand
(
redisClient
*
c
)
{
if
(
server
.
bgsavechildpid
!=
-
1
||
server
.
bgsavethread
!=
(
pthread
-
t
)
-
1
)
{
if
(
server
.
bgsavechildpid
!=
-
1
||
server
.
bgsavethread
!=
(
pthread
_
t
)
-
1
)
{
addReplyError
(
c
,
"Background save already in progress"
);
return
;
}
...
...
src/redis.c
View file @
5b8ce853
...
...
@@ -608,10 +608,11 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
state
=
server
.
bgsavethread_state
;
pthread_mutex_unlock
(
&
server
.
bgsavethread_mutex
);
if
(
state
==
REDIS_BGSAVE_DONE_OK
||
state
==
REDIS_BGSAVE_DONE_ERR
)
if
(
state
==
REDIS_BGSAVE_THREAD_DONE_OK
||
state
==
REDIS_BGSAVE_THREAD_DONE_ERR
)
{
backgroundSaveDoneHandler
(
(
state
==
REDIS_BGSAVE_DONE_OK
)
?
0
:
1
,
0
);
(
state
==
REDIS_BGSAVE_
THREAD_
DONE_OK
)
?
0
:
1
,
0
);
}
}
}
else
if
(
!
server
.
ds_enabled
)
{
...
...
src/redis.h
View file @
5b8ce853
...
...
@@ -756,7 +756,7 @@ int rdbSaveObject(FILE *fp, robj *o);
off_t
rdbSavedObjectLen
(
robj
*
o
);
off_t
rdbSavedObjectPages
(
robj
*
o
);
robj
*
rdbLoadObject
(
int
type
,
FILE
*
fp
);
void
backgroundSaveDoneHandler
(
int
exitcode
,
int
bysignal
)
{
void
backgroundSaveDoneHandler
(
int
exitcode
,
int
bysignal
)
;
int
rdbSaveKeyValuePair
(
FILE
*
fp
,
redisDb
*
db
,
robj
*
key
,
robj
*
val
,
time_t
now
);
int
rdbLoadType
(
FILE
*
fp
);
time_t
rdbLoadTime
(
FILE
*
fp
);
...
...
@@ -800,6 +800,7 @@ robj *dsGet(redisDb *db, robj *key, time_t *expire);
int
dsDel
(
redisDb
*
db
,
robj
*
key
);
int
dsExists
(
redisDb
*
db
,
robj
*
key
);
void
dsFlushDb
(
int
dbid
);
int
dsRdbSave
(
char
*
filename
);
/* Disk Store Cache */
void
dsInit
(
void
);
...
...
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