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
be4bc1a5
Commit
be4bc1a5
authored
Mar 03, 2020
by
antirez
Browse files
Remove RDB files used for replication in persistence-less instances.
parent
07dc1b42
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/replication.c
View file @
be4bc1a5
...
...
@@ -45,6 +45,11 @@ void replicationSendAck(void);
void
putSlaveOnline
(
client
*
slave
);
int
cancelReplicationHandshake
(
void
);
/* We take a global flag to remember if this instance generated an RDB
* because of replication, so that we can remove the RDB file in case
* the instance is configured to have no persistence. */
int
RDBGeneratedByReplication
=
0
;
/* --------------------------- Utility functions ---------------------------- */
/* Return the pointer to a string representing the slave ip:listening_port
...
...
@@ -591,6 +596,10 @@ int startBgsaveForReplication(int mincapa) {
retval
=
C_ERR
;
}
/* If we succeeded to start a BGSAVE with disk target, let's remember
* this fact, so that we can later delete the file if needed. */
if
(
retval
==
C_OK
&&
!
socket_target
)
RDBGeneratedByReplication
=
1
;
/* If we failed to BGSAVE, remove the slaves waiting for a full
* resynchronization from the list of slaves, inform them with
* an error about what happened, close the connection ASAP. */
...
...
@@ -883,6 +892,36 @@ void putSlaveOnline(client *slave) {
replicationGetSlaveName
(
slave
));
}
/* We call this function periodically to remove an RDB file that was
* generated because of replication, in an instance that is otherwise
* without any persistence. We don't want instances without persistence
* to take RDB files around, this violates certain policies in certain
* environments. */
void
removeRDBUsedToSyncReplicas
(
void
)
{
if
(
allPersistenceDisabled
()
&&
RDBGeneratedByReplication
)
{
client
*
slave
;
listNode
*
ln
;
listIter
li
;
int
delrdb
=
1
;
listRewind
(
server
.
slaves
,
&
li
);
while
((
ln
=
listNext
(
&
li
)))
{
slave
=
ln
->
value
;
if
(
slave
->
replstate
==
SLAVE_STATE_WAIT_BGSAVE_START
||
slave
->
replstate
==
SLAVE_STATE_WAIT_BGSAVE_END
||
slave
->
replstate
==
SLAVE_STATE_SEND_BULK
)
{
delrdb
=
0
;
break
;
/* No need to check the other replicas. */
}
}
if
(
delrdb
)
{
RDBGeneratedByReplication
=
0
;
unlink
(
server
.
rdb_filename
);
}
}
}
void
sendBulkToSlave
(
connection
*
conn
)
{
client
*
slave
=
connGetPrivateData
(
conn
);
char
buf
[
PROTO_IOBUF_LEN
];
...
...
@@ -894,7 +933,8 @@ void sendBulkToSlave(connection *conn) {
if
(
slave
->
replpreamble
)
{
nwritten
=
connWrite
(
conn
,
slave
->
replpreamble
,
sdslen
(
slave
->
replpreamble
));
if
(
nwritten
==
-
1
)
{
serverLog
(
LL_VERBOSE
,
"Write error sending RDB preamble to replica: %s"
,
serverLog
(
LL_VERBOSE
,
"Write error sending RDB preamble to replica: %s"
,
connGetLastError
(
conn
));
freeClient
(
slave
);
return
;
...
...
@@ -1639,12 +1679,14 @@ void readSyncBulkPayload(connection *conn) {
"Failed trying to load the MASTER synchronization "
"DB from disk"
);
cancelReplicationHandshake
();
if
(
allPersistenceDisabled
())
unlink
(
server
.
rdb_filename
);
/* Note that there's no point in restarting the AOF on sync failure,
it'll be restarted when sync succeeds or replica promoted. */
return
;
}
/* Cleanup. */
if
(
allPersistenceDisabled
())
unlink
(
server
.
rdb_filename
);
zfree
(
server
.
repl_transfer_tmpfile
);
close
(
server
.
repl_transfer_fd
);
server
.
repl_transfer_fd
=
-
1
;
...
...
@@ -3149,6 +3191,10 @@ void replicationCron(void) {
}
}
/* Remove the RDB file used for replication if Redis is not running
* with any persistence. */
removeRDBUsedToSyncReplicas
();
/* Refresh the number of slaves with lag <= min-slaves-max-lag. */
refreshGoodSlavesCount
();
replication_cron_loops
++
;
/* Incremented with frequency 1 HZ. */
...
...
src/server.c
View file @
be4bc1a5
...
...
@@ -1455,12 +1455,20 @@ void updateDictResizePolicy(void) {
dictDisableResize();
}
/* Return true if there are no active children processes doing RDB saving,
* AOF rewriting, or some side process spawned by a loaded module. */
int hasActiveChildProcess() {
return server.rdb_child_pid != -1 ||
server.aof_child_pid != -1 ||
server.module_child_pid != -1;
}
/* Return true if this instance has persistence completely turned off:
* both RDB and AOF are disabled. */
int allPersistenceDisabled(void) {
return server.saveparamslen == 0 && server.aof_state == AOF_OFF;
}
/* ======================= Cron: called every 100 ms ======================== */
/* Add a sample to the operations per second array of samples. */
...
...
src/server.h
View file @
be4bc1a5
...
...
@@ -1786,6 +1786,7 @@ void loadingProgress(off_t pos);
void
stopLoading
(
int
success
);
void
startSaving
(
int
rdbflags
);
void
stopSaving
(
int
success
);
int
allPersistenceDisabled
(
void
);
#define DISK_ERROR_TYPE_AOF 1
/* Don't accept writes: AOF errors. */
#define DISK_ERROR_TYPE_RDB 2
/* Don't accept writes: RDB errors. */
...
...
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