I just committed a change in mod_http2 that will return idle connections back 
to the mpm, expecting to be invoked again when new data arrives. I learned 
quite something about event (have not looked much at motorz yet) and am 
thinking about improvements. If knowledgeable people could give me a hand here, 
I'd highly appreciate it.

Observation 1: mapping conn_states
  As I understand it, the connection state model, as defined in conn_state_e, 
enables asynchronous processing in two states:
  a. CONN_STATE_CHECK_REQUEST_LINE_READABLE, check read, invoke 
ap_run_process_connection() on data
  b. CONN_STATE_WRITE_COMPLETION, check write, if data is still in out filters

  An invocation of ap_run_process_connection() is expected to return, usually 
in WRITE_COMPLETION state. Then any data is attempted to be written. When this 
succeeds, the next state depends on secondary flags such as c->aborted, 
c->keepalive and c->data_in_input_filters.

  HTTP/2 processing has one state where it fits into this model: when no more 
streams are open. This is what is currently implemented in trunk. 

  However, there is another state in HTTP/2 processing, where a BLOCK_READ is 
performed: flow control on streaming out responses. Basically, the client has a 
window of n bytes, the server sends n response bytes and then needs to wait for 
the client to increase the window again. This would be a good time to resume 
processing back to the mpm, and initially I did so. But that breaks under load.

  Under load, the event mpm feels free to close connections in certain states - 
I think CONN_STATE_CHECK_REQUEST_LINE_READABLE. That is fine for a HTTP/1 
connection as it always is between requests here. But HTTP/2 would also like to 
use read events, but unloading a child by closing such connections is not the 
right thing to do.

  Is there a way mod_http2 can achieve this or do we need another flag in 
conn_rec/cs?

Observation 2: controlled close
  HTTP/2 would like to send out a last frame when closing a connection in a 
controlled/timeout way. Do we need another hook for that? Something like 
"pre_close_connection"?
 
Observation 3: timeouts
  a. If admins would like to have another Timeout for HTTP/2 connections, they 
are currently stuck with configuring one Timeout which goes to 
server_rec->timeout, right? For idle connections, clients already try to keep 
it open longer. It would be nice to give admins a choice here for different 
values based on the selected protocol. How to best do this?

  b. Handling own timeouts: if I want, during processing the connection, a 
different socket timeout, I can just set it using apr_socket_timeout_set()? 
Shall I restore it back to server->timeout before returning?

  c. What would be the best way to wait for a file description *and* 
conditional event simultaneously? mod_http2 has now a sort of pool loop with 
double backup timer for situations where it needs to watch both client and 
backend processes.


Cheers,

  Stefan





Reply via email to