HHWheelTimer - fix scheduling timeouts within callbacks
Summary: This one is a little tricky, but it explains what happened in t5388156. Basically what we observed in the stack traces is that the HHWheelTimer count_ is 0, but there is still a timeout scheduled on the AsyncTimeout. How I can see this happening is the following: - SASL times out - We fall back to insecure mode in the callback and schedule a send of a real message to the server. Here we schedule another timeout on the same HHWheelTimer object. Since count_ is 0 at this point, we schedule a timeout in AsyncTimeout. - Now the initial SASL timeout was late, so the HHWheelTimer is in a catchup state. This means that it's possible for the callback on the timeout that was just scheduled to fire on the same "tick". - This callback invokes SR's callbacks which try to detach the event base from the channel. But it can't detach because we have something scheduled on the AsyncTimeout. - We crash. Test Plan: - will wait for contbuild - Something like this repros the problem: https://phabricator.fb.com/P17220063. Note I hacked the catchup part to get it to work. Now running loadgen with security = permitted causes the crash. // hphp tests are stalled, have to do this... Reviewed By: mshneer@fb.com Subscribers: bmatheny, mshneer, sandeepkk, trunkagent, njormrod, folly-diffs@, alandau, mhorowitz, srenfro, hitesh, wstefancik FB internal diff: D1680735 Tasks: 5388156 Signature: t1:1680735:1416252123:e76668860ccda9380a87996b4fa3de957e129404
Showing
Please register or sign in to comment