shinrich opened a new pull request #7622:
URL: https://github.com/apache/trafficserver/pull/7622


   This is work that has been going on in fits and starts for a couple years 
with contributions from @a-canary and Kees.  And discussions with @masaori335 
and @maskit.  I have been using the project page 
https://github.com/apache/trafficserver/projects/9 to track issues and progress.
   
   This latest effort builds upon @a-canary's earlier PoolableSession 
restructuring work and has been going in earnest since last December.  I have 
run a version of this code against our 9.0.x (plus some other HTTP/2 commits to 
ease the merge) on one of our production boxes for several weeks.  That worked 
out many memory management issues.  In that environment it negotiated HTTP/2 
with another ATS layer and an istio/envoy layer.  About 20% of our outbound 
transactions were over H2.
   
   I've just brought it back to master and rebased for this PR.  Locally on my 
Centos7 box is passes autest, unit tests, and regression tests.
   
   This code contains trailer logic to support gRPC.  I have run versions of 
this code against one of the python examples in the gRPC repository, but that 
was last done in January.  The gRPC/trailer support needs more testing, but it 
is a start.
   
   Some key code changes include
   
   * ConnectionPool/ConnectingEntry - This data structure tracks existing 
outstanding connection requests.  For HTTP/2, you may receive many simultaneous 
incoming streams all heading for the same location.  You do not want to start 
separate HTTP/2 sessions for each.  The code uses to history in the HostInfo to 
determine if it is likely that the origin will negotiate HTTP/2 and use the 
ConnnectionPool or connect directly ignoring other outstanding connection 
requests.
   * Server_session becomes server_txn in HttpSM. 
   * An overridable ALPN setting has been added to control whether ATS will 
offer to negotiate H2 with the origin.
   * Two h2 origin autests have been added leveraging proxy-verifier.
   
   The main code change is adding Http2 versions of transactions and sessions, 
and creating a Http1 server transaction.  The class hierarchies differ slightly 
between Http1 and Http2.  For Http1, both Http1ClientTransaction and 
Http1ServerTransaction inherit  directly from ProxyTransaction. 
   
   For Http2, there is still only the Http2Stream to represent both client and 
server transactions.  This PR adds an _outbound_flag to track the few cases 
where we do need to process inbound and outbound transactions differently.  For 
the sessions, the common elements of session processing are moved into 
Http2CommonSession.  The common class is used as a mix in for 
Http2ClientSession and Http2ServerSession.    Http2ClientSession continues to 
inherit directly from ProxySession.  Http2ServerSession inherits from 
PoolableSession as the Http1ServerSession does.
   
   One other thing to point out, is that the Http2ServerSessions can only be 
put in a Thread session pool.  I tested in hybrid mode, but pure thread pool 
mode should also work.  I need to see what happens with global pool mode.  That 
will likely require an addition check, warning, or error.
   
   This branch also includes connection failure cleanups identified in PR 
#7580.  We are running with that change in our production environment.  Pulling 
it back out to make the master PR seemed unnecessary since it will hopefully 
land first.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to