evpp
evpp copied to clipboard
http request在重试过程中可能不会调用handle_response
由于http request在retry的过程中没有重置连接状态,会导致Request::HandleResponse不会被调用,有可能会导致调用方死锁。 具体流程为:
- httpc:Request发起evhttp_make_request请求, 其中会依次调用evhttp_make_request->evhttp_connection_connect->bufferevent_socket_connect_hostname->evutil_getaddrinfo_async 2.dns解析失败,此时会调用evhttp_connection_fail,进而调用Request::HandleResponse 3.evutil_getaddrinfo_async依然会返回成功,连接状态被置为EVCON_CONNECTING 4.Request::HandleResponse中调用retry,再次调用evhttp_make_request,此时连接状态为EVCON_CONNECTING 5.evhttp_make_request调用evhttp_connection_connect,由于状态为EVCON_CONNECTING,evhttp_connection_connect直接返回。至此再也没有机会调用Request::HandleResponse