about summary refs log tree commit diff
path: root/README
blob: 5917c37ce30b3f0a374c9fa376955f51f1d7bfbf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Cache algorithm
===============

Cgit normally returns cached pages when invoked. If there is no cache file, or
the cache file has expired, it is regenerated. Finally, the cache file is 
printed on stdout.

When it is decided that a cache file needs to be regenerated, an attempt is 
made to create a corresponding lockfile. If this fails, the process gives up
and uses the expired cache file instead.

When there is no cache file for a request, an attempt is made to create a 
corresponding lockfile. If this fails, the process calls sched_yield(2) before
restarting the request handling.

In pseudocode:

	name = generate_cache_name(request);
top:
	if (!exists(name)) {
		if (lock_cache(name)) {
			generate_cache(request, name);
			unlock_cache(name);
		} else {
			sched_yield();
			goto top;
		}
	} else if (expired(name)) {
		if (lock_cache(name)) {
			generate_cache(request, name);
			unlock_cache(name);
		}
	}
	print_file(name);


The following options can be set in /etc/cgitrc to control cache behaviour:
  cache-root:        root directory for cache files
  cache-root-ttl:    TTL for the repo listing page
  cache-repo-ttl:    TTL for any repos summary page
  cache-dynamic-ttl: TTL for pages with symbolic references (not SHA1)
  cache-static-ttl:  TTL for pages with sha1 references

TTL is specified in minutes, -1 meaning "infinite caching". 


Naming of cache files
---------------------
Repository listing:  <cachedir>/index.html
Repository summary:  <cachedir>/<repo>/index.html
Repository subpage:  <cachedir>/<repo>/<page>/<querystring>.html

The corresponding lock files have a ".lock" suffix.

McEnroe 2020-01-28Call fopencookie with a+June McEnroe Otherwise interleaved reads and writes can interfere with each other, since you're supposed to have intervening fseeks. 2019-12-24Exit git-fetch-email on getopt failure 1.0June McEnroe 2019-12-23Export References headerJune McEnroe 2019-12-23Add (GNU/)Linux compatibilityJune McEnroe Implements a dumb version of readpassphrase that calls getpass and implements funopen in terms of fopencookie. 2019-12-23Handle folded From headersJune McEnroe 2019-12-23Restrict search to plain-text messagesJune McEnroe 2019-12-23Properly support using drill rather than digJune McEnroe Silly drill doesn't have +short, so emulate it by waiting for the ANSWER SECTION and skipping the leading fields. 2019-12-22Document dig requirement in imbox(1)June McEnroe 2019-12-22Add CAVEAT about expecting plain-textJune McEnroe 2019-12-22Quote user, pass and mailboxJune McEnroe 2019-12-22Use sequence numbers rather than UIDsJune McEnroe We aren't doing any expunging or anything across different sessions, so it's safe to just use sequence numbers. 2019-12-22Use EXAMINE rather than SELECTJune McEnroe This is a read-only operation. 2019-12-22Export To and CC headersJune McEnroe 2019-12-22Add missing includeJune McEnroe 2019-12-22Export In-Reply-To headersJune McEnroe 2019-12-21Add git-fetch-email to READMEJune McEnroe 2019-12-21Clarify purpose in READMEJune McEnroe 2019-12-21Add READMEJune McEnroe 2019-12-21Add copyright header to git-fetch-emailJune McEnroe 2019-12-21Add git-fetch-email to SEE ALSO of imboxJune McEnroe 2019-12-21Add git-fetch-email wrapperJune McEnroe 2019-12-21Determine host by SRV lookupJune McEnroe 2019-12-21Clean up remaining codeJune McEnroe 2019-12-21Clean up mboxrd codeJune McEnroe 2019-12-21Convert CRLF to LFJune McEnroe 2019-12-21Implement -CFSTJune McEnroe 2019-12-21Rewrite aspirational manualJune McEnroe 2019-12-21Null-terminate read literalsJune McEnroe