// File: /workspace/github_c_makefile_star2_O0/nilyang[P]redis-tdd-annotation/src/sentinel.c
// Function: sentinelAskMasterStateToOtherSentinels
void sentinelAskMasterStateToOtherSentinels(sentinelRedisInstance *master, int flags) {
    dictIterator *di;
    dictEntry *de;

    // 遍历正在监视相同 master 的所有 sentinel
    // 向它们发送 SENTINEL is-master-down-by-addr 命令
    di = dictGetIterator(master->sentinels);
    while((de = dictNext(di)) != NULL) {
        sentinelRedisInstance *ri = dictGetVal(de);

        // 距离该 sentinel 最后一次回复 SENTINEL master-down-by-addr 命令已经过了多久
        mstime_t elapsed = mstime() - ri->last_master_down_reply_time;

        char port[32];
        int retval;

        /* If the master state from other sentinel is too old, we clear it. */
        // 如果目标 Sentinel 关于主服务器的信息已经太久没更新，那么我们清除它
        if (elapsed > SENTINEL_ASK_PERIOD*5) {
            ri->flags &= ~SRI_MASTER_DOWN;
            sdsfree(ri->leader);
            ri->leader = NULL;
        }

        /* Only ask if master is down to other sentinels if:
         *
         * 只在以下情况满足时，才向其他 sentinel 询问主服务器是否已下线
         *
         * 1) We believe it is down, or there is a failover in progress.
         *    本 sentinel 相信服务器已经下线，或者针对该主服务器的故障转移操作正在执行
         * 2) Sentinel is connected.
         *    目标 Sentinel 与本 Sentinel 已连接
         * 3) We did not received the info within SENTINEL_ASK_PERIOD ms. 
         *    当前 Sentinel 在 SENTINEL_ASK_PERIOD 毫秒内没有获得过目标 Sentinel 发来的信息
         * 4) 条件 1 和条件 2 满足而条件 3 不满足，但是 flags 参数给定了 SENTINEL_ASK_FORCED 标识
         */
        if ((master->flags & SRI_S_DOWN) == 0) continue;
        if (ri->flags & SRI_DISCONNECTED) continue;
        if (!(flags & SENTINEL_ASK_FORCED) &&
            mstime() - ri->last_master_down_reply_time < SENTINEL_ASK_PERIOD)
            continue;

        /* Ask */
        // 发送 SENTINEL is-master-down-by-addr 命令
        ll2string(port,sizeof(port),master->addr->port);
        retval = redisAsyncCommand(ri->cc,
                    sentinelReceiveIsMasterDownReply, NULL,
                    "SENTINEL is-master-down-by-addr %s %s %llu %s",
                    master->addr->ip, port,
                    sentinel.current_epoch,
                    // 如果本 Sentinel 已经检测到 master 进入 ODOWN 
                    // 并且要开始一次故障转移，那么向其他 Sentinel 发送自己的运行 ID
                    // 让对方将给自己投一票（如果对方在这个纪元内还没有投票的话）
                    (master->failover_state > SENTINEL_FAILOVER_STATE_NONE) ?
                    server.runid : "*");
        if (retval == REDIS_OK) ri->pending_commands++;
    }
    dictReleaseIterator(di);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq 0xc0(%rax), %rdi
callq 0x241d0
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rdi
callq 0x24270
movq %rax, -0x20(%rbp)
cmpq $0x0, %rax
je 0x7fe51
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
callq 0x252e0
movq -0x28(%rbp), %rcx
subq 0x80(%rcx), %rax
movq %rax, -0x30(%rbp)
cmpq $0x1388, -0x30(%rbp)    # imm = 0x1388
jle 0x7fd6e
movq -0x28(%rbp), %rax
movl (%rax), %ecx
andl $-0x41, %ecx
movl %ecx, (%rax)
movq -0x28(%rbp), %rax
movq 0x118(%rax), %rdi
callq 0x2c160
movq -0x28(%rbp), %rax
movq $0x0, 0x118(%rax)
movq -0x8(%rbp), %rax
movl (%rax), %eax
andl $0x10, %eax
cmpl $0x0, %eax
jne 0x7fd7e
jmp 0x7fd03
movq -0x28(%rbp), %rax
movl (%rax), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0x7fd91
jmp 0x7fd03
movl -0xc(%rbp), %eax
andl $0x1, %eax
cmpl $0x0, %eax
jne 0x7fdb9
callq 0x252e0
movq -0x28(%rbp), %rcx
subq 0x80(%rcx), %rax
cmpq $0x3e8, %rax            # imm = 0x3E8
jge 0x7fdb9
jmp 0x7fd03
leaq -0x50(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movslq 0x8(%rax), %rdx
movl $0x20, %esi
callq 0x39660
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %r8
leaq -0x50(%rbp), %r9
movq 0xa8447(%rip), %r10     # 0x128238
movq -0x8(%rbp), %rax
movl 0x130(%rax), %edx
leaq 0x5eaaa(%rip), %rax     # 0xde8ac
leaq 0x93aef(%rip), %rcx     # 0x1138f8
addq $0x58, %rcx
cmpl $0x0, %edx
cmovgq %rcx, %rax
leaq -0x2fb(%rip), %rsi      # 0x7fb20
xorl %ecx, %ecx
movl %ecx, %edx
leaq 0x69eb2(%rip), %rcx     # 0xe9cd8
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
movb $0x0, %al
callq 0x86730
movl %eax, -0x54(%rbp)
cmpl $0x0, -0x54(%rbp)
jne 0x7fe4c
movq -0x28(%rbp), %rax
movl 0x38(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x38(%rax)
jmp 0x7fd03
movq -0x18(%rbp), %rdi
callq 0x243d0
addq $0x70, %rsp
popq %rbp
retq