Save the replid of yourself and any connected masters to storage. * Returns if no storage provider is used. */
| 2195 | /* Save the replid of yourself and any connected masters to storage. |
| 2196 | * Returns if no storage provider is used. */ |
| 2197 | void 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, |
no test coverage detected