00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _I_CACHE_H__
00025 #define _I_CACHE_H__
00026
00027 #include "libts.h"
00028 #include "I_EventSystem.h"
00029 #include "I_AIO.h"
00030 #include "I_CacheDefs.h"
00031 #include "I_Store.h"
00032
00033 #define CACHE_MODULE_MAJOR_VERSION 1
00034 #define CACHE_MODULE_MINOR_VERSION 0
00035 #define CACHE_MODULE_VERSION makeModuleVersion(CACHE_MODULE_MAJOR_VERSION,\
00036 CACHE_MODULE_MINOR_VERSION,\
00037 PUBLIC_MODULE_HEADER)
00038
00039 #define CACHE_WRITE_OPT_OVERWRITE 0x0001
00040 #define CACHE_WRITE_OPT_CLOSE_COMPLETE 0x0002
00041 #define CACHE_WRITE_OPT_SYNC (CACHE_WRITE_OPT_CLOSE_COMPLETE | 0x0004)
00042 #define CACHE_WRITE_OPT_OVERWRITE_SYNC (CACHE_WRITE_OPT_SYNC | CACHE_WRITE_OPT_OVERWRITE)
00043
00044 #define SCAN_KB_PER_SECOND 8192 // 1TB/8MB = 131072 = 36 HOURS to scan a TB
00045
00046 #define RAM_CACHE_ALGORITHM_CLFUS 0
00047 #define RAM_CACHE_ALGORITHM_LRU 1
00048
00049 #define CACHE_COMPRESSION_NONE 0
00050 #define CACHE_COMPRESSION_FASTLZ 1
00051 #define CACHE_COMPRESSION_LIBZ 2
00052 #define CACHE_COMPRESSION_LIBLZMA 3
00053
00054 struct CacheVC;
00055 struct CacheDisk;
00056 #ifdef HTTP_CACHE
00057 class CacheLookupHttpConfig;
00058 class URL;
00059 class HTTPHdr;
00060 class HTTPInfo;
00061
00062 typedef HTTPHdr CacheHTTPHdr;
00063 typedef URL CacheURL;
00064 typedef HTTPInfo CacheHTTPInfo;
00065 #endif
00066
00067 struct CacheProcessor:public Processor
00068 {
00069 CacheProcessor()
00070 : min_stripe_version(CACHE_DB_MAJOR_VERSION, CACHE_DB_MINOR_VERSION)
00071 , max_stripe_version(CACHE_DB_MAJOR_VERSION, CACHE_DB_MINOR_VERSION)
00072 , cb_after_init(0)
00073 {}
00074
00075 virtual int start(int n_cache_threads = 0, size_t stacksize = DEFAULT_STACKSIZE);
00076 virtual int start_internal(int flags = 0);
00077 void stop();
00078
00079 int dir_check(bool fix);
00080 int db_check(bool fix);
00081
00082 inkcoreapi Action *lookup(Continuation *cont, CacheKey *key, bool cluster_cache_local,
00083 bool local_only = false,
00084 CacheFragType frag_type = CACHE_FRAG_TYPE_NONE, char *hostname = 0, int host_len = 0);
00085 inkcoreapi Action *open_read(Continuation *cont, CacheKey *key, bool cluster_cache_local,
00086 CacheFragType frag_type = CACHE_FRAG_TYPE_NONE, char *hostname = 0, int host_len = 0);
00087 Action *open_read_buffer(Continuation *cont, MIOBuffer *buf, CacheKey *key,
00088 CacheFragType frag_type = CACHE_FRAG_TYPE_NONE, char *hostname = 0, int host_len = 0);
00089
00090 inkcoreapi Action *open_write(Continuation *cont,
00091 CacheKey *key,
00092 bool cluster_cache_local,
00093 CacheFragType frag_type = CACHE_FRAG_TYPE_NONE,
00094 int expected_size = CACHE_EXPECTED_SIZE,
00095 int options = 0,
00096 time_t pin_in_cache = (time_t) 0,
00097 char *hostname = 0, int host_len = 0);
00098 Action *open_write_buffer(Continuation *cont, MIOBuffer *buf,
00099 CacheKey *key,
00100 CacheFragType frag_type = CACHE_FRAG_TYPE_NONE,
00101 int options = 0,
00102 time_t pin_in_cache = (time_t) 0,
00103 char *hostname = 0, int host_len = 0);
00104 inkcoreapi Action *remove(Continuation *cont, CacheKey *key,
00105 bool cluster_cache_local,
00106 CacheFragType frag_type = CACHE_FRAG_TYPE_NONE,
00107 bool rm_user_agents = true, bool rm_link = false,
00108 char *hostname = 0, int host_len = 0);
00109 Action *scan(Continuation *cont, char *hostname = 0, int host_len = 0, int KB_per_second = SCAN_KB_PER_SECOND);
00110 #ifdef HTTP_CACHE
00111 Action *lookup(Continuation *cont, URL *url, bool cluster_cache_local, bool local_only = false,
00112 CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP);
00113 inkcoreapi Action *open_read(Continuation *cont, URL *url,
00114 bool cluster_cache_local,
00115 CacheHTTPHdr *request,
00116 CacheLookupHttpConfig *params,
00117 time_t pin_in_cache = (time_t) 0, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP);
00118 Action *open_read_buffer(Continuation *cont, MIOBuffer *buf, URL *url,
00119 CacheHTTPHdr *request,
00120 CacheLookupHttpConfig *params, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP);
00121 Action *open_write(Continuation *cont, int expected_size, URL *url, bool cluster_cache_local,
00122 CacheHTTPHdr *request, CacheHTTPInfo *old_info,
00123 time_t pin_in_cache = (time_t) 0, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP);
00124 Action *open_write_buffer(Continuation *cont, MIOBuffer *buf, URL *url,
00125 CacheHTTPHdr *request, CacheHTTPHdr *response,
00126 CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP);
00127 Action *remove(Continuation *cont, URL *url, bool cluster_cache_local, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP);
00128
00129 Action *open_read_internal(int, Continuation *, MIOBuffer *, CacheURL *,
00130 CacheHTTPHdr *, CacheLookupHttpConfig *,
00131 CacheKey *, time_t, CacheFragType type, char *hostname, int host_len);
00132 #endif
00133 Action *link(Continuation *cont, CacheKey *from, CacheKey *to, bool cluster_cache_local,
00134 CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP, char *hostname = 0, int host_len = 0);
00135
00136 Action *deref(Continuation *cont, CacheKey *key, bool cluster_cache_local,
00137 CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP, char *hostname = 0, int host_len = 0);
00138
00139
00140
00141
00142
00143
00144
00145
00146 bool mark_storage_offline(CacheDisk* d);
00147
00148
00149
00150
00151
00152 CacheDisk* find_by_path(char const* path, int len = 0);
00153
00154
00155
00156
00157 bool has_online_storage() const;
00158
00159 static int IsCacheEnabled();
00160
00161 static bool IsCacheReady(CacheFragType type);
00162
00163
00164 typedef void (*CALLBACK_FUNC)();
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 void set_after_init_callback(CALLBACK_FUNC cb);
00176
00177
00178 void diskInitialized();
00179
00180 void cacheInitialized();
00181
00182 static volatile uint32_t cache_ready;
00183 static volatile int initialized;
00184 static volatile int start_done;
00185 static int clear;
00186 static int fix;
00187 static int start_internal_flags;
00188 static int auto_clear_flag;
00189
00190 VersionNumber min_stripe_version;
00191 VersionNumber max_stripe_version;
00192
00193 CALLBACK_FUNC cb_after_init;
00194 };
00195
00196 inline void
00197 CacheProcessor::set_after_init_callback(CALLBACK_FUNC cb)
00198 {
00199 cb_after_init = cb;
00200 }
00201
00202 struct CacheVConnection:public VConnection
00203 {
00204 VIO *do_io_read(Continuation *c, int64_t nbytes, MIOBuffer *buf) = 0;
00205 virtual VIO *do_io_pread(Continuation *c, int64_t nbytes, MIOBuffer *buf, int64_t offset) = 0;
00206 VIO *do_io_write(Continuation *c, int64_t nbytes, IOBufferReader *buf, bool owner = false) = 0;
00207 void do_io_close(int lerrno = -1) = 0;
00208 void reenable(VIO *avio) = 0;
00209 void reenable_re(VIO *avio) = 0;
00210 void do_io_shutdown(ShutdownHowTo_t howto)
00211 {
00212 (void) howto;
00213 ink_assert(!"CacheVConnection::do_io_shutdown unsupported");
00214 }
00215
00216 virtual int get_header(void **ptr, int *len) = 0;
00217 virtual int set_header(void *ptr, int len) = 0;
00218 virtual int get_single_data(void **ptr, int *len) = 0;
00219
00220 #ifdef HTTP_CACHE
00221 virtual void set_http_info(CacheHTTPInfo *info) = 0;
00222 virtual void get_http_info(CacheHTTPInfo **info) = 0;
00223 #endif
00224
00225 virtual bool is_ram_cache_hit() const = 0;
00226 virtual bool set_disk_io_priority(int priority) = 0;
00227 virtual int get_disk_io_priority() = 0;
00228 virtual bool set_pin_in_cache(time_t t) = 0;
00229 virtual time_t get_pin_in_cache() = 0;
00230 virtual int64_t get_object_size() = 0;
00231
00232
00233
00234
00235 virtual bool is_pread_capable() = 0;
00236
00237 CacheVConnection();
00238 };
00239
00240 void ink_cache_init(ModuleVersion version);
00241 extern inkcoreapi CacheProcessor cacheProcessor;
00242 extern Continuation *cacheRegexDeleteCont;
00243
00244 #endif