summaryrefslogtreecommitdiffabout
path: root/cgit.h
authorLars Hjemli <hjemli@gmail.com>2008-04-28 09:32:42 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-04-28 09:32:42 (UTC)
commit939d32fda70ea66c9db51687beb3cea6da7b0599 (patch) (unidiff)
tree50915facf89b78e3856fe6b0564a26c3678c01ba /cgit.h
parent9ec5cd7944a7099515b7d41107007d6332a2540e (diff)
downloadcgit-939d32fda70ea66c9db51687beb3cea6da7b0599.zip
cgit-939d32fda70ea66c9db51687beb3cea6da7b0599.tar.gz
cgit-939d32fda70ea66c9db51687beb3cea6da7b0599.tar.bz2
Redesign the caching layer
The original caching layer in cgit has no upper bound on the number of concurrent cache entries, so when cgit is traversed by a spider (like the googlebot), the cache might end up filling your disk. Also, if any error occurs in the cache layer, no content is returned to the client. This patch redesigns the caching layer to avoid these flaws by * giving the cache a bound number of slots * disabling the cache for the current request when errors occur The cache size limit is implemented by hashing the querystring (the cache lookup key) and generating a cache filename based on this hash modulo the cache size. In order to detect hash collisions, the full lookup key (i.e. the querystring) is stored in the cache file (separated from its associated content by ascii 0). The cache filename is the reversed 8-digit hexadecimal representation of hash(key) % cache_size which should make the filesystem lookup pretty fast (if directory content is indexed/sorted); reversing the representation avoids the problem where all keys have equal prefix. There is a new config option, cache-size, which sets the upper bound for the cache. Default value for this option is 0, which has the same effect as setting nocache=1 (hence nocache is now deprecated). Included in this patch is also a new testfile which verifies that the new option works as intended. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'cgit.h') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/cgit.h b/cgit.h
index a3b6535..f04d227 100644
--- a/cgit.h
+++ b/cgit.h
@@ -73,128 +73,129 @@ struct commitinfo {
73 char *author; 73 char *author;
74 char *author_email; 74 char *author_email;
75 unsigned long author_date; 75 unsigned long author_date;
76 char *committer; 76 char *committer;
77 char *committer_email; 77 char *committer_email;
78 unsigned long committer_date; 78 unsigned long committer_date;
79 char *subject; 79 char *subject;
80 char *msg; 80 char *msg;
81 char *msg_encoding; 81 char *msg_encoding;
82}; 82};
83 83
84struct taginfo { 84struct taginfo {
85 char *tagger; 85 char *tagger;
86 char *tagger_email; 86 char *tagger_email;
87 int tagger_date; 87 int tagger_date;
88 char *msg; 88 char *msg;
89}; 89};
90 90
91struct refinfo { 91struct refinfo {
92 const char *refname; 92 const char *refname;
93 struct object *object; 93 struct object *object;
94 union { 94 union {
95 struct taginfo *tag; 95 struct taginfo *tag;
96 struct commitinfo *commit; 96 struct commitinfo *commit;
97 }; 97 };
98}; 98};
99 99
100struct reflist { 100struct reflist {
101 struct refinfo **refs; 101 struct refinfo **refs;
102 int alloc; 102 int alloc;
103 int count; 103 int count;
104}; 104};
105 105
106struct cgit_query { 106struct cgit_query {
107 int has_symref; 107 int has_symref;
108 int has_sha1; 108 int has_sha1;
109 char *raw; 109 char *raw;
110 char *repo; 110 char *repo;
111 char *page; 111 char *page;
112 char *search; 112 char *search;
113 char *grep; 113 char *grep;
114 char *head; 114 char *head;
115 char *sha1; 115 char *sha1;
116 char *sha2; 116 char *sha2;
117 char *path; 117 char *path;
118 char *name; 118 char *name;
119 int ofs; 119 int ofs;
120}; 120};
121 121
122struct cgit_config { 122struct cgit_config {
123 char *agefile; 123 char *agefile;
124 char *cache_root; 124 char *cache_root;
125 char *clone_prefix; 125 char *clone_prefix;
126 char *css; 126 char *css;
127 char *index_header; 127 char *index_header;
128 char *index_info; 128 char *index_info;
129 char *logo; 129 char *logo;
130 char *logo_link; 130 char *logo_link;
131 char *module_link; 131 char *module_link;
132 char *repo_group; 132 char *repo_group;
133 char *robots; 133 char *robots;
134 char *root_title; 134 char *root_title;
135 char *script_name; 135 char *script_name;
136 char *virtual_root; 136 char *virtual_root;
137 int cache_size;
137 int cache_dynamic_ttl; 138 int cache_dynamic_ttl;
138 int cache_max_create_time; 139 int cache_max_create_time;
139 int cache_repo_ttl; 140 int cache_repo_ttl;
140 int cache_root_ttl; 141 int cache_root_ttl;
141 int cache_static_ttl; 142 int cache_static_ttl;
142 int enable_index_links; 143 int enable_index_links;
143 int enable_log_filecount; 144 int enable_log_filecount;
144 int enable_log_linecount; 145 int enable_log_linecount;
145 int max_commit_count; 146 int max_commit_count;
146 int max_lock_attempts; 147 int max_lock_attempts;
147 int max_msg_len; 148 int max_msg_len;
148 int max_repodesc_len; 149 int max_repodesc_len;
149 int nocache; 150 int nocache;
150 int renamelimit; 151 int renamelimit;
151 int snapshots; 152 int snapshots;
152 int summary_branches; 153 int summary_branches;
153 int summary_log; 154 int summary_log;
154 int summary_tags; 155 int summary_tags;
155}; 156};
156 157
157struct cgit_page { 158struct cgit_page {
158 time_t modified; 159 time_t modified;
159 time_t expires; 160 time_t expires;
160 char *mimetype; 161 char *mimetype;
161 char *charset; 162 char *charset;
162 char *filename; 163 char *filename;
163 char *title; 164 char *title;
164}; 165};
165 166
166struct cgit_context { 167struct cgit_context {
167 struct cgit_query qry; 168 struct cgit_query qry;
168 struct cgit_config cfg; 169 struct cgit_config cfg;
169 struct cgit_repo *repo; 170 struct cgit_repo *repo;
170 struct cgit_page page; 171 struct cgit_page page;
171}; 172};
172 173
173struct cgit_snapshot_format { 174struct cgit_snapshot_format {
174 const char *suffix; 175 const char *suffix;
175 const char *mimetype; 176 const char *mimetype;
176 write_archive_fn_t write_func; 177 write_archive_fn_t write_func;
177 int bit; 178 int bit;
178}; 179};
179 180
180extern const char *cgit_version; 181extern const char *cgit_version;
181 182
182extern struct cgit_repolist cgit_repolist; 183extern struct cgit_repolist cgit_repolist;
183extern struct cgit_context ctx; 184extern struct cgit_context ctx;
184extern const struct cgit_snapshot_format cgit_snapshot_formats[]; 185extern const struct cgit_snapshot_format cgit_snapshot_formats[];
185 186
186extern struct cgit_repo *cgit_add_repo(const char *url); 187extern struct cgit_repo *cgit_add_repo(const char *url);
187extern struct cgit_repo *cgit_get_repoinfo(const char *url); 188extern struct cgit_repo *cgit_get_repoinfo(const char *url);
188extern void cgit_repo_config_cb(const char *name, const char *value); 189extern void cgit_repo_config_cb(const char *name, const char *value);
189 190
190extern int chk_zero(int result, char *msg); 191extern int chk_zero(int result, char *msg);
191extern int chk_positive(int result, char *msg); 192extern int chk_positive(int result, char *msg);
192extern int chk_non_negative(int result, char *msg); 193extern int chk_non_negative(int result, char *msg);
193 194
194extern char *trim_end(const char *str, char c); 195extern char *trim_end(const char *str, char c);
195extern char *strlpart(char *txt, int maxlen); 196extern char *strlpart(char *txt, int maxlen);
196extern char *strrpart(char *txt, int maxlen); 197extern char *strrpart(char *txt, int maxlen);
197 198
198extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); 199extern void cgit_add_ref(struct reflist *list, struct refinfo *ref);
199extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, 200extern int cgit_refs_cb(const char *refname, const unsigned char *sha1,
200 int flags, void *cb_data); 201 int flags, void *cb_data);