Mercurial > hg > nginx
view src/http/modules/perl/nginx.pm @ 8045:aa28c802409f
Resolver: make TCP write timer event cancelable.
Similar to 70e65bf8dfd7, the change is made to ensure that the ability to
cancel resolver tasks is fully controlled by the caller. As mentioned in the
referenced commit, it is safe to make this timer cancelable because resolve
tasks can have their own timeouts that are not cancelable.
The scenario where this may become a problem is a periodic background resolve
task (not tied to a specific request or a client connection), which receives a
response with short TTL, large enough to warrant fallback to a TCP query.
With each event loop wakeup, we either have a previously set write timer
instance or schedule a new one. The non-cancelable write timer can delay or
block graceful shutdown of a worker even if the ngx_resolver_ctx_t->cancelable
flag is set by the API user, and there are no other tasks or connections.
We use the resolver API in this way to maintain the list of upstream server
addresses specified with the 'resolve' parameter, and there could be third-party
modules implementing similar logic.
author | Aleksei Bavshin <a.bavshin@f5.com> |
---|---|
date | Wed, 01 Jun 2022 20:17:23 -0700 |
parents | be5cfa918bfc |
children | 985b0bda403c |
line wrap: on
line source
package nginx; use 5.006001; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw( OK DECLINED HTTP_OK HTTP_CREATED HTTP_ACCEPTED HTTP_NO_CONTENT HTTP_PARTIAL_CONTENT HTTP_MOVED_PERMANENTLY HTTP_MOVED_TEMPORARILY HTTP_REDIRECT HTTP_SEE_OTHER HTTP_NOT_MODIFIED HTTP_TEMPORARY_REDIRECT HTTP_PERMANENT_REDIRECT HTTP_BAD_REQUEST HTTP_UNAUTHORIZED HTTP_PAYMENT_REQUIRED HTTP_FORBIDDEN HTTP_NOT_FOUND HTTP_NOT_ALLOWED HTTP_NOT_ACCEPTABLE HTTP_REQUEST_TIME_OUT HTTP_CONFLICT HTTP_GONE HTTP_LENGTH_REQUIRED HTTP_REQUEST_ENTITY_TOO_LARGE HTTP_REQUEST_URI_TOO_LARGE HTTP_UNSUPPORTED_MEDIA_TYPE HTTP_RANGE_NOT_SATISFIABLE HTTP_INTERNAL_SERVER_ERROR HTTP_SERVER_ERROR HTTP_NOT_IMPLEMENTED HTTP_BAD_GATEWAY HTTP_SERVICE_UNAVAILABLE HTTP_GATEWAY_TIME_OUT HTTP_INSUFFICIENT_STORAGE ); our $VERSION = '%%VERSION%%'; require XSLoader; XSLoader::load('nginx', $VERSION); # Preloaded methods go here. use constant OK => 0; use constant DECLINED => -5; use constant HTTP_OK => 200; use constant HTTP_CREATED => 201; use constant HTTP_ACCEPTED => 202; use constant HTTP_NO_CONTENT => 204; use constant HTTP_PARTIAL_CONTENT => 206; use constant HTTP_MOVED_PERMANENTLY => 301; use constant HTTP_MOVED_TEMPORARILY => 302; use constant HTTP_REDIRECT => 302; use constant HTTP_SEE_OTHER => 303; use constant HTTP_NOT_MODIFIED => 304; use constant HTTP_TEMPORARY_REDIRECT => 307; use constant HTTP_PERMANENT_REDIRECT => 308; use constant HTTP_BAD_REQUEST => 400; use constant HTTP_UNAUTHORIZED => 401; use constant HTTP_PAYMENT_REQUIRED => 402; use constant HTTP_FORBIDDEN => 403; use constant HTTP_NOT_FOUND => 404; use constant HTTP_NOT_ALLOWED => 405; use constant HTTP_NOT_ACCEPTABLE => 406; use constant HTTP_REQUEST_TIME_OUT => 408; use constant HTTP_CONFLICT => 409; use constant HTTP_GONE => 410; use constant HTTP_LENGTH_REQUIRED => 411; use constant HTTP_REQUEST_ENTITY_TOO_LARGE => 413; use constant HTTP_REQUEST_URI_TOO_LARGE => 414; use constant HTTP_UNSUPPORTED_MEDIA_TYPE => 415; use constant HTTP_RANGE_NOT_SATISFIABLE => 416; use constant HTTP_INTERNAL_SERVER_ERROR => 500; use constant HTTP_SERVER_ERROR => 500; use constant HTTP_NOT_IMPLEMENTED => 501; use constant HTTP_BAD_GATEWAY => 502; use constant HTTP_SERVICE_UNAVAILABLE => 503; use constant HTTP_GATEWAY_TIME_OUT => 504; use constant HTTP_INSUFFICIENT_STORAGE => 507; sub rflush { my $r = shift; $r->flush; } 1; __END__ =head1 NAME nginx - Perl interface to the nginx HTTP server API =head1 SYNOPSIS use nginx; =head1 DESCRIPTION This module provides a Perl interface to the nginx HTTP server API. =head1 SEE ALSO http://nginx.org/en/docs/http/ngx_http_perl_module.html =head1 AUTHOR Igor Sysoev =head1 COPYRIGHT AND LICENSE Copyright (C) Igor Sysoev Copyright (C) Nginx, Inc. =cut