Merge pull request #885 from pagespeed/oschaaf-trunk-tracking-release-early
Release base fetch early, eliminate write_pending and fetch_done
This commit is contained in:
@@ -105,14 +105,8 @@ void NgxBaseFetch::ReadCallback(const ps_event_data& data) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ps_request_ctx_t* ctx = ps_get_request_context(r);
|
ps_request_ctx_t* ctx = ps_get_request_context(r);
|
||||||
|
|
||||||
CHECK(data.sender == ctx->base_fetch);
|
CHECK(data.sender == ctx->base_fetch);
|
||||||
|
|
||||||
// ngx_base_fetch_handler() ends up setting ctx->fetch_done, which
|
|
||||||
// means we shouldn't call it anymore.
|
|
||||||
if (ctx->fetch_done) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CHECK(r->count > 0) << "r->count: " << r->count;
|
CHECK(r->count > 0) << "r->count: " << r->count;
|
||||||
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|||||||
+14
-15
@@ -220,6 +220,12 @@ void ps_set_buffered(ngx_http_request_t* r, bool on) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void ps_release_base_fetch(ps_request_ctx_t* ctx);
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace ps_base_fetch {
|
namespace ps_base_fetch {
|
||||||
|
|
||||||
ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
@@ -236,16 +242,16 @@ ngx_int_t ps_base_fetch_filter(ngx_http_request_t* r, ngx_chain_t* in) {
|
|||||||
"http pagespeed write filter \"%V\"", &r->uri);
|
"http pagespeed write filter \"%V\"", &r->uri);
|
||||||
|
|
||||||
// send response body
|
// send response body
|
||||||
if (in || ctx->write_pending) {
|
if (in || r->connection->buffered) {
|
||||||
ngx_int_t rc = ngx_http_next_body_filter(r, in);
|
ngx_int_t rc = ngx_http_next_body_filter(r, in);
|
||||||
ctx->write_pending = (rc == NGX_AGAIN);
|
// We can't indicate that we are done yet, because we have an active base
|
||||||
if (rc == NGX_OK && !ctx->fetch_done) {
|
// fetch associated to this request.
|
||||||
return NGX_AGAIN;
|
if (rc != NGX_OK) {
|
||||||
}
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ctx->fetch_done ? NGX_OK : NGX_AGAIN;
|
return NGX_AGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This runs on the nginx event loop in response to seeing the byte PageSpeed
|
// This runs on the nginx event loop in response to seeing the byte PageSpeed
|
||||||
@@ -300,8 +306,6 @@ ngx_int_t ps_base_fetch_handler(ngx_http_request_t* r) {
|
|||||||
return NGX_DONE;
|
return NGX_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->write_pending = (rc == NGX_AGAIN);
|
|
||||||
|
|
||||||
ps_set_buffered(r, true);
|
ps_set_buffered(r, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,6 +321,7 @@ ngx_int_t ps_base_fetch_handler(ngx_http_request_t* r) {
|
|||||||
|
|
||||||
if (rc == NGX_ERROR) {
|
if (rc == NGX_ERROR) {
|
||||||
ps_set_buffered(r, false);
|
ps_set_buffered(r, false);
|
||||||
|
ps_release_base_fetch(ctx);
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,7 +332,7 @@ ngx_int_t ps_base_fetch_handler(ngx_http_request_t* r) {
|
|||||||
|
|
||||||
if (rc == NGX_OK) {
|
if (rc == NGX_OK) {
|
||||||
ps_set_buffered(r, false);
|
ps_set_buffered(r, false);
|
||||||
ctx->fetch_done = true;
|
ps_release_base_fetch(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ps_base_fetch_filter(r, cl);
|
return ps_base_fetch_filter(r, cl);
|
||||||
@@ -1209,17 +1214,12 @@ GoogleString ps_determine_url(ngx_http_request_t* r) {
|
|||||||
host, port_string, str_to_string_piece(r->unparsed_uri));
|
host, port_string, str_to_string_piece(r->unparsed_uri));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ps_release_base_fetch(ps_request_ctx_t* ctx);
|
|
||||||
|
|
||||||
// we are still at pagespeed phase
|
// we are still at pagespeed phase
|
||||||
ngx_int_t ps_decline_request(ngx_http_request_t* r) {
|
ngx_int_t ps_decline_request(ngx_http_request_t* r) {
|
||||||
ps_request_ctx_t* ctx = ps_get_request_context(r);
|
ps_request_ctx_t* ctx = ps_get_request_context(r);
|
||||||
CHECK(ctx != NULL);
|
CHECK(ctx != NULL);
|
||||||
|
|
||||||
// re init ctx
|
// re init ctx
|
||||||
ctx->fetch_done = false;
|
|
||||||
ctx->write_pending = false;
|
|
||||||
|
|
||||||
ps_set_buffered(r, false);
|
ps_set_buffered(r, false);
|
||||||
|
|
||||||
r->count++;
|
r->count++;
|
||||||
@@ -1714,7 +1714,6 @@ ngx_int_t ps_resource_handler(ngx_http_request_t* r,
|
|||||||
ctx = new ps_request_ctx_t();
|
ctx = new ps_request_ctx_t();
|
||||||
|
|
||||||
ctx->r = r;
|
ctx->r = r;
|
||||||
ctx->write_pending = false;
|
|
||||||
ctx->html_rewrite = false;
|
ctx->html_rewrite = false;
|
||||||
ctx->in_place = false;
|
ctx->in_place = false;
|
||||||
ctx->preserve_caching_headers = kDontPreserveHeaders;
|
ctx->preserve_caching_headers = kDontPreserveHeaders;
|
||||||
|
|||||||
@@ -89,9 +89,6 @@ typedef struct {
|
|||||||
bool html_rewrite;
|
bool html_rewrite;
|
||||||
bool in_place;
|
bool in_place;
|
||||||
|
|
||||||
bool write_pending;
|
|
||||||
bool fetch_done;
|
|
||||||
|
|
||||||
PreserveCachingHeaders preserve_caching_headers;
|
PreserveCachingHeaders preserve_caching_headers;
|
||||||
|
|
||||||
// for html rewrite
|
// for html rewrite
|
||||||
|
|||||||
Reference in New Issue
Block a user