Blob


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