summaryrefslogtreecommitdiff
path: root/sys/src/cmd/upas/fs/cache.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-10-03 15:49:53 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-10-03 15:49:53 +0200
commitff16079e49ae585281e4ff0f2aed9620a7273644 (patch)
tree8c7884940c1a60c40c6c329c0e27e8ceb2f03aef /sys/src/cmd/upas/fs/cache.c
parentc0f464b98fde437a1c6556006e87662827d77096 (diff)
upas/fs: speedup mtree and henter()
move digest pointer into Mtree structrue and embed it into Idx struct (which is embedded in Message) to avoid one level of indirection during mtreecmp(). get rid of mtreeisdup(). instead we have mtreeadd() return the old message in case of a collision. this avoids double lookup. increase the hash table size for henter() and make it a prime.
Diffstat (limited to 'sys/src/cmd/upas/fs/cache.c')
-rw-r--r--sys/src/cmd/upas/fs/cache.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/src/cmd/upas/fs/cache.c b/sys/src/cmd/upas/fs/cache.c
index 5312886b3..52ed93c79 100644
--- a/sys/src/cmd/upas/fs/cache.c
+++ b/sys/src/cmd/upas/fs/cache.c
@@ -319,14 +319,17 @@ found:
void
digestmessage(Mailbox *mb, Message *m)
{
+ Message *old;
+
assert(m->digest == nil);
m->digest = emalloc(SHA1dlen);
sha1((uchar*)m->start, m->end - m->start, m->digest, nil);
- if(mtreeisdup(mb, m)){
+ old = mtreeadd(mb, m);
+ if(old != nil && old != m){
+ m = mtreeadd(mb, old);
logmsg(m, "dup detected");
m->deleted = Dup; /* no dups allowed */
- }else
- mtreeadd(mb, m);
+ }
dprint("%lud %#A\n", m->id, m->digest);
}