aboutsummaryrefslogtreecommitdiffstats
path: root/cache.h
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2008-04-28 11:32:42 +0200
committerLars Hjemli <hjemli@gmail.com>2008-04-28 11:32:42 +0200
commit939d32fda70ea66c9db51687beb3cea6da7b0599 (patch)
tree50915facf89b78e3856fe6b0564a26c3678c01ba /cache.h
parent9ec5cd7944a7099515b7d41107007d6332a2540e (diff)
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 'cache.h')
-rw-r--r--cache.h33
1 files changed, 21 insertions, 12 deletions
diff --git a/cache.h b/cache.h
index 4dcbea3..5f2178d 100644
--- a/cache.h
+++ b/cache.h
@@ -6,18 +6,27 @@
#ifndef CGIT_CACHE_H
#define CGIT_CACHE_H
-struct cacheitem {
- char *name;
- struct stat st;
- int ttl;
- int fd;
-};
+typedef void (*cache_fill_fn)(void *cbdata);
-extern char *cache_safe_filename(const char *unsafe);
-extern int cache_lock(struct cacheitem *item);
-extern int cache_unlock(struct cacheitem *item);
-extern int cache_cancel_lock(struct cacheitem *item);
-extern int cache_exist(struct cacheitem *item);
-extern int cache_expired(struct cacheitem *item);
+
+/* Print cached content to stdout, generate the content if necessary.
+ *
+ * Parameters
+ * size max number of cache files
+ * path directory used to store cache files
+ * key the key used to lookup cache files
+ * ttl max cache time in seconds for this key
+ * fn content generator function for this key
+ * cbdata user-supplied data to the content generator function
+ *
+ * Return value
+ * 0 indicates success, everyting else is an error
+ */
+extern int cache_process(int size, const char *path, const char *key, int ttl,
+ cache_fill_fn fn, void *cbdata);
+
+
+/* Print a message to stdout */
+extern void cache_log(const char *format, ...);
#endif /* CGIT_CACHE_H */