diff options
Diffstat (limited to 'app/nginx/src/http/ngx_http_cache.h')
-rw-r--r-- | app/nginx/src/http/ngx_http_cache.h | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/app/nginx/src/http/ngx_http_cache.h b/app/nginx/src/http/ngx_http_cache.h new file mode 100644 index 0000000..f9e9664 --- /dev/null +++ b/app/nginx/src/http/ngx_http_cache.h @@ -0,0 +1,207 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_HTTP_CACHE_H_INCLUDED_ +#define _NGX_HTTP_CACHE_H_INCLUDED_ + + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_http.h> + + +#define NGX_HTTP_CACHE_MISS 1 +#define NGX_HTTP_CACHE_BYPASS 2 +#define NGX_HTTP_CACHE_EXPIRED 3 +#define NGX_HTTP_CACHE_STALE 4 +#define NGX_HTTP_CACHE_UPDATING 5 +#define NGX_HTTP_CACHE_REVALIDATED 6 +#define NGX_HTTP_CACHE_HIT 7 +#define NGX_HTTP_CACHE_SCARCE 8 + +#define NGX_HTTP_CACHE_KEY_LEN 16 +#define NGX_HTTP_CACHE_ETAG_LEN 128 +#define NGX_HTTP_CACHE_VARY_LEN 128 + +#define NGX_HTTP_CACHE_VERSION 5 + + +typedef struct { + ngx_uint_t status; + time_t valid; +} ngx_http_cache_valid_t; + + +typedef struct { + ngx_rbtree_node_t node; + ngx_queue_t queue; + + u_char key[NGX_HTTP_CACHE_KEY_LEN + - sizeof(ngx_rbtree_key_t)]; + + unsigned count:20; + unsigned uses:10; + unsigned valid_msec:10; + unsigned error:10; + unsigned exists:1; + unsigned updating:1; + unsigned deleting:1; + unsigned purged:1; + /* 10 unused bits */ + + ngx_file_uniq_t uniq; + time_t expire; + time_t valid_sec; + size_t body_start; + off_t fs_size; + ngx_msec_t lock_time; +} ngx_http_file_cache_node_t; + + +struct ngx_http_cache_s { + ngx_file_t file; + ngx_array_t keys; + uint32_t crc32; + u_char key[NGX_HTTP_CACHE_KEY_LEN]; + u_char main[NGX_HTTP_CACHE_KEY_LEN]; + + ngx_file_uniq_t uniq; + time_t valid_sec; + time_t updating_sec; + time_t error_sec; + time_t last_modified; + time_t date; + + ngx_str_t etag; + ngx_str_t vary; + u_char variant[NGX_HTTP_CACHE_KEY_LEN]; + + size_t header_start; + size_t body_start; + off_t length; + off_t fs_size; + + ngx_uint_t min_uses; + ngx_uint_t error; + ngx_uint_t valid_msec; + ngx_uint_t vary_tag; + + ngx_buf_t *buf; + + ngx_http_file_cache_t *file_cache; + ngx_http_file_cache_node_t *node; + +#if (NGX_THREADS || NGX_COMPAT) + ngx_thread_task_t *thread_task; +#endif + + ngx_msec_t lock_timeout; + ngx_msec_t lock_age; + ngx_msec_t lock_time; + ngx_msec_t wait_time; + + ngx_event_t wait_event; + + unsigned lock:1; + unsigned waiting:1; + + unsigned updated:1; + unsigned updating:1; + unsigned exists:1; + unsigned temp_file:1; + unsigned purged:1; + unsigned reading:1; + unsigned secondary:1; + unsigned background:1; + + unsigned stale_updating:1; + unsigned stale_error:1; +}; + + +typedef struct { + ngx_uint_t version; + time_t valid_sec; + time_t updating_sec; + time_t error_sec; + time_t last_modified; + time_t date; + uint32_t crc32; + u_short valid_msec; + u_short header_start; + u_short body_start; + u_char etag_len; + u_char etag[NGX_HTTP_CACHE_ETAG_LEN]; + u_char vary_len; + u_char vary[NGX_HTTP_CACHE_VARY_LEN]; + u_char variant[NGX_HTTP_CACHE_KEY_LEN]; +} ngx_http_file_cache_header_t; + + +typedef struct { + ngx_rbtree_t rbtree; + ngx_rbtree_node_t sentinel; + ngx_queue_t queue; + ngx_atomic_t cold; + ngx_atomic_t loading; + off_t size; + ngx_uint_t count; + ngx_uint_t watermark; +} ngx_http_file_cache_sh_t; + + +struct ngx_http_file_cache_s { + ngx_http_file_cache_sh_t *sh; + ngx_slab_pool_t *shpool; + + ngx_path_t *path; + + off_t max_size; + size_t bsize; + + time_t inactive; + + time_t fail_time; + + ngx_uint_t files; + ngx_uint_t loader_files; + ngx_msec_t last; + ngx_msec_t loader_sleep; + ngx_msec_t loader_threshold; + + ngx_uint_t manager_files; + ngx_msec_t manager_sleep; + ngx_msec_t manager_threshold; + + ngx_shm_zone_t *shm_zone; + + ngx_uint_t use_temp_path; + /* unsigned use_temp_path:1 */ +}; + + +ngx_int_t ngx_http_file_cache_new(ngx_http_request_t *r); +ngx_int_t ngx_http_file_cache_create(ngx_http_request_t *r); +void ngx_http_file_cache_create_key(ngx_http_request_t *r); +ngx_int_t ngx_http_file_cache_open(ngx_http_request_t *r); +ngx_int_t ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf); +void ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf); +void ngx_http_file_cache_update_header(ngx_http_request_t *r); +ngx_int_t ngx_http_cache_send(ngx_http_request_t *); +void ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf); +time_t ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status); + +char *ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + + +extern ngx_str_t ngx_http_cache_status[]; + + +#endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */ |