summaryrefslogtreecommitdiffabout
path: root/tests
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 /tests
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 'tests') (more/less context) (ignore whitespace changes)
-rwxr-xr-xtests/setup.sh2
-rwxr-xr-xtests/t0020-validate-cache.sh67
2 files changed, 68 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
19mkrepo() { 19mkrepo() {
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
37setup_repos() 37setup_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
44virtual-root=/ 44virtual-root=/
45cache-root=$PWD/trash/cache 45cache-root=$PWD/trash/cache
46 46
47nocache=0 47cache-size=1021
48snapshots=tar.gz tar.bz zip 48snapshots=tar.gz tar.bz zip
49enable-log-filecount=1 49enable-log-filecount=1
50enable-log-linecount=1 50enable-log-linecount=1
51summary-log=5 51summary-log=5
52summary-branches=5 52summary-branches=5
53summary-tags=5 53summary-tags=5
54 54
55repo.url=foo 55repo.url=foo
56repo.path=$PWD/trash/repos/foo/.git 56repo.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
61repo.url=bar 61repo.url=bar
62repo.path=$PWD/trash/repos/bar/.git 62repo.path=$PWD/trash/repos/bar/.git
63repo.desc=the bar repo 63repo.desc=the bar repo
64EOF 64EOF
65} 65}
66 66
67prepare_tests() 67prepare_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
77tests_done() 77tests_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
88run_test() 88run_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
107cgit_query() 107cgit_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
112cgit_url() 112cgit_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
diff --git a/tests/t0020-validate-cache.sh b/tests/t0020-validate-cache.sh
new file mode 100755
index 0000000..53ec2eb
--- a/dev/null
+++ b/tests/t0020-validate-cache.sh
@@ -0,0 +1,67 @@
1#!/bin/sh
2
3. ./setup.sh
4
5prepare_tests 'Validate cache'
6
7run_test 'verify cache-size=0' '
8
9 rm -f trash/cache/* &&
10 sed -i -e "s/cache-size=1021$/cache-size=0/" trash/cgitrc &&
11 cgit_url "" &&
12 cgit_url "foo" &&
13 cgit_url "foo/refs" &&
14 cgit_url "foo/tree" &&
15 cgit_url "foo/log" &&
16 cgit_url "foo/diff" &&
17 cgit_url "foo/patch" &&
18 cgit_url "bar" &&
19 cgit_url "bar/refs" &&
20 cgit_url "bar/tree" &&
21 cgit_url "bar/log" &&
22 cgit_url "bar/diff" &&
23 cgit_url "bar/patch" &&
24 test 0 -eq $(ls trash/cache | wc -l)
25'
26
27run_test 'verify cache-size=1' '
28
29 rm -f trash/cache/* &&
30 sed -i -e "s/cache-size=0$/cache-size=1/" trash/cgitrc &&
31 cgit_url "" &&
32 cgit_url "foo" &&
33 cgit_url "foo/refs" &&
34 cgit_url "foo/tree" &&
35 cgit_url "foo/log" &&
36 cgit_url "foo/diff" &&
37 cgit_url "foo/patch" &&
38 cgit_url "bar" &&
39 cgit_url "bar/refs" &&
40 cgit_url "bar/tree" &&
41 cgit_url "bar/log" &&
42 cgit_url "bar/diff" &&
43 cgit_url "bar/patch" &&
44 test 1 -eq $(ls trash/cache | wc -l)
45'
46
47run_test 'verify cache-size=1021' '
48
49 rm -f trash/cache/* &&
50 sed -i -e "s/cache-size=1$/cache-size=1021/" trash/cgitrc &&
51 cgit_url "" &&
52 cgit_url "foo" &&
53 cgit_url "foo/refs" &&
54 cgit_url "foo/tree" &&
55 cgit_url "foo/log" &&
56 cgit_url "foo/diff" &&
57 cgit_url "foo/patch" &&
58 cgit_url "bar" &&
59 cgit_url "bar/refs" &&
60 cgit_url "bar/tree" &&
61 cgit_url "bar/log" &&
62 cgit_url "bar/diff" &&
63 cgit_url "bar/patch" &&
64 test 13 -eq $(ls trash/cache | wc -l)
65'
66
67tests_done