Cluster: fix memory leak of cached master.
This is what happened: 1. Instance starts, is a slave in the cluster configuration, but actually server.masterhost is not set, so technically the instance is acting like a master. 2. loadDataFromDisk() calls replicationCacheMasterUsingMyself() even if the instance is a master, in the case it is logically a slave and the cluster is enabled. So now we have a cached master even if the instance is practically configured as a master (from the POV of server.masterhost value and so forth). 3. clusterCron() sees that the instance requires to replicate from its master, because logically it is a slave, so it calls replicationSetMaster() that will in turn call replicationCacheMasterUsingMyself(): before this commit, this call would overwrite the old cached master, creating a memory leak.
This commit is contained in:
parent
17bf0b25c1
commit
747be463d2
@ -2182,7 +2182,10 @@ void replicationSetMaster(char *ip, int port) {
|
|||||||
cancelReplicationHandshake();
|
cancelReplicationHandshake();
|
||||||
/* Before destroying our master state, create a cached master using
|
/* Before destroying our master state, create a cached master using
|
||||||
* our own parameters, to later PSYNC with the new master. */
|
* our own parameters, to later PSYNC with the new master. */
|
||||||
if (was_master) replicationCacheMasterUsingMyself();
|
if (was_master) {
|
||||||
|
replicationDiscardCachedMaster();
|
||||||
|
replicationCacheMasterUsingMyself();
|
||||||
|
}
|
||||||
server.repl_state = REPL_STATE_CONNECT;
|
server.repl_state = REPL_STATE_CONNECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4719,12 +4719,14 @@ void loadDataFromDisk(void) {
|
|||||||
(float)(ustime()-start)/1000000);
|
(float)(ustime()-start)/1000000);
|
||||||
|
|
||||||
/* Restore the replication ID / offset from the RDB file. */
|
/* Restore the replication ID / offset from the RDB file. */
|
||||||
if ((server.masterhost || (server.cluster_enabled && nodeIsSlave(server.cluster->myself)))&&
|
if ((server.masterhost ||
|
||||||
|
(server.cluster_enabled &&
|
||||||
|
nodeIsSlave(server.cluster->myself))) &&
|
||||||
rsi.repl_id_is_set &&
|
rsi.repl_id_is_set &&
|
||||||
rsi.repl_offset != -1 &&
|
rsi.repl_offset != -1 &&
|
||||||
/* Note that older implementations may save a repl_stream_db
|
/* Note that older implementations may save a repl_stream_db
|
||||||
* of -1 inside the RDB file in a wrong way, see more information
|
* of -1 inside the RDB file in a wrong way, see more
|
||||||
* in function rdbPopulateSaveInfo. */
|
* information in function rdbPopulateSaveInfo. */
|
||||||
rsi.repl_stream_db != -1)
|
rsi.repl_stream_db != -1)
|
||||||
{
|
{
|
||||||
memcpy(server.replid,rsi.repl_id,sizeof(server.replid));
|
memcpy(server.replid,rsi.repl_id,sizeof(server.replid));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user