[ https://issues.apache.org/jira/browse/ZOOKEEPER-3575?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
ASF GitHub Bot updated ZOOKEEPER-3575: -------------------------------------- Labels: pull-request-available (was: ) > 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 > Priority: Major > Labels: pull-request-available > > 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)