• A
    Send an async PING before starting replication with master. · bb66fc31
    antirez 提交于
    During the first synchronization step of the replication process, a Redis
    slave connects with the master in a non blocking way. However once the
    connection is established the replication continues sending the REPLCONF
    command, and sometimes the AUTH command if needed. Those commands are
    send in a partially blocking way (blocking with timeout in the order of
    seconds).
    
    Because it is common for a blocked master to accept connections even if
    it is actually not able to reply to the slave requests, it was easy for
    a slave to block if the master had serious issues, but was still able to
    accept connections in the listening socket.
    
    For this reason we now send an asynchronous PING request just after the
    non blocking connection ended in a successful way, and wait for the
    reply before to continue with the replication process. It is very
    unlikely that a master replying to PING can't reply to the other
    commands.
    
    This solution was proposed by Didier Spezia (Thanks!) so that we don't
    need to turn all the replication process into a non blocking affair, but
    still the probability of a slave blocked is minimal even in the event of
    a failing master.
    
    Also we now use getsockopt(SO_ERROR) in order to check errors ASAP
    in the event handler, instead of waiting for actual I/O to return an
    error.
    
    This commit fixes issue #632.
    bb66fc31
replication.c 28.4 KB