MCPcopy Create free account
hub / github.com/Snapchat/KeyDB / saveMasterStatusToStorage

Function saveMasterStatusToStorage

src/replication.cpp:2197–2261  ·  view source on GitHub ↗

Save the replid of yourself and any connected masters to storage. * Returns if no storage provider is used. */

Source from the content-addressed store, hash-verified

2195/* Save the replid of yourself and any connected masters to storage.
2196 * Returns if no storage provider is used. */
2197void saveMasterStatusToStorage(bool fShutdown)
2198{
2199 if (!g_pserver->m_pstorageFactory || !g_pserver->metadataDb) return;
2200
2201 g_pserver->metadataDb->insert("repl-id", 7, g_pserver->replid, sizeof(g_pserver->replid), true);
2202 if (fShutdown)
2203 g_pserver->metadataDb->insert("repl-offset", 11, &g_pserver->master_repl_offset, sizeof(g_pserver->master_repl_offset), true);
2204 else
2205 g_pserver->metadataDb->erase("repl-offset", 11);
2206
2207 if (g_pserver->fActiveReplica || (!listLength(g_pserver->masters) && g_pserver->repl_backlog)) {
2208 int zero = 0;
2209 g_pserver->metadataDb->insert("repl-stream-db", 14, g_pserver->replicaseldb == -1 ? &zero : &g_pserver->replicaseldb,
2210 sizeof(g_pserver->replicaseldb), true);
2211 } else {
2212 struct redisMaster *miFirst = (redisMaster*)(listLength(g_pserver->masters) ? listNodeValue(listFirst(g_pserver->masters)) : NULL);
2213
2214 if (miFirst && miFirst->master) {
2215 g_pserver->metadataDb->insert("repl-stream-db", 14, &miFirst->master->db->id, sizeof(miFirst->master->db->id), true);
2216 }
2217 else if (miFirst && miFirst->cached_master) {
2218 g_pserver->metadataDb->insert("repl-stream-db", 14, &miFirst->cached_master->db->id, sizeof(miFirst->cached_master->db->id), true);
2219 }
2220 }
2221
2222 if (listLength(g_pserver->masters) == 0) {
2223 g_pserver->metadataDb->insert("repl-masters", 12, (void*)"", 0, true);
2224 return;
2225 }
2226 sds val = sds(sdsempty());
2227 listNode *ln;
2228 listIter li;
2229 redisMaster *mi;
2230 listRewind(g_pserver->masters,&li);
2231 while((ln = listNext(&li)) != NULL) {
2232 mi = (redisMaster*)listNodeValue(ln);
2233 if (mi->masterhost == NULL) {
2234 // if we don't know the host, no reason to save
2235 continue;
2236 }
2237 if (!mi->master) {
2238 // If master client is not available, use info from master struct - better than nothing
2239 if (mi->master_replid[0] == 0) {
2240 // if replid is null, there's no reason to save it
2241 continue;
2242 }
2243 val = sdscatfmt(val, "%s:%I:%s:%i;", mi->master_replid,
2244 mi->master_initial_offset,
2245 mi->masterhost,
2246 mi->masterport);
2247 }
2248 else {
2249 if (mi->master->replid[0] == 0) {
2250 // if replid is null, there's no reason to save it
2251 continue;
2252 }
2253 val = sdscatfmt(val, "%s:%I:%s:%i;", mi->master->replid,
2254 mi->master->reploff,

Callers 8

changeReplicationIdFunction · 0.85
readSyncBulkPayloadFunction · 0.85
replicationAddMasterFunction · 0.85
replicationUnsetMasterFunction · 0.85
initServerFunction · 0.85
prepareForShutdownFunction · 0.85
mainFunction · 0.85

Calls 8

sdsemptyFunction · 0.85
listRewindFunction · 0.85
listNextFunction · 0.85
sdscatfmtFunction · 0.85
sdslenFunction · 0.85
sdsfreeFunction · 0.85
insertMethod · 0.45
eraseMethod · 0.45

Tested by

no test coverage detected