13 int mainstacksize = 256*1024;
16 static void ventiserver(void*);
21 fprint(2, "usage: venti [-dsw] [-a ventiaddress] [-h httpaddress] [-c config] [-C cachesize] [-I icachesize] [-B blockcachesize]\n");
22 threadexitsall("usage");
25 threadmain(int argc, char *argv[])
27 char *configfile, *haddr, *vaddr, *webroot;
28 u32int mem, icmem, bcmem, minbcmem;
32 threadsetname("main");
42 vaddr = EARGF(usage());
45 bcmem = unittoull(EARGF(usage()));
48 configfile = EARGF(usage());
51 mem = unittoull(EARGF(usage()));
54 settrace(EARGF(usage()));
61 haddr = EARGF(usage());
64 icmem = unittoull(EARGF(usage()));
73 webroot = EARGF(usage());
87 /* sigh - needed to avoid signals when writing to hungup networks */
89 memset(&sa, 0, sizeof sa);
90 sa.sa_handler = SIG_IGN;
91 sigaction(SIGPIPE, &sa, nil);
95 trace(TraceQuiet, "venti started");
100 configfile = "venti.conf";
102 if(initarenasum() < 0)
103 fprint(2, "warning: can't initialize arena summing process: %r");
105 fprint(2, "conf...");
106 if(initventi(configfile, &config) < 0)
107 sysfatal("can't init server: %r");
112 bcmem = config.bcmem;
114 icmem = config.icmem;
116 haddr = config.haddr;
118 vaddr = config.vaddr;
120 vaddr = "tcp!*!venti";
122 webroot = config.webroot;
124 queuewrites = config.queuewrites;
127 fprint(2, "httpd %s...", haddr);
128 if(httpdinit(haddr, webroot) < 0)
129 fprint(2, "warning: can't start http server: %r");
132 fprint(2, "init...");
134 if(mem == 0xffffffffUL)
135 mem = 1 * 1024 * 1024;
136 if(0) fprint(2, "initialize %d bytes of lump cache for %d lumps\n",
137 mem, mem / (8 * 1024));
138 initlumpcache(mem, mem / (8 * 1024));
140 icmem = u64log2(icmem / (sizeof(IEntry)+sizeof(IEntry*)) / ICacheDepth);
143 if(0) fprint(2, "initialize %d bytes of index cache for %d index entries\n",
144 (sizeof(IEntry)+sizeof(IEntry*)) * (1 << icmem) * ICacheDepth,
145 (1 << icmem) * ICacheDepth);
146 initicache(icmem, ICacheDepth);
150 * need a block for every arena and every process
152 minbcmem = maxblocksize *
153 (mainindex->narenas + mainindex->nsects*4 + 16);
157 if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
161 startbloomproc(mainindex->bloom);
163 fprint(2, "sync...");
164 if(syncindex(mainindex, 1, 0, 0) < 0)
165 sysfatal("can't sync server: %r");
168 fprint(2, "queue...");
169 if(initlumpqueues(mainindex->nsects) < 0){
170 fprint(2, "can't initialize lump queues,"
171 " disabling write queueing: %r");
176 fprint(2, "announce %s...", vaddr);
177 ventisrv = vtlisten(vaddr);
179 sysfatal("can't announce %s: %r", vaddr);
181 fprint(2, "serving.\n");
185 vtproc(ventiserver, nil);
189 vtrerror(VtReq *r, char *error)
191 r->rx.msgtype = VtRerror;
192 r->rx.error = estrdup(error);
205 threadsetname("ventiserver");
206 trace(TraceWork, "start");
207 while((r = vtgetreq(ventisrv)) != nil){
208 trace(TraceWork, "finish");
209 trace(TraceWork, "start request %F", &r->tx);
210 trace(TraceRpc, "<- %F", &r->tx);
211 r->rx.msgtype = r->tx.msgtype+1;
212 addstat(StatRpcTotal, 1);
213 // print("req (arenas[0]=%p sects[0]=%p) %F\n",
214 // mainindex->arenas[0], mainindex->sects[0], &r->tx);
215 switch(r->tx.msgtype){
217 vtrerror(r, "unknown request");
221 r->rx.data = readlump(r->tx.score, r->tx.blocktype, r->tx.count, &cached);
223 addstat2(StatRpcRead, 1, StatRpcReadTime, ms);
224 if(r->rx.data == nil){
225 addstat(StatRpcReadFail, 1);
226 rerrstr(err, sizeof err);
229 addstat(StatRpcReadBytes, packetsize(r->rx.data));
230 addstat(StatRpcReadOk, 1);
232 addstat2(StatRpcReadCached, 1, StatRpcReadCachedTime, ms);
234 addstat2(StatRpcReadUncached, 1, StatRpcReadUncachedTime, ms);
240 addstat(StatRpcWriteBytes, packetsize(p));
242 ok = writelump(p, r->rx.score, r->tx.blocktype, 0, ms);
244 addstat2(StatRpcWrite, 1, StatRpcWriteTime, ms);
247 addstat(StatRpcWriteFail, 1);
248 rerrstr(err, sizeof err);
257 trace(TraceRpc, "-> %F", &r->rx);
259 trace(TraceWork, "start");