这里主要是校验,确定配置文件是否被设置:
- /* This function is for checking whether sentinel config file has been set,
- * also checking whether we have write permissions. */
- void sentinelCheckConfigFile(void) {
- if (server.configfile == NULL) {
- serverLog(LL_WARNING,
- "Sentinel needs config file on disk to save state. Exiting...");
- exit(1);
- } else if (access(server.configfile,W_OK) == -1) {
- serverLog(LL_WARNING,
- "Sentinel config file %s is not writable: %s. Exiting...",
- server.configfile,strerror(errno));
- exit(1);
- }
- }
-
- /* This function gets called when the server is in Sentinel mode, started,
- * loaded the configuration, and is ready for normal operations. */
- void sentinelIsRunning(void) {
- int j;
-
- /* If this Sentinel has yet no ID set in the configuration file, we
- * pick a random one and persist the config on disk. From now on this
- * will be this Sentinel ID across restarts. */
- for (j = 0; j < CONFIG_RUN_ID_SIZE; j++)
- if (sentinel.myid[j] != 0) break;
-
- if (j == CONFIG_RUN_ID_SIZE) {
- /* Pick ID and persist the config. */
- getRandomHexChars(sentinel.myid,CONFIG_RUN_ID_SIZE);
- sentinelFlushConfig();
- }
-
- /* Log its ID to make debugging of issues simpler. */
- serverLog(LL_WARNING,"Sentinel ID is %s", sentinel.myid);
-
- /* We want to generate a +monitor event for every configured master
- * at startup. */
- sentinelGenerateInitialMonitorEvents();
- }
-
- /* ============================== sentinelAddr ============================== */
-
- /* Create a sentinelAddr object and return it on success.
- * On error NULL is returned and errno is set to:
- * ENOENT: Can't resolve the hostname.
- * EINVAL: Invalid port number.
- */
- sentinelAddr *createSentinelAddr(char *hostname, int port) {
- char ip[NET_IP_STR_LEN];
- sentinelAddr *sa;
-
- if (port < 0 || port > 65535) {
- errno = EINVAL;
- return NULL;
- }
- if (anetResolve(NULL,hostname,ip,sizeof(ip),
- sentinel.resolve_hostnames ? ANET_NONE : ANET_IP_ONLY) == ANET_ERR) {
- errno = ENOENT;
- return NULL;
- }
- sa = zmalloc(sizeof(*sa));
- sa->hostname = sdsnew(hostname);
- sa->ip = sdsnew(ip);
- sa->port = port;
- return sa;
- }
-
- /* Return a duplicate of the source address. */
- sentinelAddr *dupSentinelAddr(sentinelAddr *src) {
- sentinelAddr *sa;
-
- sa = zmalloc(sizeof(*sa));
- sa->hostname = sdsnew(src->hostname);
- sa->ip = sdsnew(src->ip);
- sa->port = src->port;
- return sa;
- }
-
- /* Free a Sentinel address. Can't fail. */
- void releaseSentinelAddr(sentinelAddr *sa) {
- sdsfree(sa->hostname);
- sdsfree(sa->ip);
- zfree(sa);
- }
-
- /* Return non-zero if two addresses are equal. */
- int sentinelAddrIsEqual(sentinelAddr *a, sentinelAddr *b) {
- return a->port == b->port && !strcasecmp(a->ip,b->ip);
- }
-
- /* Return non-zero if a hostname matches an address. */
- int sentinelAddrEqualsHostname(sentinelAddr *a, char *hostname) {
- char ip[NET_IP_STR_LEN];
-
- /* We always resolve the hostname and compare it to the address */
- if (anetResolve(NULL, hostname, ip, sizeof(ip),
- sentinel.resolve_hostnames ? ANET_NONE : ANET_IP_ONLY) == ANET_ERR)
- return 0;
- return !strcasecmp(a->ip, ip);
- }
-
- const char *announceSentinelAddr(const sentinelAddr *a) {
- return sentinel.announce_hostnames ? a->hostname : a->ip;
- }
-
- /* Return an allocated sds with hostname/address:port. IPv6
- * addresses are bracketed the same way anetFormatAddr() does.
- */
- sds announceSentinelAddrAndPort(const sentinelAddr *a) {
- const char *addr = announceSentinelAddr(a);
- if (strchr(addr, ':') != NULL)
- return sdscatprintf(sdsempty(), "[%s]:%d", addr, a->port);
- else
- return sdscatprintf(sdsempty(), "%s:%d", addr, a->port);
- }