all repos — cgit @ df63119302910587e280d91dce67f6537a671f74

a hyperfast web frontend for git written in c

README (view raw)

 1Cache algorithm
 2===============
 3
 4Cgit normally returns cached pages when invoked. If there is no cache file, or
 5the cache file has expired, it is regenerated. Finally, the cache file is 
 6printed on stdout.
 7
 8When it is decided that a cache file needs to be regenerated, an attempt is 
 9made to create a corresponding lockfile. If this fails, the process gives up
10and uses the expired cache file instead.
11
12When there is no cache file for a request, an attempt is made to create a 
13corresponding lockfile. If this fails, the process calls sched_yield(2) before
14restarting the request handling.
15
16In pseudocode:
17
18	name = generate_cache_name(request);
19top:
20	if (!exists(name)) {
21		if (lock_cache(name)) {
22			generate_cache(request, name);
23			unlock_cache(name);
24		} else {
25			sched_yield();
26			goto top;
27		}
28	} else if (expired(name)) {
29		if (lock_cache(name)) {
30			generate_cache(request, name);
31			unlock_cache(name);
32		}
33	}
34	print_file(name);
35
36
37The following options can be set in /etc/cgitrc to control cache behaviour:
38  cache-root:        root directory for cache files
39  cache-root-ttl:    TTL for the repo listing page
40  cache-repo-ttl:    TTL for any repos summary page
41  cache-dynamic-ttl: TTL for pages with symbolic references (not SHA1)
42  cache-static-ttl:  TTL for pages with sha1 references
43
44TTL is specified in minutes, -1 meaning "infinite caching". 
45
46
47Naming of cache files
48---------------------
49Repository listing:  <cachedir>/index.html
50Repository summary:  <cachedir>/<repo>/index.html
51Repository subpage:  <cachedir>/<repo>/<page>/<querystring>.html
52
53The corresponding lock files have a ".lock" suffix.
54