diff options
Diffstat (limited to 'src/cmd/venti/venti.c')
-rw-r--r-- | src/cmd/venti/venti.c | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/cmd/venti/venti.c b/src/cmd/venti/venti.c new file mode 100644 index 00000000..6423f7fa --- /dev/null +++ b/src/cmd/venti/venti.c @@ -0,0 +1,172 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +#include "whack.h" + +int debug; +int mainstacksize = 256*1024; + +static void ventiserver(char *vaddr); + +void +threadmain(int argc, char *argv[]) +{ + char *config, *haddr, *vaddr; + u32int mem, icmem, bcmem, minbcmem; + + vaddr = "tcp!*!venti"; + haddr = nil; + config = nil; + mem = 0xffffffffUL; + icmem = 0; + bcmem = 0; + ARGBEGIN{ + case 'a': + vaddr = ARGF(); + if(vaddr == nil) + goto usage; + break; + case 'B': + bcmem = unittoull(ARGF()); + break; + case 'c': + config = ARGF(); + if(config == nil) + goto usage; + break; + case 'C': + mem = unittoull(ARGF()); + break; + case 'd': + debug = 1; + break; + case 'h': + haddr = ARGF(); + if(haddr == nil) + goto usage; + break; + case 'I': + icmem = unittoull(ARGF()); + break; + case 'w': + queuewrites = 1; + break; + default: + goto usage; + }ARGEND + +print("whack %d\n", sizeof(Whack)); + + if(argc){ + usage: + fprint(2, "usage: venti [-dw] [-a ventiaddress] [-h httpaddress] [-c config] [-C cachesize] [-I icachesize] [-B blockcachesize]\n"); + threadexitsall("usage"); + } + + fmtinstall('V', vtscorefmt); + fmtinstall('H', encodefmt); + fmtinstall('F', vtfcallfmt); + + if(config == nil) + config = "venti.conf"; + + + if(initarenasum() < 0) + fprint(2, "warning: can't initialize arena summing process: %r"); + + if(initventi(config) < 0) + sysfatal("can't init server: %r"); + + if(mem == 0xffffffffUL) + mem = 1 * 1024 * 1024; + fprint(2, "initialize %d bytes of lump cache for %d lumps\n", + mem, mem / (8 * 1024)); + initlumpcache(mem, mem / (8 * 1024)); + + icmem = u64log2(icmem / (sizeof(IEntry)+sizeof(IEntry*)) / ICacheDepth); + if(icmem < 4) + icmem = 4; + fprint(2, "initialize %d bytes of index cache for %d index entries\n", + (sizeof(IEntry)+sizeof(IEntry*)) * (1 << icmem) * ICacheDepth, + (1 << icmem) * ICacheDepth); + initicache(icmem, ICacheDepth); + + /* + * need a block for every arena and every process + */ + minbcmem = maxblocksize * + (mainindex->narenas + mainindex->nsects*4 + 16); + if(bcmem < minbcmem) + bcmem = minbcmem; + + fprint(2, "initialize %d bytes of disk block cache\n", bcmem); + initdcache(bcmem); + + fprint(2, "sync arenas and index...\n"); + if(syncindex(mainindex, 1) < 0) + sysfatal("can't sync server: %r"); + + if(queuewrites){ + fprint(2, "initialize write queue...\n"); + if(initlumpqueues(mainindex->nsects) < 0){ + fprint(2, "can't initialize lump queues," + " disabling write queueing: %r"); + queuewrites = 0; + } + } + + if(haddr){ + fprint(2, "starting http server at %s\n", haddr); + if(httpdinit(haddr) < 0) + fprint(2, "warning: can't start http server: %r"); + } + + ventiserver(vaddr); + threadexitsall(0); +} + +static void +vtrerror(VtReq *r, char *error) +{ + r->rx.type = VtRerror; + r->rx.error = estrdup(error); +} + +static void +ventiserver(char *addr) +{ + Packet *p; + VtReq *r; + VtSrv *s; + + s = vtlisten(addr); + if(s == nil) + sysfatal("can't announce %s: %r", addr); + + while((r = vtgetreq(s)) != nil){ + r->rx.type = r->tx.type+1; + print("req (arenas[0]=%p sects[0]=%p) %F\n", + mainindex->arenas[0], mainindex->sects[0], &r->tx); + switch(r->tx.type){ + default: + vtrerror(r, "unknown request"); + break; + case VtTread: + if((r->rx.data = readlump(r->tx.score, r->tx.dtype, r->tx.count)) == nil) + vtrerror(r, gerrstr()); + break; + case VtTwrite: + p = r->tx.data; + r->tx.data = nil; + if(writelump(p, r->rx.score, r->tx.dtype, 0) < 0) + vtrerror(r, gerrstr()); + break; + case VtTsync: + queueflush(); + break; + } + vtrespond(r); + } +} + |