author | Lars Hjemli <hjemli@gmail.com> | 2008-04-28 09:32:42 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2008-04-28 09:32:42 (UTC) |
commit | 939d32fda70ea66c9db51687beb3cea6da7b0599 (patch) (unidiff) | |
tree | 50915facf89b78e3856fe6b0564a26c3678c01ba /tests/setup.sh | |
parent | 9ec5cd7944a7099515b7d41107007d6332a2540e (diff) | |
download | cgit-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>
-rwxr-xr-x | tests/setup.sh | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/tests/setup.sh b/tests/setup.sh index 66bf406..e37306e 100755 --- a/tests/setup.sh +++ b/tests/setup.sh | |||
@@ -1,116 +1,116 @@ | |||
1 | # This file should be sourced by all test-scripts | 1 | # This file should be sourced by all test-scripts |
2 | # | 2 | # |
3 | # Main functions: | 3 | # Main functions: |
4 | # prepare_tests(description) - setup for testing, i.e. create repos+config | 4 | # prepare_tests(description) - setup for testing, i.e. create repos+config |
5 | # run_test(description, script) - run one test, i.e. eval script | 5 | # run_test(description, script) - run one test, i.e. eval script |
6 | # | 6 | # |
7 | # Helper functions | 7 | # Helper functions |
8 | # cgit_query(querystring) - call cgit with the specified querystring | 8 | # cgit_query(querystring) - call cgit with the specified querystring |
9 | # cgit_url(url) - call cgit with the specified virtual url | 9 | # cgit_url(url) - call cgit with the specified virtual url |
10 | # | 10 | # |
11 | # Example script: | 11 | # Example script: |
12 | # | 12 | # |
13 | # . setup.sh | 13 | # . setup.sh |
14 | # prepare_tests "html validation" | 14 | # prepare_tests "html validation" |
15 | # run_test 'repo index' 'cgit_url "/" | tidy -e' | 15 | # run_test 'repo index' 'cgit_url "/" | tidy -e' |
16 | # run_test 'repo summary' 'cgit_url "/foo" | tidy -e' | 16 | # run_test 'repo summary' 'cgit_url "/foo" | tidy -e' |
17 | 17 | ||
18 | 18 | ||
19 | mkrepo() { | 19 | mkrepo() { |
20 | name=$1 | 20 | name=$1 |
21 | count=$2 | 21 | count=$2 |
22 | dir=$PWD | 22 | dir=$PWD |
23 | test -d $name && return | 23 | test -d $name && return |
24 | printf "Creating testrepo %s\n" $name | 24 | printf "Creating testrepo %s\n" $name |
25 | mkdir -p $name | 25 | mkdir -p $name |
26 | cd $name | 26 | cd $name |
27 | git init | 27 | git init |
28 | for ((n=1; n<=count; n++)) | 28 | for ((n=1; n<=count; n++)) |
29 | do | 29 | do |
30 | echo $n >file-$n | 30 | echo $n >file-$n |
31 | git add file-$n | 31 | git add file-$n |
32 | git commit -m "commit $n" | 32 | git commit -m "commit $n" |
33 | done | 33 | done |
34 | cd $dir | 34 | cd $dir |
35 | } | 35 | } |
36 | 36 | ||
37 | setup_repos() | 37 | setup_repos() |
38 | { | 38 | { |
39 | rm -rf trash/cache | 39 | rm -rf trash/cache |
40 | mkdir -p trash/cache | 40 | mkdir -p trash/cache |
41 | mkrepo trash/repos/foo 5 >/dev/null | 41 | mkrepo trash/repos/foo 5 >/dev/null |
42 | mkrepo trash/repos/bar 50 >/dev/null | 42 | mkrepo trash/repos/bar 50 >/dev/null |
43 | cat >trash/cgitrc <<EOF | 43 | cat >trash/cgitrc <<EOF |
44 | virtual-root=/ | 44 | virtual-root=/ |
45 | cache-root=$PWD/trash/cache | 45 | cache-root=$PWD/trash/cache |
46 | 46 | ||
47 | nocache=0 | 47 | cache-size=1021 |
48 | snapshots=tar.gz tar.bz zip | 48 | snapshots=tar.gz tar.bz zip |
49 | enable-log-filecount=1 | 49 | enable-log-filecount=1 |
50 | enable-log-linecount=1 | 50 | enable-log-linecount=1 |
51 | summary-log=5 | 51 | summary-log=5 |
52 | summary-branches=5 | 52 | summary-branches=5 |
53 | summary-tags=5 | 53 | summary-tags=5 |
54 | 54 | ||
55 | repo.url=foo | 55 | repo.url=foo |
56 | repo.path=$PWD/trash/repos/foo/.git | 56 | repo.path=$PWD/trash/repos/foo/.git |
57 | # Do not specify a description for this repo, as it then will be assigned | 57 | # Do not specify a description for this repo, as it then will be assigned |
58 | # the constant value "[no description]" (which actually used to cause a | 58 | # the constant value "[no description]" (which actually used to cause a |
59 | # segfault). | 59 | # segfault). |
60 | 60 | ||
61 | repo.url=bar | 61 | repo.url=bar |
62 | repo.path=$PWD/trash/repos/bar/.git | 62 | repo.path=$PWD/trash/repos/bar/.git |
63 | repo.desc=the bar repo | 63 | repo.desc=the bar repo |
64 | EOF | 64 | EOF |
65 | } | 65 | } |
66 | 66 | ||
67 | prepare_tests() | 67 | prepare_tests() |
68 | { | 68 | { |
69 | setup_repos | 69 | setup_repos |
70 | rm -f test-output.log 2>/dev/null | 70 | rm -f test-output.log 2>/dev/null |
71 | test_count=0 | 71 | test_count=0 |
72 | test_failed=0 | 72 | test_failed=0 |
73 | echo "[$0]" "$@" >test-output.log | 73 | echo "[$0]" "$@" >test-output.log |
74 | echo "$@" "($0)" | 74 | echo "$@" "($0)" |
75 | } | 75 | } |
76 | 76 | ||
77 | tests_done() | 77 | tests_done() |
78 | { | 78 | { |
79 | printf "\n" | 79 | printf "\n" |
80 | if test $test_failed -gt 0 | 80 | if test $test_failed -gt 0 |
81 | then | 81 | then |
82 | printf "test: *** %s failure(s), logfile=%s\n" \ | 82 | printf "test: *** %s failure(s), logfile=%s\n" \ |
83 | $test_failed "$(pwd)/test-output.log" | 83 | $test_failed "$(pwd)/test-output.log" |
84 | false | 84 | false |
85 | fi | 85 | fi |
86 | } | 86 | } |
87 | 87 | ||
88 | run_test() | 88 | run_test() |
89 | { | 89 | { |
90 | desc=$1 | 90 | desc=$1 |
91 | script=$2 | 91 | script=$2 |
92 | ((test_count++)) | 92 | ((test_count++)) |
93 | printf "\ntest %d: name='%s'\n" $test_count "$desc" >>test-output.log | 93 | printf "\ntest %d: name='%s'\n" $test_count "$desc" >>test-output.log |
94 | printf "test %d: eval='%s'\n" $test_count "$2" >>test-output.log | 94 | printf "test %d: eval='%s'\n" $test_count "$2" >>test-output.log |
95 | eval "$2" >>test-output.log 2>>test-output.log | 95 | eval "$2" >>test-output.log 2>>test-output.log |
96 | res=$? | 96 | res=$? |
97 | printf "test %d: exitcode=%d\n" $test_count $res >>test-output.log | 97 | printf "test %d: exitcode=%d\n" $test_count $res >>test-output.log |
98 | if test $res = 0 | 98 | if test $res = 0 |
99 | then | 99 | then |
100 | printf " %2d) %-60s [ok]\n" $test_count "$desc" | 100 | printf " %2d) %-60s [ok]\n" $test_count "$desc" |
101 | else | 101 | else |
102 | ((test_failed++)) | 102 | ((test_failed++)) |
103 | printf " %2d) %-60s [failed]\n" $test_count "$desc" | 103 | printf " %2d) %-60s [failed]\n" $test_count "$desc" |
104 | fi | 104 | fi |
105 | } | 105 | } |
106 | 106 | ||
107 | cgit_query() | 107 | cgit_query() |
108 | { | 108 | { |
109 | CGIT_CONFIG="$PWD/trash/cgitrc" QUERY_STRING="$1" "$PWD/../cgit" | 109 | CGIT_CONFIG="$PWD/trash/cgitrc" QUERY_STRING="$1" "$PWD/../cgit" |
110 | } | 110 | } |
111 | 111 | ||
112 | cgit_url() | 112 | cgit_url() |
113 | { | 113 | { |
114 | CGIT_CONFIG="$PWD/trash/cgitrc" QUERY_STRING="url=$1" "$PWD/../cgit" | 114 | CGIT_CONFIG="$PWD/trash/cgitrc" QUERY_STRING="url=$1" "$PWD/../cgit" |
115 | } | 115 | } |
116 | 116 | ||