Changeset ca37e8


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

Location:
upstream_keepalive
Files:
2 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)) { 
  • upstream_keepalive/t/memcached-keepalive.t

    r2904d4 rca37e8  
    2121plain(skip_all => 'Cache::Memcached not installed') if $@; 
    2222 
    23 my $t = Test::Nginx->new()->has('rewrite')->has_daemon('memcached')->plan(10) 
     23my $t = Test::Nginx->new()->has('rewrite')->has_daemon('memcached')->plan(16) 
    2424    ->write_file_expand('nginx.conf', <<'EOF'); 
    2525 
     
    9595EOF 
    9696 
    97 $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8081'); 
    98 $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8082'); 
     97if (`memcached -h` =~ /repcached/) { 
     98    # repcached patches adds additional listen socket memcached 
     99    # that should be different too 
     100 
     101    $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8081', 
     102        '-X', '8091'); 
     103    $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8082', 
     104        '-X', '8092'); 
     105 
     106} else { 
     107    $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8081'); 
     108    $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8082'); 
     109} 
     110 
    99111$t->run(); 
     112 
     113$t->waitforsocket('127.0.0.1:8081') 
     114    or die "Unable to start memcached"; 
     115$t->waitforsocket('127.0.0.1:8082') 
     116    or die "Unable to start second memcached"; 
    100117 
    101118############################################################################### 
     
    106123$memd1->set('/', 'SEE-THIS'); 
    107124$memd2->set('/', 'SEE-THIS'); 
     125$memd1->set('/big', 'X' x 1000000); 
    108126 
    109127my $total = $memd1->stats()->{total}->{total_connections}; 
     
    120138    'only one connection used'); 
    121139 
     140# Since nginx doesn't read all data from connection in some situations (head 
     141# requests, post_action, errors writing to client) we have to close such 
     142# connections.  Check if we really do close them. 
     143 
     144$total = $memd1->stats()->{total}->{total_connections}; 
     145 
     146unlike(http_head('/'), qr/SEE-THIS/, 'head request'); 
     147like(http_get('/'), qr/SEE-THIS/, 'get after head'); 
     148 
     149is($memd1->stats()->{total}->{total_connections}, $total + 1, 
     150    'head request closes connection'); 
     151 
     152$total = $memd1->stats()->{total}->{total_connections}; 
     153 
     154unlike(http_head('/big'), qr/XXX/, 'big head'); 
     155like(http_get('/'), qr/SEE-THIS/, 'get after big head'); 
     156 
     157is($memd1->stats()->{total}->{total_connections}, $total + 1, 
     158    'big head request closes connection'); 
     159 
    122160# two backends with 'single' option - should establish only one connection 
    123161 
Note: See TracChangeset for help on using the changeset viewer.