1 2 /* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) Nginx, Inc. 5 */ 6 7 8 #ifndef _NGX_HTTP_CACHE_H_INCLUDED_ 9 #define _NGX_HTTP_CACHE_H_INCLUDED_ 10 11 12 #include <ngx_config.h> 13 #include <ngx_core.h> 14 #include <ngx_http.h> 15 16 17 #define NGX_HTTP_CACHE_MISS 1 18 #define NGX_HTTP_CACHE_BYPASS 2 19 #define NGX_HTTP_CACHE_EXPIRED 3 20 #define NGX_HTTP_CACHE_STALE 4 21 #define NGX_HTTP_CACHE_UPDATING 5 22 #define NGX_HTTP_CACHE_REVALIDATED 6 23 #define NGX_HTTP_CACHE_HIT 7 24 #define NGX_HTTP_CACHE_SCARCE 8 25 26 #define NGX_HTTP_CACHE_KEY_LEN 16 27 #define NGX_HTTP_CACHE_ETAG_LEN 128 28 #define NGX_HTTP_CACHE_VARY_LEN 128 29 30 #define NGX_HTTP_CACHE_VERSION 5 31 32 33 typedef struct { 34 ngx_uint_t status; 35 time_t valid; 36 } ngx_http_cache_valid_t; 37 38 39 typedef struct { 40 ngx_rbtree_node_t node; 41 ngx_queue_t queue; 42 43 u_char key[NGX_HTTP_CACHE_KEY_LEN 44 - sizeof(ngx_rbtree_key_t)]; 45 46 unsigned count:20; 47 unsigned uses:10; 48 unsigned valid_msec:10; 49 unsigned error:10; 50 unsigned exists:1; 51 unsigned updating:1; 52 unsigned deleting:1; 53 unsigned purged:1; 54 /* 10 unused bits */ 55 56 ngx_file_uniq_t uniq; 57 time_t expire; 58 time_t valid_sec; 59 size_t body_start; 60 off_t fs_size; 61 ngx_msec_t lock_time; 62 } ngx_http_file_cache_node_t; 63 64 65 struct ngx_http_cache_s { 66 ngx_file_t file; 67 ngx_array_t keys; 68 uint32_t crc32; 69 u_char key[NGX_HTTP_CACHE_KEY_LEN]; 70 u_char main[NGX_HTTP_CACHE_KEY_LEN]; 71 72 ngx_file_uniq_t uniq; 73 time_t valid_sec; 74 time_t updating_sec; 75 time_t error_sec; 76 time_t last_modified; 77 time_t date; 78 79 ngx_str_t etag; 80 ngx_str_t vary; 81 u_char variant[NGX_HTTP_CACHE_KEY_LEN]; 82 83 size_t header_start; 84 size_t body_start; 85 off_t length; 86 off_t fs_size; 87 88 ngx_uint_t min_uses; 89 ngx_uint_t error; 90 ngx_uint_t valid_msec; 91 ngx_uint_t vary_tag; 92 93 ngx_buf_t *buf; 94 95 ngx_http_file_cache_t *file_cache; 96 ngx_http_file_cache_node_t *node; 97 98 #if (NGX_THREADS || NGX_COMPAT) 99 ngx_thread_task_t *thread_task; 100 #endif 101 102 ngx_msec_t lock_timeout; 103 ngx_msec_t lock_age; 104 ngx_msec_t lock_time; 105 ngx_msec_t wait_time; 106 107 ngx_event_t wait_event; 108 109 unsigned lock:1; 110 unsigned waiting:1; 111 112 unsigned updated:1; 113 unsigned updating:1; 114 unsigned exists:1; 115 unsigned temp_file:1; 116 unsigned purged:1; 117 unsigned reading:1; 118 unsigned secondary:1; 119 unsigned background:1; 120 121 unsigned stale_updating:1; 122 unsigned stale_error:1; 123 }; 124 125 126 typedef struct { 127 ngx_uint_t version; 128 time_t valid_sec; 129 time_t updating_sec; 130 time_t error_sec; 131 time_t last_modified; 132 time_t date; 133 uint32_t crc32; 134 u_short valid_msec; 135 u_short header_start; 136 u_short body_start; 137 u_char etag_len; 138 u_char etag[NGX_HTTP_CACHE_ETAG_LEN]; 139 u_char vary_len; 140 u_char vary[NGX_HTTP_CACHE_VARY_LEN]; 141 u_char variant[NGX_HTTP_CACHE_KEY_LEN]; 142 } ngx_http_file_cache_header_t; 143 144 145 typedef struct { 146 ngx_rbtree_t rbtree; 147 ngx_rbtree_node_t sentinel; 148 ngx_queue_t queue; 149 ngx_atomic_t cold; 150 ngx_atomic_t loading; 151 off_t size; 152 ngx_uint_t count; 153 ngx_uint_t watermark; 154 } ngx_http_file_cache_sh_t; 155 156 157 struct ngx_http_file_cache_s { 158 ngx_http_file_cache_sh_t *sh; 159 ngx_slab_pool_t *shpool; 160 161 ngx_path_t *path; 162 163 off_t max_size; 164 size_t bsize; 165 166 time_t inactive; 167 168 time_t fail_time; 169 170 ngx_uint_t files; 171 ngx_uint_t loader_files; 172 ngx_msec_t last; 173 ngx_msec_t loader_sleep; 174 ngx_msec_t loader_threshold; 175 176 ngx_uint_t manager_files; 177 ngx_msec_t manager_sleep; 178 ngx_msec_t manager_threshold; 179 180 ngx_shm_zone_t *shm_zone; 181 182 ngx_uint_t use_temp_path; 183 /* unsigned use_temp_path:1 */ 184 }; 185 186 187 ngx_int_t ngx_http_file_cache_new(ngx_http_request_t *r); 188 ngx_int_t ngx_http_file_cache_create(ngx_http_request_t *r); 189 void ngx_http_file_cache_create_key(ngx_http_request_t *r); 190 ngx_int_t ngx_http_file_cache_open(ngx_http_request_t *r); 191 ngx_int_t ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf); 192 void ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf); 193 void ngx_http_file_cache_update_header(ngx_http_request_t *r); 194 ngx_int_t ngx_http_cache_send(ngx_http_request_t *); 195 void ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf); 196 time_t ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status); 197 198 char *ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, 199 void *conf); 200 char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, 201 void *conf); 202 203 204 extern ngx_str_t ngx_http_cache_status[]; 205 206 207 #endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */ 208