Lines Matching refs:ri
364 const char *sentinelRedisInstanceTypeStr(sentinelRedisInstance *ri);
365 void sentinelAbortFailover(sentinelRedisInstance *ri);
366 void sentinelEvent(int level, char *type, sentinelRedisInstance *ri, const char *fmt, ...);
371 int sentinelSendSlaveOf(sentinelRedisInstance *ri, char *host, int port);
375 int sentinelSendPing(sentinelRedisInstance *ri);
384 void releaseSentinelRedisInstance(sentinelRedisInstance *ri);
582 void sentinelEvent(int level, char *type, sentinelRedisInstance *ri, in sentinelEvent() argument
590 sentinelRedisInstance *master = (ri->flags & SRI_MASTER) ? in sentinelEvent()
591 NULL : ri->master; in sentinelEvent()
595 sentinelRedisInstanceTypeStr(ri), in sentinelEvent()
596 ri->name, ri->addr->ip, ri->addr->port, in sentinelEvent()
600 sentinelRedisInstanceTypeStr(ri), in sentinelEvent()
601 ri->name, ri->addr->ip, ri->addr->port); in sentinelEvent()
629 if (level == LL_WARNING && ri != NULL) { in sentinelEvent()
630 sentinelRedisInstance *master = (ri->flags & SRI_MASTER) ? in sentinelEvent()
631 ri : ri->master; in sentinelEvent()
649 sentinelRedisInstance *ri = dictGetVal(de); in sentinelGenerateInitialMonitorEvents() local
650 sentinelEvent(LL_WARNING,"+monitor",ri,"%@ quorum %d",ri->quorum); in sentinelGenerateInitialMonitorEvents()
974 instanceLink *releaseInstanceLink(instanceLink *link, sentinelRedisInstance *ri) in releaseInstanceLink() argument
979 if (ri && ri->link->cc) { in releaseInstanceLink()
990 if (cb->privdata == ri) { in releaseInstanceLink()
1018 int sentinelTryConnectionSharing(sentinelRedisInstance *ri) { in sentinelTryConnectionSharing() argument
1019 serverAssert(ri->flags & SRI_SENTINEL); in sentinelTryConnectionSharing()
1023 if (ri->runid == NULL) return C_ERR; /* No way to identify it. */ in sentinelTryConnectionSharing()
1024 if (ri->link->refcount > 1) return C_ERR; /* Already shared. */ in sentinelTryConnectionSharing()
1031 if (master == ri->master) continue; in sentinelTryConnectionSharing()
1033 NULL,0,ri->runid); in sentinelTryConnectionSharing()
1035 if (match == ri) continue; /* Should never happen but... safer. */ in sentinelTryConnectionSharing()
1039 releaseInstanceLink(ri->link,NULL); in sentinelTryConnectionSharing()
1040 ri->link = match->link; in sentinelTryConnectionSharing()
1054 int sentinelUpdateSentinelAddressInAllMasters(sentinelRedisInstance *ri) { in sentinelUpdateSentinelAddressInAllMasters() argument
1055 serverAssert(ri->flags & SRI_SENTINEL); in sentinelUpdateSentinelAddressInAllMasters()
1064 NULL,0,ri->runid); in sentinelUpdateSentinelAddressInAllMasters()
1075 if (match == ri) continue; /* Address already updated for it. */ in sentinelUpdateSentinelAddressInAllMasters()
1080 match->addr = dupSentinelAddr(ri->addr); in sentinelUpdateSentinelAddressInAllMasters()
1085 sentinelEvent(LL_NOTICE,"+sentinel-address-update", ri, in sentinelUpdateSentinelAddressInAllMasters()
1146 sentinelRedisInstance *ri; in createSentinelRedisInstance() local
1180 ri = zmalloc(sizeof(*ri)); in createSentinelRedisInstance()
1183 ri->flags = flags; in createSentinelRedisInstance()
1184 ri->name = sdsname; in createSentinelRedisInstance()
1185 ri->runid = NULL; in createSentinelRedisInstance()
1186 ri->config_epoch = 0; in createSentinelRedisInstance()
1187 ri->addr = addr; in createSentinelRedisInstance()
1188 ri->link = createInstanceLink(); in createSentinelRedisInstance()
1189 ri->last_pub_time = mstime(); in createSentinelRedisInstance()
1190 ri->last_hello_time = mstime(); in createSentinelRedisInstance()
1191 ri->last_master_down_reply_time = mstime(); in createSentinelRedisInstance()
1192 ri->s_down_since_time = 0; in createSentinelRedisInstance()
1193 ri->o_down_since_time = 0; in createSentinelRedisInstance()
1194 ri->down_after_period = master ? master->down_after_period : in createSentinelRedisInstance()
1196 ri->master_link_down_time = 0; in createSentinelRedisInstance()
1197 ri->auth_pass = NULL; in createSentinelRedisInstance()
1198 ri->slave_priority = SENTINEL_DEFAULT_SLAVE_PRIORITY; in createSentinelRedisInstance()
1199 ri->slave_reconf_sent_time = 0; in createSentinelRedisInstance()
1200 ri->slave_master_host = NULL; in createSentinelRedisInstance()
1201 ri->slave_master_port = 0; in createSentinelRedisInstance()
1202 ri->slave_master_link_status = SENTINEL_MASTER_LINK_STATUS_DOWN; in createSentinelRedisInstance()
1203 ri->slave_repl_offset = 0; in createSentinelRedisInstance()
1204 ri->sentinels = dictCreate(&instancesDictType,NULL); in createSentinelRedisInstance()
1205 ri->quorum = quorum; in createSentinelRedisInstance()
1206 ri->parallel_syncs = SENTINEL_DEFAULT_PARALLEL_SYNCS; in createSentinelRedisInstance()
1207 ri->master = master; in createSentinelRedisInstance()
1208 ri->slaves = dictCreate(&instancesDictType,NULL); in createSentinelRedisInstance()
1209 ri->info_refresh = 0; in createSentinelRedisInstance()
1212 ri->leader = NULL; in createSentinelRedisInstance()
1213 ri->leader_epoch = 0; in createSentinelRedisInstance()
1214 ri->failover_epoch = 0; in createSentinelRedisInstance()
1215 ri->failover_state = SENTINEL_FAILOVER_STATE_NONE; in createSentinelRedisInstance()
1216 ri->failover_state_change_time = 0; in createSentinelRedisInstance()
1217 ri->failover_start_time = 0; in createSentinelRedisInstance()
1218 ri->failover_timeout = SENTINEL_DEFAULT_FAILOVER_TIMEOUT; in createSentinelRedisInstance()
1219 ri->failover_delay_logged = 0; in createSentinelRedisInstance()
1220 ri->promoted_slave = NULL; in createSentinelRedisInstance()
1221 ri->notification_script = NULL; in createSentinelRedisInstance()
1222 ri->client_reconfig_script = NULL; in createSentinelRedisInstance()
1223 ri->info = NULL; in createSentinelRedisInstance()
1226 ri->role_reported = ri->flags & (SRI_MASTER|SRI_SLAVE); in createSentinelRedisInstance()
1227 ri->role_reported_time = mstime(); in createSentinelRedisInstance()
1228 ri->slave_conf_change_time = mstime(); in createSentinelRedisInstance()
1231 dictAdd(table, ri->name, ri); in createSentinelRedisInstance()
1232 return ri; in createSentinelRedisInstance()
1239 void releaseSentinelRedisInstance(sentinelRedisInstance *ri) { in releaseSentinelRedisInstance() argument
1241 dictRelease(ri->sentinels); in releaseSentinelRedisInstance()
1242 dictRelease(ri->slaves); in releaseSentinelRedisInstance()
1245 releaseInstanceLink(ri->link,ri); in releaseSentinelRedisInstance()
1248 sdsfree(ri->name); in releaseSentinelRedisInstance()
1249 sdsfree(ri->runid); in releaseSentinelRedisInstance()
1250 sdsfree(ri->notification_script); in releaseSentinelRedisInstance()
1251 sdsfree(ri->client_reconfig_script); in releaseSentinelRedisInstance()
1252 sdsfree(ri->slave_master_host); in releaseSentinelRedisInstance()
1253 sdsfree(ri->leader); in releaseSentinelRedisInstance()
1254 sdsfree(ri->auth_pass); in releaseSentinelRedisInstance()
1255 sdsfree(ri->info); in releaseSentinelRedisInstance()
1256 releaseSentinelAddr(ri->addr); in releaseSentinelRedisInstance()
1259 if ((ri->flags & SRI_SLAVE) && (ri->flags & SRI_PROMOTED) && ri->master) in releaseSentinelRedisInstance()
1260 ri->master->promoted_slave = NULL; in releaseSentinelRedisInstance()
1262 zfree(ri); in releaseSentinelRedisInstance()
1267 sentinelRedisInstance *ri, char *ip, int port) in sentinelRedisInstanceLookupSlave() argument
1273 serverAssert(ri->flags & SRI_MASTER); in sentinelRedisInstanceLookupSlave()
1276 slave = dictFetchValue(ri->slaves,key); in sentinelRedisInstanceLookupSlave()
1282 const char *sentinelRedisInstanceTypeStr(sentinelRedisInstance *ri) { in sentinelRedisInstanceTypeStr() argument
1283 if (ri->flags & SRI_MASTER) return "master"; in sentinelRedisInstanceTypeStr()
1284 else if (ri->flags & SRI_SLAVE) return "slave"; in sentinelRedisInstanceTypeStr()
1285 else if (ri->flags & SRI_SENTINEL) return "sentinel"; in sentinelRedisInstanceTypeStr()
1309 sentinelRedisInstance *ri = dictGetVal(de); in removeMatchingSentinelFromMaster() local
1311 if (ri->runid && strcmp(ri->runid,runid) == 0) { in removeMatchingSentinelFromMaster()
1312 dictDelete(master->sentinels,ri->name); in removeMatchingSentinelFromMaster()
1334 sentinelRedisInstance *ri = dictGetVal(de); in getSentinelRedisInstanceByAddrAndRunID() local
1336 if (runid && !ri->runid) continue; in getSentinelRedisInstanceByAddrAndRunID()
1337 if ((runid == NULL || strcmp(ri->runid, runid) == 0) && in getSentinelRedisInstanceByAddrAndRunID()
1338 (ip == NULL || (strcmp(ri->addr->ip, ip) == 0 && in getSentinelRedisInstanceByAddrAndRunID()
1339 ri->addr->port == port))) in getSentinelRedisInstanceByAddrAndRunID()
1341 instance = ri; in getSentinelRedisInstanceByAddrAndRunID()
1351 sentinelRedisInstance *ri; in sentinelGetMasterByName() local
1354 ri = dictFetchValue(sentinel.masters,sdsname); in sentinelGetMasterByName()
1356 return ri; in sentinelGetMasterByName()
1366 sentinelRedisInstance *ri = dictGetVal(de); in sentinelAddFlagsToDictOfRedisInstances() local
1367 ri->flags |= flags; in sentinelAddFlagsToDictOfRedisInstances()
1380 sentinelRedisInstance *ri = dictGetVal(de); in sentinelDelFlagsToDictOfRedisInstances() local
1381 ri->flags &= ~flags; in sentinelDelFlagsToDictOfRedisInstances()
1398 void sentinelResetMaster(sentinelRedisInstance *ri, int flags) { in sentinelResetMaster() argument
1399 serverAssert(ri->flags & SRI_MASTER); in sentinelResetMaster()
1400 dictRelease(ri->slaves); in sentinelResetMaster()
1401 ri->slaves = dictCreate(&instancesDictType,NULL); in sentinelResetMaster()
1403 dictRelease(ri->sentinels); in sentinelResetMaster()
1404 ri->sentinels = dictCreate(&instancesDictType,NULL); in sentinelResetMaster()
1406 instanceLinkCloseConnection(ri->link,ri->link->cc); in sentinelResetMaster()
1407 instanceLinkCloseConnection(ri->link,ri->link->pc); in sentinelResetMaster()
1408 ri->flags &= SRI_MASTER; in sentinelResetMaster()
1409 if (ri->leader) { in sentinelResetMaster()
1410 sdsfree(ri->leader); in sentinelResetMaster()
1411 ri->leader = NULL; in sentinelResetMaster()
1413 ri->failover_state = SENTINEL_FAILOVER_STATE_NONE; in sentinelResetMaster()
1414 ri->failover_state_change_time = 0; in sentinelResetMaster()
1415 ri->failover_start_time = 0; /* We can failover again ASAP. */ in sentinelResetMaster()
1416 ri->promoted_slave = NULL; in sentinelResetMaster()
1417 sdsfree(ri->runid); in sentinelResetMaster()
1418 sdsfree(ri->slave_master_host); in sentinelResetMaster()
1419 ri->runid = NULL; in sentinelResetMaster()
1420 ri->slave_master_host = NULL; in sentinelResetMaster()
1421 ri->link->act_ping_time = mstime(); in sentinelResetMaster()
1422 ri->link->last_ping_time = 0; in sentinelResetMaster()
1423 ri->link->last_avail_time = mstime(); in sentinelResetMaster()
1424 ri->link->last_pong_time = mstime(); in sentinelResetMaster()
1425 ri->role_reported_time = mstime(); in sentinelResetMaster()
1426 ri->role_reported = SRI_MASTER; in sentinelResetMaster()
1428 sentinelEvent(LL_WARNING,"+reset-master",ri,"%@"); in sentinelResetMaster()
1440 sentinelRedisInstance *ri = dictGetVal(de); in sentinelResetMastersByPattern() local
1442 if (ri->name) { in sentinelResetMastersByPattern()
1443 if (stringmatch(pattern,ri->name,0)) { in sentinelResetMastersByPattern()
1444 sentinelResetMaster(ri,flags); in sentinelResetMastersByPattern()
1519 int sentinelRedisInstanceNoDownFor(sentinelRedisInstance *ri, mstime_t ms) { in sentinelRedisInstanceNoDownFor() argument
1522 most_recent = ri->s_down_since_time; in sentinelRedisInstanceNoDownFor()
1523 if (ri->o_down_since_time > most_recent) in sentinelRedisInstanceNoDownFor()
1524 most_recent = ri->o_down_since_time; in sentinelRedisInstanceNoDownFor()
1557 sentinelRedisInstance *ri = dictGetVal(de); in sentinelPropagateDownAfterPeriod() local
1558 ri->down_after_period = master->down_after_period; in sentinelPropagateDownAfterPeriod()
1564 char *sentinelGetInstanceTypeString(sentinelRedisInstance *ri) { in sentinelGetInstanceTypeString() argument
1565 if (ri->flags & SRI_MASTER) return "master"; in sentinelGetInstanceTypeString()
1566 else if (ri->flags & SRI_SLAVE) return "slave"; in sentinelGetInstanceTypeString()
1567 else if (ri->flags & SRI_SENTINEL) return "sentinel"; in sentinelGetInstanceTypeString()
1573 sentinelRedisInstance *ri; in sentinelHandleConfiguration() local
1591 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1592 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1593 ri->down_after_period = atoi(argv[2]); in sentinelHandleConfiguration()
1594 if (ri->down_after_period <= 0) in sentinelHandleConfiguration()
1596 sentinelPropagateDownAfterPeriod(ri); in sentinelHandleConfiguration()
1599 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1600 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1601 ri->failover_timeout = atoi(argv[2]); in sentinelHandleConfiguration()
1602 if (ri->failover_timeout <= 0) in sentinelHandleConfiguration()
1606 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1607 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1608 ri->parallel_syncs = atoi(argv[2]); in sentinelHandleConfiguration()
1611 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1612 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1615 ri->notification_script = sdsnew(argv[2]); in sentinelHandleConfiguration()
1618 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1619 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1623 ri->client_reconfig_script = sdsnew(argv[2]); in sentinelHandleConfiguration()
1626 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1627 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1628 ri->auth_pass = sdsnew(argv[2]); in sentinelHandleConfiguration()
1640 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1641 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1642 ri->config_epoch = strtoull(argv[2],NULL,10); in sentinelHandleConfiguration()
1646 if (ri->config_epoch > sentinel.current_epoch) in sentinelHandleConfiguration()
1647 sentinel.current_epoch = ri->config_epoch; in sentinelHandleConfiguration()
1650 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1651 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1652 ri->leader_epoch = strtoull(argv[2],NULL,10); in sentinelHandleConfiguration()
1657 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1658 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1660 atoi(argv[3]), ri->quorum, ri)) == NULL) in sentinelHandleConfiguration()
1670 ri = sentinelGetMasterByName(argv[1]); in sentinelHandleConfiguration()
1671 if (!ri) return "No such master with specified name."; in sentinelHandleConfiguration()
1673 atoi(argv[3]), ri->quorum, ri)) == NULL) in sentinelHandleConfiguration()
1710 sentinelRedisInstance *master, *ri; in rewriteConfigSentinelOption() local
1786 ri = dictGetVal(de); in rewriteConfigSentinelOption()
1787 slave_addr = ri->addr; in rewriteConfigSentinelOption()
1806 ri = dictGetVal(de); in rewriteConfigSentinelOption()
1807 if (ri->runid == NULL) continue; in rewriteConfigSentinelOption()
1810 master->name, ri->addr->ip, ri->addr->port, ri->runid); in rewriteConfigSentinelOption()
1873 void sentinelSendAuthIfNeeded(sentinelRedisInstance *ri, redisAsyncContext *c) { in sentinelSendAuthIfNeeded() argument
1874 char *auth_pass = (ri->flags & SRI_MASTER) ? ri->auth_pass : in sentinelSendAuthIfNeeded()
1875 ri->master->auth_pass; in sentinelSendAuthIfNeeded()
1878 if (redisAsyncCommand(c, sentinelDiscardReplyCallback, ri, "AUTH %s", in sentinelSendAuthIfNeeded()
1879 auth_pass) == C_OK) ri->link->pending_commands++; in sentinelSendAuthIfNeeded()
1889 void sentinelSetClientName(sentinelRedisInstance *ri, redisAsyncContext *c, char *type) { in sentinelSetClientName() argument
1893 if (redisAsyncCommand(c, sentinelDiscardReplyCallback, ri, in sentinelSetClientName()
1896 ri->link->pending_commands++; in sentinelSetClientName()
1903 void sentinelReconnectInstance(sentinelRedisInstance *ri) { in sentinelReconnectInstance() argument
1904 if (ri->link->disconnected == 0) return; in sentinelReconnectInstance()
1905 if (ri->addr->port == 0) return; /* port == 0 means invalid address. */ in sentinelReconnectInstance()
1906 instanceLink *link = ri->link; in sentinelReconnectInstance()
1909 if (now - ri->link->last_reconn_time < SENTINEL_PING_PERIOD) return; in sentinelReconnectInstance()
1910 ri->link->last_reconn_time = now; in sentinelReconnectInstance()
1914 link->cc = redisAsyncConnectBind(ri->addr->ip,ri->addr->port,NET_FIRST_BIND_ADDR); in sentinelReconnectInstance()
1916 sentinelEvent(LL_DEBUG,"-cmd-link-reconnection",ri,"%@ #%s", in sentinelReconnectInstance()
1928 sentinelSendAuthIfNeeded(ri,link->cc); in sentinelReconnectInstance()
1929 sentinelSetClientName(ri,link->cc,"cmd"); in sentinelReconnectInstance()
1932 sentinelSendPing(ri); in sentinelReconnectInstance()
1936 if ((ri->flags & (SRI_MASTER|SRI_SLAVE)) && link->pc == NULL) { in sentinelReconnectInstance()
1937 link->pc = redisAsyncConnectBind(ri->addr->ip,ri->addr->port,NET_FIRST_BIND_ADDR); in sentinelReconnectInstance()
1939 sentinelEvent(LL_DEBUG,"-pubsub-link-reconnection",ri,"%@ #%s", in sentinelReconnectInstance()
1952 sentinelSendAuthIfNeeded(ri,link->pc); in sentinelReconnectInstance()
1953 sentinelSetClientName(ri,link->pc,"pubsub"); in sentinelReconnectInstance()
1956 sentinelReceiveHelloMessages, ri, "SUBSCRIBE %s", in sentinelReconnectInstance()
1968 if (link->cc && (ri->flags & SRI_SENTINEL || link->pc)) in sentinelReconnectInstance()
1988 void sentinelRefreshInstanceInfo(sentinelRedisInstance *ri, const char *info) { in sentinelRefreshInstanceInfo() argument
1994 sdsfree(ri->info); in sentinelRefreshInstanceInfo()
1995 ri->info = sdsnew(info); in sentinelRefreshInstanceInfo()
1999 ri->master_link_down_time = 0; in sentinelRefreshInstanceInfo()
2009 if (ri->runid == NULL) { in sentinelRefreshInstanceInfo()
2010 ri->runid = sdsnewlen(l+7,40); in sentinelRefreshInstanceInfo()
2012 if (strncmp(ri->runid,l+7,40) != 0) { in sentinelRefreshInstanceInfo()
2013 sentinelEvent(LL_NOTICE,"+reboot",ri,"%@"); in sentinelRefreshInstanceInfo()
2014 sdsfree(ri->runid); in sentinelRefreshInstanceInfo()
2015 ri->runid = sdsnewlen(l+7,40); in sentinelRefreshInstanceInfo()
2022 if ((ri->flags & SRI_MASTER) && in sentinelRefreshInstanceInfo()
2050 if (sentinelRedisInstanceLookupSlave(ri,ip,atoi(port)) == NULL) { in sentinelRefreshInstanceInfo()
2052 atoi(port), ri->quorum, ri)) != NULL) in sentinelRefreshInstanceInfo()
2064 ri->master_link_down_time = strtoll(l+31,NULL,10)*1000; in sentinelRefreshInstanceInfo()
2074 if (ri->slave_master_host == NULL || in sentinelRefreshInstanceInfo()
2075 strcasecmp(l+12,ri->slave_master_host)) in sentinelRefreshInstanceInfo()
2077 sdsfree(ri->slave_master_host); in sentinelRefreshInstanceInfo()
2078 ri->slave_master_host = sdsnew(l+12); in sentinelRefreshInstanceInfo()
2079 ri->slave_conf_change_time = mstime(); in sentinelRefreshInstanceInfo()
2087 if (ri->slave_master_port != slave_master_port) { in sentinelRefreshInstanceInfo()
2088 ri->slave_master_port = slave_master_port; in sentinelRefreshInstanceInfo()
2089 ri->slave_conf_change_time = mstime(); in sentinelRefreshInstanceInfo()
2095 ri->slave_master_link_status = in sentinelRefreshInstanceInfo()
2103 ri->slave_priority = atoi(l+15); in sentinelRefreshInstanceInfo()
2107 ri->slave_repl_offset = strtoull(l+18,NULL,10); in sentinelRefreshInstanceInfo()
2110 ri->info_refresh = mstime(); in sentinelRefreshInstanceInfo()
2118 if (role != ri->role_reported) { in sentinelRefreshInstanceInfo()
2119 ri->role_reported_time = mstime(); in sentinelRefreshInstanceInfo()
2120 ri->role_reported = role; in sentinelRefreshInstanceInfo()
2121 if (role == SRI_SLAVE) ri->slave_conf_change_time = mstime(); in sentinelRefreshInstanceInfo()
2125 ((ri->flags & (SRI_MASTER|SRI_SLAVE)) == role) ? in sentinelRefreshInstanceInfo()
2127 ri, "%@ new reported role is %s", in sentinelRefreshInstanceInfo()
2129 ri->flags & SRI_MASTER ? "master" : "slave"); in sentinelRefreshInstanceInfo()
2137 if ((ri->flags & SRI_MASTER) && role == SRI_SLAVE) { in sentinelRefreshInstanceInfo()
2144 if ((ri->flags & SRI_SLAVE) && role == SRI_MASTER) { in sentinelRefreshInstanceInfo()
2147 if ((ri->flags & SRI_PROMOTED) && in sentinelRefreshInstanceInfo()
2148 (ri->master->flags & SRI_FAILOVER_IN_PROGRESS) && in sentinelRefreshInstanceInfo()
2149 (ri->master->failover_state == in sentinelRefreshInstanceInfo()
2157 ri->master->config_epoch = ri->master->failover_epoch; in sentinelRefreshInstanceInfo()
2158 ri->master->failover_state = SENTINEL_FAILOVER_STATE_RECONF_SLAVES; in sentinelRefreshInstanceInfo()
2159 ri->master->failover_state_change_time = mstime(); in sentinelRefreshInstanceInfo()
2161 sentinelEvent(LL_WARNING,"+promoted-slave",ri,"%@"); in sentinelRefreshInstanceInfo()
2166 ri->master,"%@"); in sentinelRefreshInstanceInfo()
2167 sentinelCallClientReconfScript(ri->master,SENTINEL_LEADER, in sentinelRefreshInstanceInfo()
2168 "start",ri->master->addr,ri->addr); in sentinelRefreshInstanceInfo()
2169 sentinelForceHelloUpdateForMaster(ri->master); in sentinelRefreshInstanceInfo()
2176 if (!(ri->flags & SRI_PROMOTED) && in sentinelRefreshInstanceInfo()
2177 sentinelMasterLooksSane(ri->master) && in sentinelRefreshInstanceInfo()
2178 sentinelRedisInstanceNoDownFor(ri,wait_time) && in sentinelRefreshInstanceInfo()
2179 mstime() - ri->role_reported_time > wait_time) in sentinelRefreshInstanceInfo()
2181 int retval = sentinelSendSlaveOf(ri, in sentinelRefreshInstanceInfo()
2182 ri->master->addr->ip, in sentinelRefreshInstanceInfo()
2183 ri->master->addr->port); in sentinelRefreshInstanceInfo()
2185 sentinelEvent(LL_NOTICE,"+convert-to-slave",ri,"%@"); in sentinelRefreshInstanceInfo()
2191 if ((ri->flags & SRI_SLAVE) && in sentinelRefreshInstanceInfo()
2193 (ri->slave_master_port != ri->master->addr->port || in sentinelRefreshInstanceInfo()
2194 strcasecmp(ri->slave_master_host,ri->master->addr->ip))) in sentinelRefreshInstanceInfo()
2196 mstime_t wait_time = ri->master->failover_timeout; in sentinelRefreshInstanceInfo()
2200 if (sentinelMasterLooksSane(ri->master) && in sentinelRefreshInstanceInfo()
2201 sentinelRedisInstanceNoDownFor(ri,wait_time) && in sentinelRefreshInstanceInfo()
2202 mstime() - ri->slave_conf_change_time > wait_time) in sentinelRefreshInstanceInfo()
2204 int retval = sentinelSendSlaveOf(ri, in sentinelRefreshInstanceInfo()
2205 ri->master->addr->ip, in sentinelRefreshInstanceInfo()
2206 ri->master->addr->port); in sentinelRefreshInstanceInfo()
2208 sentinelEvent(LL_NOTICE,"+fix-slave-config",ri,"%@"); in sentinelRefreshInstanceInfo()
2214 if ((ri->flags & SRI_SLAVE) && role == SRI_SLAVE && in sentinelRefreshInstanceInfo()
2215 (ri->flags & (SRI_RECONF_SENT|SRI_RECONF_INPROG))) in sentinelRefreshInstanceInfo()
2218 if ((ri->flags & SRI_RECONF_SENT) && in sentinelRefreshInstanceInfo()
2219 ri->slave_master_host && in sentinelRefreshInstanceInfo()
2220 strcmp(ri->slave_master_host, in sentinelRefreshInstanceInfo()
2221 ri->master->promoted_slave->addr->ip) == 0 && in sentinelRefreshInstanceInfo()
2222 ri->slave_master_port == ri->master->promoted_slave->addr->port) in sentinelRefreshInstanceInfo()
2224 ri->flags &= ~SRI_RECONF_SENT; in sentinelRefreshInstanceInfo()
2225 ri->flags |= SRI_RECONF_INPROG; in sentinelRefreshInstanceInfo()
2226 sentinelEvent(LL_NOTICE,"+slave-reconf-inprog",ri,"%@"); in sentinelRefreshInstanceInfo()
2230 if ((ri->flags & SRI_RECONF_INPROG) && in sentinelRefreshInstanceInfo()
2231 ri->slave_master_link_status == SENTINEL_MASTER_LINK_STATUS_UP) in sentinelRefreshInstanceInfo()
2233 ri->flags &= ~SRI_RECONF_INPROG; in sentinelRefreshInstanceInfo()
2234 ri->flags |= SRI_RECONF_DONE; in sentinelRefreshInstanceInfo()
2235 sentinelEvent(LL_NOTICE,"+slave-reconf-done",ri,"%@"); in sentinelRefreshInstanceInfo()
2241 sentinelRedisInstance *ri = privdata; in sentinelInfoReplyCallback() local
2250 sentinelRefreshInstanceInfo(ri,r->str); in sentinelInfoReplyCallback()
2264 sentinelRedisInstance *ri = privdata; in sentinelPingReplyCallback() local
2286 (ri->flags & SRI_S_DOWN) && in sentinelPingReplyCallback()
2287 !(ri->flags & SRI_SCRIPT_KILL_SENT)) in sentinelPingReplyCallback()
2289 if (redisAsyncCommand(ri->link->cc, in sentinelPingReplyCallback()
2290 sentinelDiscardReplyCallback, ri, in sentinelPingReplyCallback()
2292 ri->link->pending_commands++; in sentinelPingReplyCallback()
2293 ri->flags |= SRI_SCRIPT_KILL_SENT; in sentinelPingReplyCallback()
2303 sentinelRedisInstance *ri = privdata; in sentinelPublishReplyCallback() local
2314 ri->last_pub_time = mstime(); in sentinelPublishReplyCallback()
2427 sentinelRedisInstance *ri = privdata; in sentinelReceiveHelloMessages() local
2431 if (!reply || !ri) return; in sentinelReceiveHelloMessages()
2437 ri->link->pc_last_activity = mstime(); in sentinelReceiveHelloMessages()
2465 int sentinelSendHello(sentinelRedisInstance *ri) { in sentinelSendHello() argument
2471 sentinelRedisInstance *master = (ri->flags & SRI_MASTER) ? ri : ri->master; in sentinelSendHello()
2474 if (ri->link->disconnected) return C_ERR; in sentinelSendHello()
2481 if (anetSockName(ri->link->cc->c.fd,ip,sizeof(ip),NULL) == -1) in sentinelSendHello()
2497 retval = redisAsyncCommand(ri->link->cc, in sentinelSendHello()
2498 sentinelPublishReplyCallback, ri, "PUBLISH %s %s", in sentinelSendHello()
2501 ri->link->pending_commands++; in sentinelSendHello()
2513 sentinelRedisInstance *ri = dictGetVal(de); in sentinelForceHelloUpdateDictOfRedisInstances() local
2514 if (ri->last_pub_time >= (SENTINEL_PUBLISH_PERIOD+1)) in sentinelForceHelloUpdateDictOfRedisInstances()
2515 ri->last_pub_time -= (SENTINEL_PUBLISH_PERIOD+1); in sentinelForceHelloUpdateDictOfRedisInstances()
2542 int sentinelSendPing(sentinelRedisInstance *ri) { in sentinelSendPing() argument
2543 int retval = redisAsyncCommand(ri->link->cc, in sentinelSendPing()
2544 sentinelPingReplyCallback, ri, "PING"); in sentinelSendPing()
2546 ri->link->pending_commands++; in sentinelSendPing()
2547 ri->link->last_ping_time = mstime(); in sentinelSendPing()
2551 if (ri->link->act_ping_time == 0) in sentinelSendPing()
2552 ri->link->act_ping_time = ri->link->last_ping_time; in sentinelSendPing()
2561 void sentinelSendPeriodicCommands(sentinelRedisInstance *ri) { in sentinelSendPeriodicCommands() argument
2568 if (ri->link->disconnected) return; in sentinelSendPeriodicCommands()
2576 if (ri->link->pending_commands >= in sentinelSendPeriodicCommands()
2577 SENTINEL_MAX_PENDING_COMMANDS * ri->link->refcount) return; in sentinelSendPeriodicCommands()
2587 if ((ri->flags & SRI_SLAVE) && in sentinelSendPeriodicCommands()
2588 ((ri->master->flags & (SRI_O_DOWN|SRI_FAILOVER_IN_PROGRESS)) || in sentinelSendPeriodicCommands()
2589 (ri->master_link_down_time != 0))) in sentinelSendPeriodicCommands()
2599 ping_period = ri->down_after_period; in sentinelSendPeriodicCommands()
2602 if ((ri->flags & SRI_SENTINEL) == 0 && in sentinelSendPeriodicCommands()
2603 (ri->info_refresh == 0 || in sentinelSendPeriodicCommands()
2604 (now - ri->info_refresh) > info_period)) in sentinelSendPeriodicCommands()
2607 retval = redisAsyncCommand(ri->link->cc, in sentinelSendPeriodicCommands()
2608 sentinelInfoReplyCallback, ri, "INFO"); in sentinelSendPeriodicCommands()
2609 if (retval == C_OK) ri->link->pending_commands++; in sentinelSendPeriodicCommands()
2610 } else if ((now - ri->link->last_pong_time) > ping_period && in sentinelSendPeriodicCommands()
2611 (now - ri->link->last_ping_time) > ping_period/2) { in sentinelSendPeriodicCommands()
2613 sentinelSendPing(ri); in sentinelSendPeriodicCommands()
2614 } else if ((now - ri->last_pub_time) > SENTINEL_PUBLISH_PERIOD) { in sentinelSendPeriodicCommands()
2616 sentinelSendHello(ri); in sentinelSendPeriodicCommands()
2636 void addReplySentinelRedisInstance(client *c, sentinelRedisInstance *ri) { in addReplySentinelRedisInstance() argument
2644 addReplyBulkCString(c,ri->name); in addReplySentinelRedisInstance()
2648 addReplyBulkCString(c,ri->addr->ip); in addReplySentinelRedisInstance()
2652 addReplyBulkLongLong(c,ri->addr->port); in addReplySentinelRedisInstance()
2656 addReplyBulkCString(c,ri->runid ? ri->runid : ""); in addReplySentinelRedisInstance()
2660 if (ri->flags & SRI_S_DOWN) flags = sdscat(flags,"s_down,"); in addReplySentinelRedisInstance()
2661 if (ri->flags & SRI_O_DOWN) flags = sdscat(flags,"o_down,"); in addReplySentinelRedisInstance()
2662 if (ri->flags & SRI_MASTER) flags = sdscat(flags,"master,"); in addReplySentinelRedisInstance()
2663 if (ri->flags & SRI_SLAVE) flags = sdscat(flags,"slave,"); in addReplySentinelRedisInstance()
2664 if (ri->flags & SRI_SENTINEL) flags = sdscat(flags,"sentinel,"); in addReplySentinelRedisInstance()
2665 if (ri->link->disconnected) flags = sdscat(flags,"disconnected,"); in addReplySentinelRedisInstance()
2666 if (ri->flags & SRI_MASTER_DOWN) flags = sdscat(flags,"master_down,"); in addReplySentinelRedisInstance()
2667 if (ri->flags & SRI_FAILOVER_IN_PROGRESS) in addReplySentinelRedisInstance()
2669 if (ri->flags & SRI_PROMOTED) flags = sdscat(flags,"promoted,"); in addReplySentinelRedisInstance()
2670 if (ri->flags & SRI_RECONF_SENT) flags = sdscat(flags,"reconf_sent,"); in addReplySentinelRedisInstance()
2671 if (ri->flags & SRI_RECONF_INPROG) flags = sdscat(flags,"reconf_inprog,"); in addReplySentinelRedisInstance()
2672 if (ri->flags & SRI_RECONF_DONE) flags = sdscat(flags,"reconf_done,"); in addReplySentinelRedisInstance()
2680 addReplyBulkLongLong(c,ri->link->pending_commands); in addReplySentinelRedisInstance()
2684 addReplyBulkLongLong(c,ri->link->refcount); in addReplySentinelRedisInstance()
2687 if (ri->flags & SRI_FAILOVER_IN_PROGRESS) { in addReplySentinelRedisInstance()
2689 addReplyBulkCString(c,(char*)sentinelFailoverStateStr(ri->failover_state)); in addReplySentinelRedisInstance()
2695 ri->link->act_ping_time ? (mstime() - ri->link->act_ping_time) : 0); in addReplySentinelRedisInstance()
2699 addReplyBulkLongLong(c,mstime() - ri->link->last_avail_time); in addReplySentinelRedisInstance()
2703 addReplyBulkLongLong(c,mstime() - ri->link->last_pong_time); in addReplySentinelRedisInstance()
2706 if (ri->flags & SRI_S_DOWN) { in addReplySentinelRedisInstance()
2708 addReplyBulkLongLong(c,mstime()-ri->s_down_since_time); in addReplySentinelRedisInstance()
2712 if (ri->flags & SRI_O_DOWN) { in addReplySentinelRedisInstance()
2714 addReplyBulkLongLong(c,mstime()-ri->o_down_since_time); in addReplySentinelRedisInstance()
2719 addReplyBulkLongLong(c,ri->down_after_period); in addReplySentinelRedisInstance()
2723 if (ri->flags & (SRI_MASTER|SRI_SLAVE)) { in addReplySentinelRedisInstance()
2725 addReplyBulkLongLong(c,mstime() - ri->info_refresh); in addReplySentinelRedisInstance()
2729 addReplyBulkCString(c, (ri->role_reported == SRI_MASTER) ? "master" : in addReplySentinelRedisInstance()
2734 addReplyBulkLongLong(c,mstime() - ri->role_reported_time); in addReplySentinelRedisInstance()
2739 if (ri->flags & SRI_MASTER) { in addReplySentinelRedisInstance()
2741 addReplyBulkLongLong(c,ri->config_epoch); in addReplySentinelRedisInstance()
2745 addReplyBulkLongLong(c,dictSize(ri->slaves)); in addReplySentinelRedisInstance()
2749 addReplyBulkLongLong(c,dictSize(ri->sentinels)); in addReplySentinelRedisInstance()
2753 addReplyBulkLongLong(c,ri->quorum); in addReplySentinelRedisInstance()
2757 addReplyBulkLongLong(c,ri->failover_timeout); in addReplySentinelRedisInstance()
2761 addReplyBulkLongLong(c,ri->parallel_syncs); in addReplySentinelRedisInstance()
2764 if (ri->notification_script) { in addReplySentinelRedisInstance()
2766 addReplyBulkCString(c,ri->notification_script); in addReplySentinelRedisInstance()
2770 if (ri->client_reconfig_script) { in addReplySentinelRedisInstance()
2772 addReplyBulkCString(c,ri->client_reconfig_script); in addReplySentinelRedisInstance()
2778 if (ri->flags & SRI_SLAVE) { in addReplySentinelRedisInstance()
2780 addReplyBulkLongLong(c,ri->master_link_down_time); in addReplySentinelRedisInstance()
2785 (ri->slave_master_link_status == SENTINEL_MASTER_LINK_STATUS_UP) ? in addReplySentinelRedisInstance()
2791 ri->slave_master_host ? ri->slave_master_host : "?"); in addReplySentinelRedisInstance()
2795 addReplyBulkLongLong(c,ri->slave_master_port); in addReplySentinelRedisInstance()
2799 addReplyBulkLongLong(c,ri->slave_priority); in addReplySentinelRedisInstance()
2803 addReplyBulkLongLong(c,ri->slave_repl_offset); in addReplySentinelRedisInstance()
2808 if (ri->flags & SRI_SENTINEL) { in addReplySentinelRedisInstance()
2810 addReplyBulkLongLong(c,mstime() - ri->last_hello_time); in addReplySentinelRedisInstance()
2814 addReplyBulkCString(c,ri->leader ? ri->leader : "?"); in addReplySentinelRedisInstance()
2818 addReplyBulkLongLong(c,ri->leader_epoch); in addReplySentinelRedisInstance()
2834 sentinelRedisInstance *ri = dictGetVal(de); in addReplyDictOfRedisInstances() local
2836 addReplySentinelRedisInstance(c,ri); in addReplyDictOfRedisInstances()
2847 sentinelRedisInstance *ri; in sentinelGetMasterByNameOrReplyError() local
2849 ri = dictFetchValue(sentinel.masters,name->ptr); in sentinelGetMasterByNameOrReplyError()
2850 if (!ri) { in sentinelGetMasterByNameOrReplyError()
2854 return ri; in sentinelGetMasterByNameOrReplyError()
2869 sentinelRedisInstance *ri = dictGetVal(de); in sentinelIsQuorumReachable() local
2871 if (ri->flags & (SRI_S_DOWN|SRI_O_DOWN)) continue; in sentinelIsQuorumReachable()
2889 sentinelRedisInstance *ri; in sentinelCommand() local
2892 if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) in sentinelCommand()
2894 addReplySentinelRedisInstance(c,ri); in sentinelCommand()
2897 sentinelRedisInstance *ri; in sentinelCommand() local
2900 if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL) in sentinelCommand()
2902 addReplyDictOfRedisInstances(c,ri->slaves); in sentinelCommand()
2905 sentinelRedisInstance *ri; in sentinelCommand() local
2908 if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL) in sentinelCommand()
2910 addReplyDictOfRedisInstances(c,ri->sentinels); in sentinelCommand()
2929 sentinelRedisInstance *ri; in sentinelCommand() local
2941 ri = getSentinelRedisInstanceByAddrAndRunID(sentinel.masters, in sentinelCommand()
2946 if (!sentinel.tilt && ri && (ri->flags & SRI_S_DOWN) && in sentinelCommand()
2947 (ri->flags & SRI_MASTER)) in sentinelCommand()
2952 if (ri && ri->flags & SRI_MASTER && strcasecmp(c->argv[5]->ptr,"*")) { in sentinelCommand()
2953 leader = sentinelVoteLeader(ri,(uint64_t)req_epoch, in sentinelCommand()
2971 sentinelRedisInstance *ri; in sentinelCommand() local
2974 ri = sentinelGetMasterByName(c->argv[2]->ptr); in sentinelCommand()
2975 if (ri == NULL) { in sentinelCommand()
2978 sentinelAddr *addr = sentinelGetCurrentMasterAddress(ri); in sentinelCommand()
2986 sentinelRedisInstance *ri; in sentinelCommand() local
2989 if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL) in sentinelCommand()
2991 if (ri->flags & SRI_FAILOVER_IN_PROGRESS) { in sentinelCommand()
2995 if (sentinelSelectSlave(ri) == NULL) { in sentinelCommand()
3000 ri->name); in sentinelCommand()
3001 sentinelStartFailover(ri); in sentinelCommand()
3002 ri->flags |= SRI_FORCE_FAILOVER; in sentinelCommand()
3011 sentinelRedisInstance *ri; in sentinelCommand() local
3035 ri = createSentinelRedisInstance(c->argv[2]->ptr,SRI_MASTER, in sentinelCommand()
3037 if (ri == NULL) { in sentinelCommand()
3051 sentinelEvent(LL_WARNING,"+monitor",ri,"%@ quorum %d",ri->quorum); in sentinelCommand()
3061 sentinelRedisInstance *ri; in sentinelCommand() local
3064 if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) in sentinelCommand()
3066 sentinelEvent(LL_WARNING,"-monitor",ri,"%@"); in sentinelCommand()
3072 sentinelRedisInstance *ri; in sentinelCommand() local
3076 if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) in sentinelCommand()
3078 int result = sentinelIsQuorumReachable(ri,&usable); in sentinelCommand()
3115 sentinelRedisInstance *ri; in sentinelCommand() local
3116 ri = sentinelGetMasterByName(c->argv[i]->ptr); in sentinelCommand()
3117 if (!ri) continue; /* ignore non-existing names */ in sentinelCommand()
3118 dictAdd(masters_local, ri->name, ri); in sentinelCommand()
3136 sentinelRedisInstance *ri = dictGetVal(de); in sentinelCommand() local
3137 addReplyBulkCBuffer(c,ri->name,strlen(ri->name)); in sentinelCommand()
3138 addReplyMultiBulkLen(c,dictSize(ri->slaves) + 1); /* +1 for self */ in sentinelCommand()
3140 addReplyLongLong(c, now - ri->info_refresh); in sentinelCommand()
3141 if (ri->info) in sentinelCommand()
3142 addReplyBulkCBuffer(c,ri->info,sdslen(ri->info)); in sentinelCommand()
3148 sdi = dictGetIterator(ri->slaves); in sentinelCommand()
3255 sentinelRedisInstance *ri = dictGetVal(de); in sentinelInfoCommand() local
3258 if (ri->flags & SRI_O_DOWN) status = "odown"; in sentinelInfoCommand()
3259 else if (ri->flags & SRI_S_DOWN) status = "sdown"; in sentinelInfoCommand()
3263 master_id++, ri->name, status, in sentinelInfoCommand()
3264 ri->addr->ip, ri->addr->port, in sentinelInfoCommand()
3265 dictSize(ri->slaves), in sentinelInfoCommand()
3266 dictSize(ri->sentinels)+1); in sentinelInfoCommand()
3286 sentinelRedisInstance *ri = dictGetVal(de); in sentinelRoleCommand() local
3288 addReplyBulkCString(c,ri->name); in sentinelRoleCommand()
3295 sentinelRedisInstance *ri; in sentinelSetCommand() local
3299 if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) in sentinelSetCommand()
3313 ri->down_after_period = ll; in sentinelSetCommand()
3314 sentinelPropagateDownAfterPeriod(ri); in sentinelSetCommand()
3320 ri->failover_timeout = ll; in sentinelSetCommand()
3326 ri->parallel_syncs = ll; in sentinelSetCommand()
3336 sdsfree(ri->notification_script); in sentinelSetCommand()
3337 ri->notification_script = strlen(value) ? sdsnew(value) : NULL; in sentinelSetCommand()
3348 sdsfree(ri->client_reconfig_script); in sentinelSetCommand()
3349 ri->client_reconfig_script = strlen(value) ? sdsnew(value) : NULL; in sentinelSetCommand()
3353 sdsfree(ri->auth_pass); in sentinelSetCommand()
3354 ri->auth_pass = strlen(value) ? sdsnew(value) : NULL; in sentinelSetCommand()
3360 ri->quorum = ll; in sentinelSetCommand()
3368 sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s",option,value); in sentinelSetCommand()
3399 void sentinelCheckSubjectivelyDown(sentinelRedisInstance *ri) { in sentinelCheckSubjectivelyDown() argument
3402 if (ri->link->act_ping_time) in sentinelCheckSubjectivelyDown()
3403 elapsed = mstime() - ri->link->act_ping_time; in sentinelCheckSubjectivelyDown()
3404 else if (ri->link->disconnected) in sentinelCheckSubjectivelyDown()
3405 elapsed = mstime() - ri->link->last_avail_time; in sentinelCheckSubjectivelyDown()
3413 if (ri->link->cc && in sentinelCheckSubjectivelyDown()
3414 (mstime() - ri->link->cc_conn_time) > in sentinelCheckSubjectivelyDown()
3416 ri->link->act_ping_time != 0 && /* Ther is a pending ping... */ in sentinelCheckSubjectivelyDown()
3419 (mstime() - ri->link->act_ping_time) > (ri->down_after_period/2) && in sentinelCheckSubjectivelyDown()
3420 (mstime() - ri->link->last_pong_time) > (ri->down_after_period/2)) in sentinelCheckSubjectivelyDown()
3422 instanceLinkCloseConnection(ri->link,ri->link->cc); in sentinelCheckSubjectivelyDown()
3430 if (ri->link->pc && in sentinelCheckSubjectivelyDown()
3431 (mstime() - ri->link->pc_conn_time) > in sentinelCheckSubjectivelyDown()
3433 (mstime() - ri->link->pc_last_activity) > (SENTINEL_PUBLISH_PERIOD*3)) in sentinelCheckSubjectivelyDown()
3435 instanceLinkCloseConnection(ri->link,ri->link->pc); in sentinelCheckSubjectivelyDown()
3444 if (elapsed > ri->down_after_period || in sentinelCheckSubjectivelyDown()
3445 (ri->flags & SRI_MASTER && in sentinelCheckSubjectivelyDown()
3446 ri->role_reported == SRI_SLAVE && in sentinelCheckSubjectivelyDown()
3447 mstime() - ri->role_reported_time > in sentinelCheckSubjectivelyDown()
3448 (ri->down_after_period+SENTINEL_INFO_PERIOD*2))) in sentinelCheckSubjectivelyDown()
3451 if ((ri->flags & SRI_S_DOWN) == 0) { in sentinelCheckSubjectivelyDown()
3452 sentinelEvent(LL_WARNING,"+sdown",ri,"%@"); in sentinelCheckSubjectivelyDown()
3453 ri->s_down_since_time = mstime(); in sentinelCheckSubjectivelyDown()
3454 ri->flags |= SRI_S_DOWN; in sentinelCheckSubjectivelyDown()
3458 if (ri->flags & SRI_S_DOWN) { in sentinelCheckSubjectivelyDown()
3459 sentinelEvent(LL_WARNING,"-sdown",ri,"%@"); in sentinelCheckSubjectivelyDown()
3460 ri->flags &= ~(SRI_S_DOWN|SRI_SCRIPT_KILL_SENT); in sentinelCheckSubjectivelyDown()
3482 sentinelRedisInstance *ri = dictGetVal(de); in sentinelCheckObjectivelyDown() local
3484 if (ri->flags & SRI_MASTER_DOWN) quorum++; in sentinelCheckObjectivelyDown()
3509 sentinelRedisInstance *ri = privdata; in sentinelReceiveIsMasterDownReply() local
3525 ri->last_master_down_reply_time = mstime(); in sentinelReceiveIsMasterDownReply()
3527 ri->flags |= SRI_MASTER_DOWN; in sentinelReceiveIsMasterDownReply()
3529 ri->flags &= ~SRI_MASTER_DOWN; in sentinelReceiveIsMasterDownReply()
3534 sdsfree(ri->leader); in sentinelReceiveIsMasterDownReply()
3535 if ((long long)ri->leader_epoch != r->element[2]->integer) in sentinelReceiveIsMasterDownReply()
3537 "%s voted for %s %llu", ri->name, in sentinelReceiveIsMasterDownReply()
3540 ri->leader = sdsnew(r->element[1]->str); in sentinelReceiveIsMasterDownReply()
3541 ri->leader_epoch = r->element[2]->integer; in sentinelReceiveIsMasterDownReply()
3557 sentinelRedisInstance *ri = dictGetVal(de); in sentinelAskMasterStateToOtherSentinels() local
3558 mstime_t elapsed = mstime() - ri->last_master_down_reply_time; in sentinelAskMasterStateToOtherSentinels()
3564 ri->flags &= ~SRI_MASTER_DOWN; in sentinelAskMasterStateToOtherSentinels()
3565 sdsfree(ri->leader); in sentinelAskMasterStateToOtherSentinels()
3566 ri->leader = NULL; in sentinelAskMasterStateToOtherSentinels()
3575 if (ri->link->disconnected) continue; in sentinelAskMasterStateToOtherSentinels()
3577 mstime() - ri->last_master_down_reply_time < SENTINEL_ASK_PERIOD) in sentinelAskMasterStateToOtherSentinels()
3582 retval = redisAsyncCommand(ri->link->cc, in sentinelAskMasterStateToOtherSentinels()
3583 sentinelReceiveIsMasterDownReply, ri, in sentinelAskMasterStateToOtherSentinels()
3589 if (retval == C_OK) ri->link->pending_commands++; in sentinelAskMasterStateToOtherSentinels()
3682 sentinelRedisInstance *ri = dictGetVal(de); in sentinelGetLeader() local
3683 if (ri->leader != NULL && ri->leader_epoch == sentinel.current_epoch) in sentinelGetLeader()
3684 sentinelLeaderIncr(counters,ri->leader); in sentinelGetLeader()
3739 int sentinelSendSlaveOf(sentinelRedisInstance *ri, char *host, int port) { in sentinelSendSlaveOf() argument
3762 retval = redisAsyncCommand(ri->link->cc, in sentinelSendSlaveOf()
3763 sentinelDiscardReplyCallback, ri, "MULTI"); in sentinelSendSlaveOf()
3765 ri->link->pending_commands++; in sentinelSendSlaveOf()
3767 retval = redisAsyncCommand(ri->link->cc, in sentinelSendSlaveOf()
3768 sentinelDiscardReplyCallback, ri, "SLAVEOF %s %s", host, portstr); in sentinelSendSlaveOf()
3770 ri->link->pending_commands++; in sentinelSendSlaveOf()
3772 retval = redisAsyncCommand(ri->link->cc, in sentinelSendSlaveOf()
3773 sentinelDiscardReplyCallback, ri, "CONFIG REWRITE"); in sentinelSendSlaveOf()
3775 ri->link->pending_commands++; in sentinelSendSlaveOf()
3782 retval = redisAsyncCommand(ri->link->cc, in sentinelSendSlaveOf()
3783 sentinelDiscardReplyCallback, ri, "CLIENT KILL TYPE normal"); in sentinelSendSlaveOf()
3785 ri->link->pending_commands++; in sentinelSendSlaveOf()
3787 retval = redisAsyncCommand(ri->link->cc, in sentinelSendSlaveOf()
3788 sentinelDiscardReplyCallback, ri, "EXEC"); in sentinelSendSlaveOf()
3790 ri->link->pending_commands++; in sentinelSendSlaveOf()
3955 void sentinelFailoverWaitStart(sentinelRedisInstance *ri) { in sentinelFailoverWaitStart() argument
3960 leader = sentinelGetLeader(ri, ri->failover_epoch); in sentinelFailoverWaitStart()
3966 if (!isleader && !(ri->flags & SRI_FORCE_FAILOVER)) { in sentinelFailoverWaitStart()
3971 if (election_timeout > ri->failover_timeout) in sentinelFailoverWaitStart()
3972 election_timeout = ri->failover_timeout; in sentinelFailoverWaitStart()
3974 if (mstime() - ri->failover_start_time > election_timeout) { in sentinelFailoverWaitStart()
3975 sentinelEvent(LL_WARNING,"-failover-abort-not-elected",ri,"%@"); in sentinelFailoverWaitStart()
3976 sentinelAbortFailover(ri); in sentinelFailoverWaitStart()
3980 sentinelEvent(LL_WARNING,"+elected-leader",ri,"%@"); in sentinelFailoverWaitStart()
3983 ri->failover_state = SENTINEL_FAILOVER_STATE_SELECT_SLAVE; in sentinelFailoverWaitStart()
3984 ri->failover_state_change_time = mstime(); in sentinelFailoverWaitStart()
3985 sentinelEvent(LL_WARNING,"+failover-state-select-slave",ri,"%@"); in sentinelFailoverWaitStart()
3988 void sentinelFailoverSelectSlave(sentinelRedisInstance *ri) { in sentinelFailoverSelectSlave() argument
3989 sentinelRedisInstance *slave = sentinelSelectSlave(ri); in sentinelFailoverSelectSlave()
3994 sentinelEvent(LL_WARNING,"-failover-abort-no-good-slave",ri,"%@"); in sentinelFailoverSelectSlave()
3995 sentinelAbortFailover(ri); in sentinelFailoverSelectSlave()
3999 ri->promoted_slave = slave; in sentinelFailoverSelectSlave()
4000 ri->failover_state = SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE; in sentinelFailoverSelectSlave()
4001 ri->failover_state_change_time = mstime(); in sentinelFailoverSelectSlave()
4007 void sentinelFailoverSendSlaveOfNoOne(sentinelRedisInstance *ri) { in sentinelFailoverSendSlaveOfNoOne() argument
4013 if (ri->promoted_slave->link->disconnected) { in sentinelFailoverSendSlaveOfNoOne()
4014 if (mstime() - ri->failover_state_change_time > ri->failover_timeout) { in sentinelFailoverSendSlaveOfNoOne()
4015 sentinelEvent(LL_WARNING,"-failover-abort-slave-timeout",ri,"%@"); in sentinelFailoverSendSlaveOfNoOne()
4016 sentinelAbortFailover(ri); in sentinelFailoverSendSlaveOfNoOne()
4025 retval = sentinelSendSlaveOf(ri->promoted_slave,NULL,0); in sentinelFailoverSendSlaveOfNoOne()
4028 ri->promoted_slave,"%@"); in sentinelFailoverSendSlaveOfNoOne()
4029 ri->failover_state = SENTINEL_FAILOVER_STATE_WAIT_PROMOTION; in sentinelFailoverSendSlaveOfNoOne()
4030 ri->failover_state_change_time = mstime(); in sentinelFailoverSendSlaveOfNoOne()
4035 void sentinelFailoverWaitPromotion(sentinelRedisInstance *ri) { in sentinelFailoverWaitPromotion() argument
4038 if (mstime() - ri->failover_state_change_time > ri->failover_timeout) { in sentinelFailoverWaitPromotion()
4039 sentinelEvent(LL_WARNING,"-failover-abort-slave-timeout",ri,"%@"); in sentinelFailoverWaitPromotion()
4040 sentinelAbortFailover(ri); in sentinelFailoverWaitPromotion()
4182 void sentinelFailoverStateMachine(sentinelRedisInstance *ri) { in sentinelFailoverStateMachine() argument
4183 serverAssert(ri->flags & SRI_MASTER); in sentinelFailoverStateMachine()
4185 if (!(ri->flags & SRI_FAILOVER_IN_PROGRESS)) return; in sentinelFailoverStateMachine()
4187 switch(ri->failover_state) { in sentinelFailoverStateMachine()
4189 sentinelFailoverWaitStart(ri); in sentinelFailoverStateMachine()
4192 sentinelFailoverSelectSlave(ri); in sentinelFailoverStateMachine()
4195 sentinelFailoverSendSlaveOfNoOne(ri); in sentinelFailoverStateMachine()
4198 sentinelFailoverWaitPromotion(ri); in sentinelFailoverStateMachine()
4201 sentinelFailoverReconfNextSlave(ri); in sentinelFailoverStateMachine()
4211 void sentinelAbortFailover(sentinelRedisInstance *ri) { in sentinelAbortFailover() argument
4212 serverAssert(ri->flags & SRI_FAILOVER_IN_PROGRESS); in sentinelAbortFailover()
4213 serverAssert(ri->failover_state <= SENTINEL_FAILOVER_STATE_WAIT_PROMOTION); in sentinelAbortFailover()
4215 ri->flags &= ~(SRI_FAILOVER_IN_PROGRESS|SRI_FORCE_FAILOVER); in sentinelAbortFailover()
4216 ri->failover_state = SENTINEL_FAILOVER_STATE_NONE; in sentinelAbortFailover()
4217 ri->failover_state_change_time = mstime(); in sentinelAbortFailover()
4218 if (ri->promoted_slave) { in sentinelAbortFailover()
4219 ri->promoted_slave->flags &= ~SRI_PROMOTED; in sentinelAbortFailover()
4220 ri->promoted_slave = NULL; in sentinelAbortFailover()
4230 void sentinelHandleRedisInstance(sentinelRedisInstance *ri) { in sentinelHandleRedisInstance() argument
4233 sentinelReconnectInstance(ri); in sentinelHandleRedisInstance()
4234 sentinelSendPeriodicCommands(ri); in sentinelHandleRedisInstance()
4247 sentinelCheckSubjectivelyDown(ri); in sentinelHandleRedisInstance()
4250 if (ri->flags & (SRI_MASTER|SRI_SLAVE)) { in sentinelHandleRedisInstance()
4255 if (ri->flags & SRI_MASTER) { in sentinelHandleRedisInstance()
4256 sentinelCheckObjectivelyDown(ri); in sentinelHandleRedisInstance()
4257 if (sentinelStartFailoverIfNeeded(ri)) in sentinelHandleRedisInstance()
4258 sentinelAskMasterStateToOtherSentinels(ri,SENTINEL_ASK_FORCED); in sentinelHandleRedisInstance()
4259 sentinelFailoverStateMachine(ri); in sentinelHandleRedisInstance()
4260 sentinelAskMasterStateToOtherSentinels(ri,SENTINEL_NO_FLAGS); in sentinelHandleRedisInstance()
4274 sentinelRedisInstance *ri = dictGetVal(de); in sentinelHandleDictOfRedisInstances() local
4276 sentinelHandleRedisInstance(ri); in sentinelHandleDictOfRedisInstances()
4277 if (ri->flags & SRI_MASTER) { in sentinelHandleDictOfRedisInstances()
4278 sentinelHandleDictOfRedisInstances(ri->slaves); in sentinelHandleDictOfRedisInstances()
4279 sentinelHandleDictOfRedisInstances(ri->sentinels); in sentinelHandleDictOfRedisInstances()
4280 if (ri->failover_state == SENTINEL_FAILOVER_STATE_UPDATE_CONFIG) { in sentinelHandleDictOfRedisInstances()
4281 switch_to_promoted = ri; in sentinelHandleDictOfRedisInstances()