Tor v0.2.1.0-alpha-dev (r14101): eventdns(?): Assertion conn->read_event failed
With high concurrency, tor eventdns barfs up. Trying to resolve 100 IP addresses with concurrency of 100+100 (for PTR->A and A->PTR) with command: random-ip 100 64|DNSCACHEIP=127.0.0.69 dnsfilter -c 100 | DNSCACHEIP=127.0.0.69 dnsfilter -c 100 -p Takes less than a minute till abort().
2008-03-18 19:14:58.980894879 [debug] connection_remove(): removing socket -1 (type Socks), n_conns now 897 2008-03-18 19:14:59.301429897 [debug] conn_write_callback(): socket 24 wants to write. 2008-03-18 19:14:59.301432330 [debug] flush_chunk_tls(): flushed 3901 bytes, 12483 ready to flush, 12483 remain. 2008-03-18 19:14:59.301433263 [debug] flush_chunk_tls(): flushed 4057 bytes, 8426 ready to flush, 8426 remain. 2008-03-18 19:14:59.301434092 [debug] flush_chunk_tls(): flushed 4057 bytes, 4369 ready to flush, 4369 remain. 2008-03-18 19:14:59.301434943 [debug] flush_chunk_tls(): flushed 4057 bytes, 312 ready to flush, 312 remain. 2008-03-18 19:14:59.301435738 [debug] flush_chunk_tls(): flushed 312 bytes, 0 ready to flush, 0 remain. 2008-03-18 19:14:59.301455409 [debug] connection_handle_write(): After TLS write of 16384: 0 read, 16722 written 2008-03-18 19:14:59.301456530 [err] Bug: main.c:300: connection_start_reading: Assertion conn->read_event failed; aborting. 2008-03-18 19:14:59.301457413 main.c:300 connection_start_reading: Assertion conn->read_event failed; aborting. 2008-03-18 19:15:00.340741083 [notice] Tor v0.2.1.0-alpha-dev (r14101). This is experimental software. Do not rely on it for strong anonymity. (Running on Linux x86_64)
I have a big log file, but this should be easily reproducable.
Other notes about eventdns: (maybe this should go in a different bugreport)
- O(N) lookup for transactions IDs (this may or may not show up in the profiles, but is nevertheless not a very clever tactic)
- using malloc+memset instead of calloc
- ad-hoc handling of lists (e.g., would look more readable if you made static inline function list_add instead of doing ns->next = server_head->next; ns->prev = server_head; server_head->next = ns; etc.)
- useless casts: resolv = (u8 *) malloc((size_t)st.st_size + 1);
- why is it doing CLEAR so often before free?
[Automatically added by flyspray2trac: Operating System: All]