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
b919d952
Commit
b919d952
authored
Oct 07, 2014
by
antirez
Browse files
RDB file creation refactored to target non-disk target.
parent
d15ffcd6
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/rdb.c
View file @
b919d952
...
@@ -627,45 +627,37 @@ int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val,
...
@@ -627,45 +627,37 @@ int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val,
return
1
;
return
1
;
}
}
/* Save the DB on disk. Return REDIS_ERR on error, REDIS_OK on success */
/* Produces a dump of the database in RDB format sending it to the specified
int
rdbSave
(
char
*
filename
)
{
* Redis I/O channel. On success REDIS_OK is returned, otherwise REDIS_ERR
* is returned and part of the output, or all the output, can be
* missing because of I/O errors.
*
* When the function returns REDIS_ERR and if 'error' is not NULL, the
* integer pointed by 'error' is set to the value of errno just after the I/O
* error. */
int
rdbSaveRio
(
rio
*
rdb
,
int
*
error
)
{
dictIterator
*
di
=
NULL
;
dictIterator
*
di
=
NULL
;
dictEntry
*
de
;
dictEntry
*
de
;
char
tmpfile
[
256
];
char
magic
[
10
];
char
magic
[
10
];
int
j
;
int
j
;
long
long
now
=
mstime
();
long
long
now
=
mstime
();
FILE
*
fp
;
rio
rdb
;
uint64_t
cksum
;
uint64_t
cksum
;
snprintf
(
tmpfile
,
256
,
"temp-%d.rdb"
,
(
int
)
getpid
());
fp
=
fopen
(
tmpfile
,
"w"
);
if
(
!
fp
)
{
redisLog
(
REDIS_WARNING
,
"Failed opening .rdb for saving: %s"
,
strerror
(
errno
));
return
REDIS_ERR
;
}
rioInitWithFile
(
&
rdb
,
fp
);
if
(
server
.
rdb_checksum
)
if
(
server
.
rdb_checksum
)
rdb
.
update_cksum
=
rioGenericUpdateChecksum
;
rdb
->
update_cksum
=
rioGenericUpdateChecksum
;
snprintf
(
magic
,
sizeof
(
magic
),
"REDIS%04d"
,
REDIS_RDB_VERSION
);
snprintf
(
magic
,
sizeof
(
magic
),
"REDIS%04d"
,
REDIS_RDB_VERSION
);
if
(
rdbWriteRaw
(
&
rdb
,
magic
,
9
)
==
-
1
)
goto
werr
;
if
(
rdbWriteRaw
(
rdb
,
magic
,
9
)
==
-
1
)
goto
werr
;
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
redisDb
*
db
=
server
.
db
+
j
;
redisDb
*
db
=
server
.
db
+
j
;
dict
*
d
=
db
->
dict
;
dict
*
d
=
db
->
dict
;
if
(
dictSize
(
d
)
==
0
)
continue
;
if
(
dictSize
(
d
)
==
0
)
continue
;
di
=
dictGetSafeIterator
(
d
);
di
=
dictGetSafeIterator
(
d
);
if
(
!
di
)
{
if
(
!
di
)
return
REDIS_ERR
;
fclose
(
fp
);
return
REDIS_ERR
;
}
/* Write the SELECT DB opcode */
/* Write the SELECT DB opcode */
if
(
rdbSaveType
(
&
rdb
,
REDIS_RDB_OPCODE_SELECTDB
)
==
-
1
)
goto
werr
;
if
(
rdbSaveType
(
rdb
,
REDIS_RDB_OPCODE_SELECTDB
)
==
-
1
)
goto
werr
;
if
(
rdbSaveLen
(
&
rdb
,
j
)
==
-
1
)
goto
werr
;
if
(
rdbSaveLen
(
rdb
,
j
)
==
-
1
)
goto
werr
;
/* Iterate this DB writing every entry */
/* Iterate this DB writing every entry */
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
...
@@ -675,20 +667,48 @@ int rdbSave(char *filename) {
...
@@ -675,20 +667,48 @@ int rdbSave(char *filename) {
initStaticStringObject
(
key
,
keystr
);
initStaticStringObject
(
key
,
keystr
);
expire
=
getExpire
(
db
,
&
key
);
expire
=
getExpire
(
db
,
&
key
);
if
(
rdbSaveKeyValuePair
(
&
rdb
,
&
key
,
o
,
expire
,
now
)
==
-
1
)
goto
werr
;
if
(
rdbSaveKeyValuePair
(
rdb
,
&
key
,
o
,
expire
,
now
)
==
-
1
)
goto
werr
;
}
}
dictReleaseIterator
(
di
);
dictReleaseIterator
(
di
);
}
}
di
=
NULL
;
/* So that we don't release it again on error. */
di
=
NULL
;
/* So that we don't release it again on error. */
/* EOF opcode */
/* EOF opcode */
if
(
rdbSaveType
(
&
rdb
,
REDIS_RDB_OPCODE_EOF
)
==
-
1
)
goto
werr
;
if
(
rdbSaveType
(
rdb
,
REDIS_RDB_OPCODE_EOF
)
==
-
1
)
goto
werr
;
/* CRC64 checksum. It will be zero if checksum computation is disabled, the
/* CRC64 checksum. It will be zero if checksum computation is disabled, the
* loading code skips the check in this case. */
* loading code skips the check in this case. */
cksum
=
rdb
.
cksum
;
cksum
=
rdb
->
cksum
;
memrev64ifbe
(
&
cksum
);
memrev64ifbe
(
&
cksum
);
if
(
rioWrite
(
&
rdb
,
&
cksum
,
8
)
==
0
)
goto
werr
;
if
(
rioWrite
(
rdb
,
&
cksum
,
8
)
==
0
)
goto
werr
;
return
REDIS_OK
;
werr:
if
(
error
)
*
error
=
errno
;
if
(
di
)
dictReleaseIterator
(
di
);
return
REDIS_ERR
;
}
/* Save the DB on disk. Return REDIS_ERR on error, REDIS_OK on success. */
int
rdbSave
(
char
*
filename
)
{
char
tmpfile
[
256
];
FILE
*
fp
;
rio
rdb
;
int
error
;
snprintf
(
tmpfile
,
256
,
"temp-%d.rdb"
,
(
int
)
getpid
());
fp
=
fopen
(
tmpfile
,
"w"
);
if
(
!
fp
)
{
redisLog
(
REDIS_WARNING
,
"Failed opening .rdb for saving: %s"
,
strerror
(
errno
));
return
REDIS_ERR
;
}
rioInitWithFile
(
&
rdb
,
fp
);
if
(
rdbSaveRio
(
&
rdb
,
&
error
)
==
REDIS_ERR
)
{
errno
=
error
;
goto
werr
;
}
/* Make sure data will not remain on the OS's output buffers */
/* Make sure data will not remain on the OS's output buffers */
if
(
fflush
(
fp
)
==
EOF
)
goto
werr
;
if
(
fflush
(
fp
)
==
EOF
)
goto
werr
;
...
@@ -712,7 +732,6 @@ werr:
...
@@ -712,7 +732,6 @@ werr:
fclose
(
fp
);
fclose
(
fp
);
unlink
(
tmpfile
);
unlink
(
tmpfile
);
redisLog
(
REDIS_WARNING
,
"Write error saving DB on disk: %s"
,
strerror
(
errno
));
redisLog
(
REDIS_WARNING
,
"Write error saving DB on disk: %s"
,
strerror
(
errno
));
if
(
di
)
dictReleaseIterator
(
di
);
return
REDIS_ERR
;
return
REDIS_ERR
;
}
}
...
...
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