Medium-long term roadmap - 2014/04/23

Legend: '+' = done, '-' = todo, '*' = done except doc

1.5 (ETA 2013/12/31) :
  - POST parameter extraction and size/speed measurement to use in ACLs

  - return-html code xxx [ file "xxx" | text "xxx" ] if <acl>

  - return-raw  [ file "xxx" | text "xxx" ] if <acl>

  - avg connect time, response time, connect errors, response errors in stats

  - add the ability to only dump response errors to more easily detect
    anomalies without being polluted with attacks in requests.

  - add support for server-side unix sockets

  - have multi-criteria analysers which subscribe to req flags, rsp flags, and
    stream interface changes. This would result in a single analyser to wait
    for the end of data transfer in HTTP.

  - implement support for "connection freeze" after accept. A list of frozen
    connections should be maintained so that it is possible to recycle them
    when new file descriptors are required.

  - support for time-ordered priority queues with ability to add an offset
    based on request matching. Each session will have one ebtree node to be
    attached to whatever queue the session is waiting in.

  - half-closed timeouts ?

  - add a flag in logs to indicate keep-alive requests ?

  - make it possible to condition a timeout on an ACL (dynamic timeouts)

  - forwardfor/originalto except with IPv6

  - have a callback function which would be called after a server is selected,
    for header post-processing. That would be mainly used to remove then add
    the server's name or cookie in a header so that the server knows it.

  - remove lots of remaining Alert() calls or ensure that they forward to
    send_log() after the fork.

  - tcp-request session

  - tcp-request session expect-proxy {L4|L5} if ...

  - http-request track-sc* to avoid having the ugly "if !HTTP" in tcp-request

DONE:
  * server-side HTTP keepalive
    => maybe with limitation to only reuse connections that don't depend
       on layer7 in a first time (just check the target).

  * add support for complex pattern extraction rules :

       pattern = <pattern_term>
               | '{' pattern_expr '}'

       pattern_expr = <pattern_term> [ <transform> ... ]
    => changed to <sample>[,<conv>]*

  * support loading data sets from files
      * present/not present (eg: netmasks)
      * pattern conversion per prefixes. Eg: convert src IP to country.
      => maps

  * what to do with data after a POST and how to detect some data were
    received when responding ? In theory we should read everything because
    the TCP stack does not notify us that the FIN was acked. In practice,
    reading just before closing should be enough. Right now we simply read
    whatever comes after the POST.
    => switch the connection to a "drain" state, where it monitors its
       output queue on each I/O and where it can be stolen if fds are
       missing.

  * tcp-request {connection|session} expect-proxy {L4|L5} if ...

  * rename L4 acls as L6 ACLs when some content is involved

  * add new L4 ACL checks immediately after accept, before even allocating the
    buffers ("connection {accept|reject|delay|freeze} {if|unless}").

  * make new patterns available based on stickiness matching :
      * number of entries in table for the matched pattern
      * same after having increased the match counter

  * add support for concurrency match in tables
      * just like stickiness, but counted per session (or request), increased
        on first match and decreased at end of request or connection. This
        requires that the session has a list of matched terms that must be
        released at the end.

  * http_req_first ACL

  * expirable cookies + "preserve"

  * ECV, LDAPv3 & MySQL checks

  * configurable check buffer size

  * stats + ON/OFF

  * halog: sort by URL

  * "PROXY" protocol

  * add support for client-side unix sockets

  * hash: rehash non-consistent hashes with chash() for more randomness.

  * add an error ID in captures to ease new error detection for scripts.

  * try to remove srv==NULL internally and assign a dummy server to each backend
    for dispatch, http_proxy and transparent modes. => done differently with the
    target descriptors. The dummy server code exists in the "dummysrv" branch
    which will die since it does not make sense anymore.

  * ACL to report number of used entries in a table

  * automatically compute fullconn for backends : by default, set it to
    10% of the sum of the maxconn of all unique frontends which reference
    it via use_backend, default_backend or that are in the same listen.

  * count number of monitor requests on frontends, that's the only way
    to explain the possible huge difference between frontend and backend
    sessions.

  * assign a nice priority based on ACLs.

  * set-log-level if <acl> (front/back)

  * fix "PR--" flags when accessing stats

  * merged ACL/fetches

  * use_server ... if ...

  * ability to kill an arbitrary session from the command line. Put a "kill now"
    flag in every session which preempts any other processing and wake the
    session up.

  * add a last activity date for each server (req/resp) that will be
    displayed in the stats. It will be useful with soft stop.

  * compression : to be fixed

  * ACL feeding via the UNIX socket

  * lookup tables (eg: map IP to country)

1.6 (will probably change anyway) :
  - wait on resource (time, mem, CPU, socket, buffers, server's conn, server's rate, ...)

  - bandwidth limits

  - create internal services and make stats, CLI, etc... part of that.

  - buddy servers to build defined lists of failovers. Detect loops during
    the config check.

          server XXX buddy YYY
          server YYY    # may replace XXX when XXX fails

  - spare servers : servers which are used in LB only when a minimum farm
    weight threshold is not satisfied anymore. Useful for inter-site LB with
    local pref by default.

  - add support for event-triggered epoll, and maybe change all events handling
    to pass through an event cache to handle temporarily disabled events.

  - evaluate the changes required for multi-process+shared mem or multi-thread
    +thread-local+fast locking.

  - ability to decide whether to drain or kill sessions when putting a server
    to maintenance mode => requires a per-server session list and the change
    above.

Old, maybe obsolete points
 - clarify licence by adding a 'MODULE_LICENCE("GPL")' or something equivalent.

 - 3 memory models : failsafe (prealloc), normal (current), optimal (alloc on
   demand)

 - implement support for event-triggerred epoll()

 - verify if it would be worth implementing an epoll_ctl_batch() for Linux

 - option minservers XXX : activates some spare servers when active servers
   are insufficient

 - new keyword 'check' : check http xxx, check smtp xxx, check ssl-hello

 - initcwnd parameter for bind sockets : needed in kernel first

Unsorted :
  - outgoing log load-balancing (round-robin or hash among multiple servers)
  - internal socket for "server XXX frontend:name"
  - HTTP/2.0
  - DNS requests on health checks
  - XML inspection (content-switching for SOAP requests)
  - sync all stick-tables data, not just serverid.
  - request, session and user variables
  - random cookie generator
  - external checker
  - fastcgi to servers
  - hot config reload
  - RAM-based cache for small files
  - RHI - BGP
  - telnet/SSH cli
  - dynamic memory allocation
  - dynamic weights based on check response headers and traffic response time
  - various kernel-level acceleration (multi-accept, ssplice, epoll2...)
  - "show stats detail" with a different output format and encoding of quotes
