]> git.ipfire.org Git - thirdparty/squid.git/commit
Upgrade comm layer Connection handling
authorAmos Jeffries <squid3@treenet.co.nz>
Fri, 17 Jun 2011 16:32:04 +0000 (04:32 +1200)
committerAmos Jeffries <squid3@treenet.co.nz>
Fri, 17 Jun 2011 16:32:04 +0000 (04:32 +1200)
commit1c8f25bbb056368c4405473ff7304156608e92cc
treec4e727b5cb256e3c07985f1a0cca73e2ea1d6aba
parentcf0a0bdf7aae28c21019dee81d9a6ceec43c6f33
parentf3f71ee92a27bd8f150397e630c14fee6bdcc870
Upgrade comm layer Connection handling

The premise underlying this large patch is that instead of copying and
re-copying and re-lookups for the FD related data we can take the
ConnectionDetail class which is generated to store a few bits of IP
information about newly accept()'d connections and make it persist across
the whole of Squid.

It has been renamed from ConnectionDetails to Comm::Connection and has
absorbed a few FD data fields from other classes long the code paths.
Its scope is to hold an FD (or potential FD) plus meta data.

Comm::Connection are valid before, during and after the period when their
particular FD is open. The meta data may be used beforehand to setup the
FD (in the case of peer selection or other TcpAcceptor usage), and it may
remain in use after FD closure until logging or all linked job and call
objects have detected the closure and terminated. A global function
Comm::IsConnOpen() may be used on the pointer objects to detect whether
they point at an active connection.

Most of the patch is simple parameter changes to functions and methods to
pass a "cont Comm::ConnectionPointer &" instead of an "int FD". Along with
class FD fields being converted to these object pointers.

In order to support this alteration there have been behavioral changes to:

The socket accept() Job
  Comm::TcpAcceptor altered to spawn Comm::Connection objects and to
  operate with one controlling their active/closed state.

FTP data channel handling Calls.
  efficiency improvements making use of Comm::Connection as a feedback
  channel between TcpAcceptor and FtpStateData to cancel the listening
  Job. Most of the underlying logic change is already in trunk to use
  the Subscription API. This just streamlines and fixes some race bugs.

Peer selection
  updated to spawn a set of Comm::Connection objects. To do this it is
  updated to determine *all* peers including DIRECT ones. Doing the DNS
  lookup instead of leaving it to comm_connect() on the other side of
  FwdState. It also absorbs the outgoing address selection from FwdState
  and can now specify details of local+remote ends of an outgoing TCP link.

Forwarding
  updated to handle the new outputs from peer selection and to open sequentially.

pconn handling
  updated to use destination IP/port and hold a Comm::Connection instead
  of domain name indexing an FD. This allows us to maintain idle pools
  and re-use FD more efficiently with virtual-hosted servers. Along
  with maintaining certainty that the pconn selected actually goes to
  the exact destination IP:port needed by forwarding.

comm layer outgoing connections
  now have a control job Comm::ConnOpener to do this. Due to the peer
  selection and forwarding changes this is a much simpler operation.

HTTP / CONNECT tunnel / gopher / whois / FTP
  updated to receive a server and client Comm::Connection object from
  forwarding. To operate on those until they close or are finished with.

SNMP / ICP / HTCP / DNS port listeners
  updated to work with Comm::Connection holding their listening socket
  meta data. This is a side-effect of the ICP and Comm read/write/timeout
  changes.
src/comm/Connection.h
src/errorpage.cc
src/errorpage.h
src/ssl/Makefile.am