Blame


1 7a4ee46d 2003-11-23 devnull #include "stdinc.h"
2 7a4ee46d 2003-11-23 devnull #include "dat.h"
3 7a4ee46d 2003-11-23 devnull #include "fns.h"
4 7a4ee46d 2003-11-23 devnull
5 7a4ee46d 2003-11-23 devnull #include "whack.h"
6 7a4ee46d 2003-11-23 devnull
7 7a4ee46d 2003-11-23 devnull int debug;
8 7a4ee46d 2003-11-23 devnull int mainstacksize = 256*1024;
9 7a4ee46d 2003-11-23 devnull
10 7a4ee46d 2003-11-23 devnull static void ventiserver(char *vaddr);
11 7a4ee46d 2003-11-23 devnull
12 7a4ee46d 2003-11-23 devnull void
13 7a4ee46d 2003-11-23 devnull threadmain(int argc, char *argv[])
14 7a4ee46d 2003-11-23 devnull {
15 7a4ee46d 2003-11-23 devnull char *config, *haddr, *vaddr;
16 7a4ee46d 2003-11-23 devnull u32int mem, icmem, bcmem, minbcmem;
17 7a4ee46d 2003-11-23 devnull
18 7a4ee46d 2003-11-23 devnull vaddr = "tcp!*!venti";
19 7a4ee46d 2003-11-23 devnull haddr = nil;
20 7a4ee46d 2003-11-23 devnull config = nil;
21 7a4ee46d 2003-11-23 devnull mem = 0xffffffffUL;
22 7a4ee46d 2003-11-23 devnull icmem = 0;
23 7a4ee46d 2003-11-23 devnull bcmem = 0;
24 7a4ee46d 2003-11-23 devnull ARGBEGIN{
25 7a4ee46d 2003-11-23 devnull case 'a':
26 7a4ee46d 2003-11-23 devnull vaddr = ARGF();
27 7a4ee46d 2003-11-23 devnull if(vaddr == nil)
28 7a4ee46d 2003-11-23 devnull goto usage;
29 7a4ee46d 2003-11-23 devnull break;
30 7a4ee46d 2003-11-23 devnull case 'B':
31 7a4ee46d 2003-11-23 devnull bcmem = unittoull(ARGF());
32 7a4ee46d 2003-11-23 devnull break;
33 7a4ee46d 2003-11-23 devnull case 'c':
34 7a4ee46d 2003-11-23 devnull config = ARGF();
35 7a4ee46d 2003-11-23 devnull if(config == nil)
36 7a4ee46d 2003-11-23 devnull goto usage;
37 7a4ee46d 2003-11-23 devnull break;
38 7a4ee46d 2003-11-23 devnull case 'C':
39 7a4ee46d 2003-11-23 devnull mem = unittoull(ARGF());
40 7a4ee46d 2003-11-23 devnull break;
41 7a4ee46d 2003-11-23 devnull case 'd':
42 7a4ee46d 2003-11-23 devnull debug = 1;
43 7a4ee46d 2003-11-23 devnull break;
44 7a4ee46d 2003-11-23 devnull case 'h':
45 7a4ee46d 2003-11-23 devnull haddr = ARGF();
46 7a4ee46d 2003-11-23 devnull if(haddr == nil)
47 7a4ee46d 2003-11-23 devnull goto usage;
48 7a4ee46d 2003-11-23 devnull break;
49 7a4ee46d 2003-11-23 devnull case 'I':
50 7a4ee46d 2003-11-23 devnull icmem = unittoull(ARGF());
51 7a4ee46d 2003-11-23 devnull break;
52 7a4ee46d 2003-11-23 devnull case 'w':
53 7a4ee46d 2003-11-23 devnull queuewrites = 1;
54 7a4ee46d 2003-11-23 devnull break;
55 7a4ee46d 2003-11-23 devnull default:
56 7a4ee46d 2003-11-23 devnull goto usage;
57 7a4ee46d 2003-11-23 devnull }ARGEND
58 7a4ee46d 2003-11-23 devnull
59 7a4ee46d 2003-11-23 devnull print("whack %d\n", sizeof(Whack));
60 7a4ee46d 2003-11-23 devnull
61 7a4ee46d 2003-11-23 devnull if(argc){
62 7a4ee46d 2003-11-23 devnull usage:
63 7a4ee46d 2003-11-23 devnull fprint(2, "usage: venti [-dw] [-a ventiaddress] [-h httpaddress] [-c config] [-C cachesize] [-I icachesize] [-B blockcachesize]\n");
64 7a4ee46d 2003-11-23 devnull threadexitsall("usage");
65 7a4ee46d 2003-11-23 devnull }
66 7a4ee46d 2003-11-23 devnull
67 7a4ee46d 2003-11-23 devnull fmtinstall('V', vtscorefmt);
68 7a4ee46d 2003-11-23 devnull fmtinstall('H', encodefmt);
69 7a4ee46d 2003-11-23 devnull fmtinstall('F', vtfcallfmt);
70 7a4ee46d 2003-11-23 devnull
71 7a4ee46d 2003-11-23 devnull if(config == nil)
72 7a4ee46d 2003-11-23 devnull config = "venti.conf";
73 7a4ee46d 2003-11-23 devnull
74 7a4ee46d 2003-11-23 devnull
75 7a4ee46d 2003-11-23 devnull if(initarenasum() < 0)
76 7a4ee46d 2003-11-23 devnull fprint(2, "warning: can't initialize arena summing process: %r");
77 7a4ee46d 2003-11-23 devnull
78 7a4ee46d 2003-11-23 devnull if(initventi(config) < 0)
79 7a4ee46d 2003-11-23 devnull sysfatal("can't init server: %r");
80 7a4ee46d 2003-11-23 devnull
81 7a4ee46d 2003-11-23 devnull if(mem == 0xffffffffUL)
82 7a4ee46d 2003-11-23 devnull mem = 1 * 1024 * 1024;
83 7a4ee46d 2003-11-23 devnull fprint(2, "initialize %d bytes of lump cache for %d lumps\n",
84 7a4ee46d 2003-11-23 devnull mem, mem / (8 * 1024));
85 7a4ee46d 2003-11-23 devnull initlumpcache(mem, mem / (8 * 1024));
86 7a4ee46d 2003-11-23 devnull
87 7a4ee46d 2003-11-23 devnull icmem = u64log2(icmem / (sizeof(IEntry)+sizeof(IEntry*)) / ICacheDepth);
88 7a4ee46d 2003-11-23 devnull if(icmem < 4)
89 7a4ee46d 2003-11-23 devnull icmem = 4;
90 7a4ee46d 2003-11-23 devnull fprint(2, "initialize %d bytes of index cache for %d index entries\n",
91 7a4ee46d 2003-11-23 devnull (sizeof(IEntry)+sizeof(IEntry*)) * (1 << icmem) * ICacheDepth,
92 7a4ee46d 2003-11-23 devnull (1 << icmem) * ICacheDepth);
93 7a4ee46d 2003-11-23 devnull initicache(icmem, ICacheDepth);
94 7a4ee46d 2003-11-23 devnull
95 7a4ee46d 2003-11-23 devnull /*
96 7a4ee46d 2003-11-23 devnull * need a block for every arena and every process
97 7a4ee46d 2003-11-23 devnull */
98 7a4ee46d 2003-11-23 devnull minbcmem = maxblocksize *
99 7a4ee46d 2003-11-23 devnull (mainindex->narenas + mainindex->nsects*4 + 16);
100 7a4ee46d 2003-11-23 devnull if(bcmem < minbcmem)
101 7a4ee46d 2003-11-23 devnull bcmem = minbcmem;
102 7a4ee46d 2003-11-23 devnull
103 7a4ee46d 2003-11-23 devnull fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
104 7a4ee46d 2003-11-23 devnull initdcache(bcmem);
105 7a4ee46d 2003-11-23 devnull
106 7a4ee46d 2003-11-23 devnull fprint(2, "sync arenas and index...\n");
107 7a4ee46d 2003-11-23 devnull if(syncindex(mainindex, 1) < 0)
108 7a4ee46d 2003-11-23 devnull sysfatal("can't sync server: %r");
109 7a4ee46d 2003-11-23 devnull
110 7a4ee46d 2003-11-23 devnull if(queuewrites){
111 7a4ee46d 2003-11-23 devnull fprint(2, "initialize write queue...\n");
112 7a4ee46d 2003-11-23 devnull if(initlumpqueues(mainindex->nsects) < 0){
113 7a4ee46d 2003-11-23 devnull fprint(2, "can't initialize lump queues,"
114 7a4ee46d 2003-11-23 devnull " disabling write queueing: %r");
115 7a4ee46d 2003-11-23 devnull queuewrites = 0;
116 7a4ee46d 2003-11-23 devnull }
117 7a4ee46d 2003-11-23 devnull }
118 7a4ee46d 2003-11-23 devnull
119 7a4ee46d 2003-11-23 devnull if(haddr){
120 7a4ee46d 2003-11-23 devnull fprint(2, "starting http server at %s\n", haddr);
121 7a4ee46d 2003-11-23 devnull if(httpdinit(haddr) < 0)
122 7a4ee46d 2003-11-23 devnull fprint(2, "warning: can't start http server: %r");
123 7a4ee46d 2003-11-23 devnull }
124 7a4ee46d 2003-11-23 devnull
125 7a4ee46d 2003-11-23 devnull ventiserver(vaddr);
126 7a4ee46d 2003-11-23 devnull threadexitsall(0);
127 7a4ee46d 2003-11-23 devnull }
128 7a4ee46d 2003-11-23 devnull
129 7a4ee46d 2003-11-23 devnull static void
130 7a4ee46d 2003-11-23 devnull vtrerror(VtReq *r, char *error)
131 7a4ee46d 2003-11-23 devnull {
132 7a4ee46d 2003-11-23 devnull r->rx.type = VtRerror;
133 7a4ee46d 2003-11-23 devnull r->rx.error = estrdup(error);
134 7a4ee46d 2003-11-23 devnull }
135 7a4ee46d 2003-11-23 devnull
136 7a4ee46d 2003-11-23 devnull static void
137 7a4ee46d 2003-11-23 devnull ventiserver(char *addr)
138 7a4ee46d 2003-11-23 devnull {
139 7a4ee46d 2003-11-23 devnull Packet *p;
140 7a4ee46d 2003-11-23 devnull VtReq *r;
141 7a4ee46d 2003-11-23 devnull VtSrv *s;
142 24998851 2004-03-11 devnull char err[ERRMAX];
143 7a4ee46d 2003-11-23 devnull
144 7a4ee46d 2003-11-23 devnull s = vtlisten(addr);
145 7a4ee46d 2003-11-23 devnull if(s == nil)
146 7a4ee46d 2003-11-23 devnull sysfatal("can't announce %s: %r", addr);
147 7a4ee46d 2003-11-23 devnull
148 7a4ee46d 2003-11-23 devnull while((r = vtgetreq(s)) != nil){
149 7a4ee46d 2003-11-23 devnull r->rx.type = r->tx.type+1;
150 9ffbb5ad 2004-03-12 devnull // print("req (arenas[0]=%p sects[0]=%p) %F\n",
151 9ffbb5ad 2004-03-12 devnull // mainindex->arenas[0], mainindex->sects[0], &r->tx);
152 7a4ee46d 2003-11-23 devnull switch(r->tx.type){
153 7a4ee46d 2003-11-23 devnull default:
154 7a4ee46d 2003-11-23 devnull vtrerror(r, "unknown request");
155 7a4ee46d 2003-11-23 devnull break;
156 7a4ee46d 2003-11-23 devnull case VtTread:
157 24998851 2004-03-11 devnull if((r->rx.data = readlump(r->tx.score, r->tx.dtype, r->tx.count)) == nil){
158 24998851 2004-03-11 devnull rerrstr(err, sizeof err);
159 24998851 2004-03-11 devnull vtrerror(r, err);
160 24998851 2004-03-11 devnull }
161 7a4ee46d 2003-11-23 devnull break;
162 7a4ee46d 2003-11-23 devnull case VtTwrite:
163 7a4ee46d 2003-11-23 devnull p = r->tx.data;
164 7a4ee46d 2003-11-23 devnull r->tx.data = nil;
165 24998851 2004-03-11 devnull if(writelump(p, r->rx.score, r->tx.dtype, 0) < 0){
166 24998851 2004-03-11 devnull rerrstr(err, sizeof err);
167 24998851 2004-03-11 devnull vtrerror(r, err);
168 24998851 2004-03-11 devnull }
169 7a4ee46d 2003-11-23 devnull break;
170 7a4ee46d 2003-11-23 devnull case VtTsync:
171 24998851 2004-03-11 devnull flushqueue();
172 24998851 2004-03-11 devnull flushdcache();
173 7a4ee46d 2003-11-23 devnull break;
174 7a4ee46d 2003-11-23 devnull }
175 7a4ee46d 2003-11-23 devnull vtrespond(r);
176 7a4ee46d 2003-11-23 devnull }
177 7a4ee46d 2003-11-23 devnull }
178 7a4ee46d 2003-11-23 devnull