[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: Re: [Libevent-users] Assert fail in evhttp_connection_fail_ with req=0x00 on error=EVREQ_HTTP_TIMEOUT at http.c:691



On Fri, Sep 19, 2014 at 02:40:43PM +0200, gerkenjohannes@xxxxxx wrote:
> I'm using the "master" from github.
> 
> The problem only occurs, when I set a timeout/retry for an https connection(to an server with port 443 closed). The segfault/assert-fail occurs, if I use EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST in combination with the timeouts/retrys.
> 
> Testcase:
> add the following to sample/https-client.c
> 
> struct timeval retry_timeout;
> retry_timeout.tv_sec=5;
> retry_timeout.tv_usec=0;
> evhttp_connection_set_timeout(evcon,15);
> evhttp_connection_set_retries(evcon,3);
> evhttp_connection_set_initial_retry_tv(evcon,&retry_timeout);
> 
> execute: https_client -url https://libevent.org
> 
> output:
> 
> [warn] Epoll ADD(1) on fd 6 failed.  Old events were 0; read change was 1 (add); write change was 0 (none); close change was 0 (none): Bad file descriptor
> [debug] event_add: event: 0x25a5b30 (fd 6),  EV_WRITE  EV_TIMEOUT call 0x7f1942897ae4
> [warn] Epoll ADD(4) on fd 6 failed.  Old events were 0; read change was 0 (none); write change was 1 (add); close change was 0 (none): Bad file descriptor
> [debug] event_process_active: event_callback 0x25a5c40, closure 3, call 0x7f1941fc8879
> some request failed - no idea which one though!
> socket error = Bad file descriptor (9)

After digging through syscalls traces, I got the next patch, could you test it
please:
From 6dc4de3005bda27ca1154e6fa2abd323c6d4de44 Mon Sep 17 00:00:00 2001
From: Azat Khuzhin <a3at.mail@xxxxxxxxx>
Date: Sun, 21 Sep 2014 18:29:17 +0400
Subject: [PATCH] bufferevent_openssl: reset fd_is_set when setfd with -1 is
 called

Before this patch:
$ sample/https-client -retries 1 -url https://libevent.org
[warn] Epoll ADD(1) on fd 6 failed.  Old events were 0; read change was 1 (add); write change was 0 (none); close change was 0 (none): Bad file descriptor
[warn] Epoll ADD(4) on fd 6 failed.  Old events were 0; read change was 0 (none); write change was 1 (add); close change was 0 (none): Bad file descriptor
some request failed - no idea which one though!
socket error = Bad file descriptor (9)

After this patch:
$ sample/https-client -retries 1 -url https://libevent.org
Response line: 0 (null)

Reported-by: gerkenjohannes@xxxxxx
---
 bufferevent_openssl.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/bufferevent_openssl.c b/bufferevent_openssl.c
index 423b34f10097..b30f90ff2e94 100644
--- a/bufferevent_openssl.c
+++ b/bufferevent_openssl.c
@@ -1276,6 +1276,8 @@ be_openssl_ctrl(struct bufferevent *bev,
 			SSL_set_bio(bev_ssl->ssl, bio, bio);
 			bev_ssl->fd_is_set = 1;
 		}
+		if (data->fd == -1)
+			bev_ssl->fd_is_set = 0;
 		if (bev_ssl->state == BUFFEREVENT_SSL_OPEN)
 			return set_open_callbacks(bev_ssl, data->fd);
 		else {
-- 
2.1.0

Full version of this patch is here:
https://github.com/azat/libevent/commit/3da84c2949cc693bb6e6a65a3b1de48af1be0483.patch

Cheers, Azat.

>  
> 
> Gesendet: Donnerstag, 04. September 2014 um 09:44 Uhr
> Von: "Azat Khuzhin" <a3at.mail@xxxxxxxxx>
> An: libevent-users@xxxxxxxxxxxxx
> Cc: libevent-users@xxxxxxxx
> Betreff: Re: [Libevent-users] Assert fail in evhttp_connection_fail_ with req=0x00 on error=EVREQ_HTTP_TIMEOUT at http.c:691
> On Fri, Aug 29, 2014 at 06:30:26PM +0200, gerkenjohannes@xxxxxx wrote:
> > Hi,
> >
> > when I add new evhttp requests to an running event_loop, I get "epoll ADD: Bad file descriptor" and later "SIGABRT".
> > The event_base is running in an seperate worker thread, the main thread is doing the evhttp_make_request.
> >
> > Output from GDB:
> > http://paste.ubuntu.com/8176676/[http://paste.ubuntu.com/8176676/]
> >
> > Output from GDB with libevent debugging on:
> > http://paste.ubuntu.com/8176681/[http://paste.ubuntu.com/8176681/]
> >
> > I get the assert fail in the folowing 2 cases:
> >
> > case 1:
> > 1. add new requests to the running event_base
> >
> > case 2:
> > 1. call loop_brake from the main thread
> > 2. wait for the loop to "brake" in the worker thread
> > 3. put the worker thread to sleep
> > 4. add new requests
> > 5. wake up the worker thread
> > 6. run the event_loop
> >
> > Is this bug in libevent or my code?
> 
> Which version of libevent do you have?
> Could you produce simple program or regress test for http (inside
> libevent), to test it?
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.