// File: /workspace/github_c_makefile_star2_O1/zhou-yuxin[P]redis-aof-no-cow/src/cluster.c
// Function: clusterInit
void clusterInit(void) {
    int saveconf = 0;

    server.cluster = zmalloc(sizeof(clusterState));
    server.cluster->myself = NULL;
    server.cluster->currentEpoch = 0;
    server.cluster->state = CLUSTER_FAIL;
    server.cluster->size = 1;
    server.cluster->todo_before_sleep = 0;
    server.cluster->nodes = dictCreate(&clusterNodesDictType,NULL);
    server.cluster->nodes_black_list =
        dictCreate(&clusterNodesBlackListDictType,NULL);
    server.cluster->failover_auth_time = 0;
    server.cluster->failover_auth_count = 0;
    server.cluster->failover_auth_rank = 0;
    server.cluster->failover_auth_epoch = 0;
    server.cluster->cant_failover_reason = CLUSTER_CANT_FAILOVER_NONE;
    server.cluster->lastVoteEpoch = 0;
    server.cluster->stats_bus_messages_sent = 0;
    server.cluster->stats_bus_messages_received = 0;
    memset(server.cluster->slots,0, sizeof(server.cluster->slots));
    clusterCloseAllSlots();

    /* Lock the cluster config file to make sure every node uses
     * its own nodes.conf. */
    if (clusterLockConfig(server.cluster_configfile) == C_ERR)
        exit(1);

    /* Load or create a new nodes configuration. */
    if (clusterLoadConfig(server.cluster_configfile) == C_ERR) {
        /* No configuration found. We will just use the random name provided
         * by the createClusterNode() function. */
        myself = server.cluster->myself =
            createClusterNode(NULL,CLUSTER_NODE_MYSELF|CLUSTER_NODE_MASTER);
        serverLog(LL_NOTICE,"No cluster configuration found, I'm %.40s",
            myself->name);
        clusterAddNode(myself);
        saveconf = 1;
    }
    if (saveconf) clusterSaveConfigOrDie(1);

    /* We need a listening TCP port for our cluster messaging needs. */
    server.cfd_count = 0;

    /* Port sanity check II
     * The other handshake port check is triggered too late to stop
     * us from trying to use a too-high cluster port number. */
    if (server.port > (65535-CLUSTER_PORT_INCR)) {
        serverLog(LL_WARNING, "Redis port number too high. "
                   "Cluster communication port is 10,000 port "
                   "numbers higher than your Redis port. "
                   "Your Redis port number must be "
                   "lower than 55535.");
        exit(1);
    }

    if (listenToPort(server.port+CLUSTER_PORT_INCR,
        server.cfd,&server.cfd_count) == C_ERR)
    {
        exit(1);
    } else {
        int j;

        for (j = 0; j < server.cfd_count; j++) {
            if (aeCreateFileEvent(server.el, server.cfd[j], AE_READABLE,
                clusterAcceptHandler, NULL) == AE_ERR)
                    serverPanic("Unrecoverable error creating Redis Cluster "
                                "file event.");
        }
    }

    /* The slots -> keys map is a sorted set. Init it. */
    server.cluster->slots_to_keys = zslCreate();

    /* Set myself->port to my listening port, we'll just need to discover
     * the IP address via MEET messages. */
    myself->port = server.port;

    server.cluster->mf_end = 0;
    resetManualFailover();
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movl $0x60098, %edi          # imm = 0x60098
callq 0x3b29d
leaq 0x9ce39(%rip), %r15     # 0x106858
movq %rax, 0x9a0(%r15)
xorps %xmm0, %xmm0
movups %xmm0, (%rax)
movabsq $0x100000001, %rcx      # imm = 0x100000001
movq %rcx, 0x10(%rax)
xorl %ebx, %ebx
movl %ebx, 0x60080(%rax)
leaq 0x9c447(%rip), %rdi     # 0x105e90
xorl %esi, %esi
callq 0x31774
movq 0x9a0(%r15), %rcx
movq %rax, 0x18(%rcx)
leaq 0x9c45e(%rip), %rdi     # 0x105ec0
xorl %esi, %esi
callq 0x31774
movq 0x9a0(%r15), %r14
movq %rax, 0x20(%r14)
movq %rbx, 0x60030(%r14)
movl %ebx, 0x60038(%r14)
movl %ebx, 0x60040(%r14)
movq %rbx, 0x60048(%r14)
movl %ebx, 0x60050(%r14)
movq %rbx, 0x60078(%r14)
leaq 0x40028(%r14), %rdi
movl $0x20000, %edx          # imm = 0x20000
xorl %esi, %esi
callq 0x26110
leaq 0x28(%r14), %rdi
movl $0x20000, %edx          # imm = 0x20000
xorl %esi, %esi
callq 0x26110
xorps %xmm0, %xmm0
movups %xmm0, 0x60088(%r14)
movl $0x20028, %edi          # imm = 0x20028
addq 0x9a0(%r15), %rdi
movl $0x20000, %edx          # imm = 0x20000
xorl %esi, %esi
callq 0x26110
movq 0x998(%r15), %rdi
callq 0x69958
cmpl $-0x1, %eax
je 0x69c6b
movq 0x998(%r15), %rdi
callq 0x68cd0
cmpl $-0x1, %eax
jne 0x69b76
xorl %edi, %edi
movl $0x11, %esi
callq 0x6941c
movq 0x9a0(%r15), %rcx
movq %rax, (%rcx)
movq %rax, 0xb16a9(%rip)     # 0x11b1d0
leaq 0x8(%rax), %rdx
leaq 0x60d4c(%rip), %rsi     # 0xca87e
movl $0x2, %edi
xorl %eax, %eax
callq 0x32ea6
movq 0xb168b(%rip), %rbx     # 0x11b1d0
movq 0x9a0(%r15), %rax
movq 0x18(%rax), %r14
leaq 0x8(%rbx), %rdi
movl $0x28, %esi
callq 0x3910c
movq %r14, %rdi
movq %rax, %rsi
movq %rbx, %rdx
callq 0x31a95
movl $0x1, %edi
callq 0x6992e
movl $0x0, 0x1c4(%r15)
movl 0xa0(%r15), %edi
cmpl $0xd8f0, %edi           # imm = 0xD8F0
jge 0x69c58
addl $0x2710, %edi           # imm = 0x2710
leaq 0x184(%r15), %rsi
leaq 0x1c4(%r15), %rdx
callq 0x35412
cmpl $-0x1, %eax
je 0x69c6b
cmpl $0x0, 0x1c4(%r15)
jle 0x69bfa
xorl %r14d, %r14d
leaq 0xe3(%rip), %rbx        # 0x69cad
movq 0x40(%r15), %rdi
movl 0x184(%r15,%r14,4), %esi
movl $0x1, %edx
movq %rbx, %rcx
xorl %r8d, %r8d
callq 0x2fee7
cmpl $-0x1, %eax
je 0x69c36
incq %r14
movslq 0x1c4(%r15), %rax
cmpq %rax, %r14
jl 0x69bca
callq 0x53546
movq 0x9a0(%r15), %rcx
movq %rax, 0x60028(%rcx)
movl 0xa0(%r15), %eax
movq 0xb15b5(%rip), %rdx     # 0x11b1d0
movl %eax, 0x8c0(%rdx)
movq $0x0, 0x60058(%rcx)
popq %rbx
popq %r14
popq %r15
jmp 0x69da6
leaq 0x60d07(%rip), %rdi     # 0xca944
leaq 0x60a49(%rip), %rsi     # 0xca68d
movl $0x1d1, %edx            # imm = 0x1D1
callq 0x6558d
movl $0x1, %edi
callq 0x263d0
leaq 0x60c49(%rip), %rsi     # 0xca8a8
movl $0x3, %edi
xorl %eax, %eax
callq 0x32ea6
movl $0x1, %edi
callq 0x262d0