You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Jie Huang (Jira)" <ji...@apache.org> on 2019/10/13 05:00:00 UTC

[jira] [Created] (ZOOKEEPER-3575) Moving sending packets in Learner to a separate thread

Jie Huang created ZOOKEEPER-3575:
------------------------------------

             Summary: Moving sending packets in Learner to a separate thread
                 Key: ZOOKEEPER-3575
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-3575
             Project: ZooKeeper
          Issue Type: Sub-task
          Components: server
    Affects Versions: 3.6.0
            Reporter: Jie Huang


After changing to close the socket asynchronously, the shutdown process can proceed while the socket is being closed. However, the shutdown process could still stall if a thread being shutdown is writing to the socket. For example, the SyncRequestProcessor flushes all ACK packets in queue when shutdown is called, which calls Learner.writePacket(), which will not return (with an IO exception) until the socket finishes closing. So it's still delayed by the socket closing time. 

To get around the delay, we move Learner.writePacket() to a separate thread. The tricky part is to handle the IO exception thrown by Learner.writePacket(). Currently, the IO exception is caught by different callers in different ways. For example, if an IO exception caught during revalidateSession, the session is closed and removed. In other cases, like in FollowerRequestProcessor and SendAckRequestProcess, the quorum socket is closed when the IO exception is caught. After moving it to a thread, the callers won't be able to catch and handle the exception. We need to handle it within the sending function. We reason that if an IO exception is thrown on the quorum socket of a follower, it only makes sense to shut down the server. So we make the sending thread a ZooKeeperCriticalThread.

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)