mirror of
https://github.com/nginx/nginx.git
synced 2024-12-16 14:19:00 +08:00
a256afd064
to delete old inactive entries: one of them removes a entry just locked by other manager from the queue and the rbtree as long inactive entry, causes the latter manager to segfault leaving cache mutex locked, the bug has been introduced in r3727
147 lines
4.5 KiB
C
147 lines
4.5 KiB
C
|
|
/*
|
|
* Copyright (C) Igor Sysoev
|
|
*/
|
|
|
|
|
|
#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_HIT 6
|
|
#define NGX_HTTP_CACHE_SCARCE 7
|
|
|
|
#define NGX_HTTP_CACHE_KEY_LEN 16
|
|
|
|
|
|
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;
|
|
/* 11 unused bits */
|
|
|
|
ngx_file_uniq_t uniq;
|
|
time_t expire;
|
|
time_t valid_sec;
|
|
size_t body_start;
|
|
off_t length;
|
|
} 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];
|
|
|
|
ngx_file_uniq_t uniq;
|
|
time_t valid_sec;
|
|
time_t last_modified;
|
|
time_t date;
|
|
|
|
size_t header_start;
|
|
size_t body_start;
|
|
off_t length;
|
|
|
|
ngx_uint_t min_uses;
|
|
ngx_uint_t error;
|
|
ngx_uint_t valid_msec;
|
|
|
|
ngx_buf_t *buf;
|
|
|
|
ngx_http_file_cache_t *file_cache;
|
|
ngx_http_file_cache_node_t *node;
|
|
|
|
unsigned updated:1;
|
|
unsigned updating:1;
|
|
unsigned exists:1;
|
|
unsigned temp_file:1;
|
|
};
|
|
|
|
|
|
typedef struct {
|
|
time_t valid_sec;
|
|
time_t last_modified;
|
|
time_t date;
|
|
uint32_t crc32;
|
|
u_short valid_msec;
|
|
u_short header_start;
|
|
u_short body_start;
|
|
} 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_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;
|
|
|
|
ngx_msec_t last;
|
|
ngx_uint_t files;
|
|
|
|
ngx_shm_zone_t *shm_zone;
|
|
};
|
|
|
|
|
|
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);
|
|
void 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);
|
|
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_ */
|