Ignore:
Timestamp:
01/16/09 19:58:58 (3 years ago)
Author:
George Potapov <nephrite@…>
Branches:
master-v0.7, upstream_count_limit
Children:
cd26d0
Parents:
3f2f24
git-author:
George Potapov <nephrite@…> (01/16/09 19:58:58)
git-committer:
George Potapov <nephrite@…> (01/16/09 19:58:58)
Message:

updated to latest upstream_keepalive (ngx_http_upstream_keepalive-067ddc059ee0.tar.gz) from Maxim Dounin

File:
1 edited

Legend:

Unmodified
Added
Removed
  • upstream_keepalive/ngx_http_upstream_keepalive_module.c

    r2904d4 rca37e8  
    2626    ngx_http_upstream_keepalive_srv_conf_t  *conf; 
    2727 
     28    ngx_http_upstream_t               *upstream; 
     29 
    2830    void                              *data; 
    2931 
    3032    ngx_event_get_peer_pt              original_get_peer; 
    3133    ngx_event_free_peer_pt             original_free_peer; 
     34 
     35    ngx_uint_t                         failed;       /* unsigned:1 */ 
    3236 
    3337} ngx_http_upstream_keepalive_peer_data_t; 
     
    170174 
    171175    kp->conf = kcf; 
     176    kp->upstream = r->upstream; 
    172177    kp->data = r->upstream->peer.data; 
    173178    kp->original_get_peer = r->upstream->peer.get; 
     
    194199    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, 
    195200                   "get keepalive peer"); 
     201 
     202    kp->failed = 0; 
    196203 
    197204    /* single pool of cached connections */ 
     
    265272    ngx_http_upstream_keepalive_cache_t      *item; 
    266273 
    267     ngx_queue_t       *q; 
    268     ngx_connection_t  *c; 
     274    ngx_uint_t            status; 
     275    ngx_queue_t          *q; 
     276    ngx_connection_t     *c; 
     277    ngx_http_upstream_t  *u; 
    269278 
    270279    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, 
    271280                   "free keepalive peer"); 
    272281 
    273     if (!(state & NGX_PEER_FAILED) 
    274         && pc->connection != NULL) 
     282    /* remember failed state - peer.free() may be called more than once */ 
     283 
     284    if (state & NGX_PEER_FAILED) { 
     285        kp->failed = 1; 
     286    } 
     287 
     288    /* 
     289     * cache valid connections 
     290     * 
     291     * For memcached this means status either 404 or 200.  For status 200 we 
     292     * should also check if all response body was read (u->length == 0) and 
     293     * make sure that u->length is valid (we use u->header_sent flag to test 
     294     * this).  Memcached is the only supported protocol for now. 
     295     * 
     296     * Some notes on other possibilities (incomplete): 
     297     * 
     298     * fastcgi: u->pipe->upstream_done should be sufficient 
     299     * 
     300     * proxy buffered: u->pipe->upstream_done, 304 replies, replies to head 
     301     * requests (see RFC 2616, 4.4 Message Length) 
     302     * 
     303     * proxy unbuffered: 200 as for memcached (with u->length == 0 and 
     304     * header_sent), 304, replies to head requests 
     305     * 
     306     * subrequest_in_memory: won't work as of now 
     307     * 
     308     * TODO: move this logic to protocol modules (NGX_PEER_KEEPALIVE?) 
     309     */ 
     310 
     311    u = kp->upstream; 
     312    status = u->headers_in.status_n; 
     313 
     314    if (!kp->failed 
     315        && pc->connection != NULL 
     316        && (status == NGX_HTTP_NOT_FOUND 
     317            || (status == NGX_HTTP_OK && u->header_sent && u->length == 0))) 
    275318    { 
    276319        c = pc->connection; 
     320 
     321        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, 
     322                       "free keepalive peer: saving connection %p", c); 
    277323 
    278324        if (ngx_queue_empty(&kp->conf->free)) { 
Note: See TracChangeset for help on using the changeset viewer.