Selaa lähdekoodia

Plan 9 from Bell Labs 2011-04-07

David du Colombier 13 vuotta sitten
vanhempi
commit
923c38d44a

+ 0 - 3
sys/src/cmd/ndb/dblookup.c

@@ -100,9 +100,6 @@ dblookup(char *name, int class, int type, int auth, int ttl)
 	char buf[256];
 	RR *rp, *tp;
 	DN *dp, *ndp;
-	static int parallel;
-	static int parfd[2];
-	static char token[1];
 
 	/* so far only internet lookups are implemented */
 	if(class != Cin)

+ 24 - 9
sys/src/cmd/ndb/dn.c

@@ -342,13 +342,20 @@ dnpurge(void)
 }
 
 /*
- *  delete rp from *l, free rp.
+ *  delete head of *l and free the old head.
  *  call with dnlock held.
  */
 static void
-rrdelete(RR **l, RR *rp)
+rrdelhead(RR **l)
 {
-	*l = rp->next;
+	RR *rp;
+
+	if (canlock(&dnlock))
+		abort();	/* rrdelhead called with dnlock not held */
+	rp = *l;
+	if(rp == nil)
+		return;
+	*l = rp->next;		/* unlink head */
 	rp->cached = 0;		/* avoid blowing an assertion in rrfree */
 	rrfree(rp);
 }
@@ -364,6 +371,8 @@ dnage(DN *dp)
 	RR *rp, *next;
 	ulong diff;
 
+	if (canlock(&dnlock))
+		abort();	/* dnage called with dnlock not held */
 	diff = now - dp->referenced;
 	if(diff < Reserved || dp->keep)
 		return;
@@ -373,7 +382,7 @@ dnage(DN *dp)
 		assert(rp->magic == RRmagic && rp->cached);
 		next = rp->next;
 		if(!rp->db && (rp->expire < now || diff > dnvars.oldest))
-			rrdelete(l, rp);
+			rrdelhead(l); /* rp == *l before; *l == rp->next after */
 		else
 			l = &rp->next;
 	}
@@ -786,8 +795,9 @@ rrattach1(RR *new, int auth)
 		if(rp->db == new->db && rp->auth == new->auth){
 			/* negative drives out positive and vice versa */
 			if(rp->negative != new->negative) {
-				rrdelete(l, rp);
-				continue;		/* *l == rp->next */
+				/* rp == *l before; *l == rp->next after */
+				rrdelhead(l);
+				continue;	
 			}
 			/* all things equal, pick the newer one */
 			else if(rp->arg0 == new->arg0 && rp->arg1 == new->arg1){
@@ -797,8 +807,9 @@ rrattach1(RR *new, int auth)
 					rrfree(new);
 					return;
 				}
-				rrdelete(l, rp);
-				continue;		/* *l == rp->next */
+				/* rp == *l before; *l == rp->next after */
+				rrdelhead(l);
+				continue;
 			}
 			/*
 			 *  Hack for pointer records.  This makes sure
@@ -850,7 +861,7 @@ rrattach(RR *rp, int auth)
 		if(cfg.cachedb && !rp->db && inmyarea(rp->owner->name))
 			rrfree(rp);
 		else {
-			/* ameliorate the memory leak */
+			/* ameliorate the memory leak (someday delete this) */
 			if (0 && rrlistlen(dp->rr) > 50 && !dp->keep) {
 				dnslog("rrattach(%s): rr list too long; "
 					"freeing it", dp->name);
@@ -876,6 +887,8 @@ rrcopy(RR *rp, RR **last)
 	Sig *sig;
 	Txt *t, *nt, **l;
 
+	if (canlock(&dnlock))
+		abort();	/* rrcopy called with dnlock not held */
 	nrp = rralloc(rp->type);
 	setmalloctag(nrp, getcallerpc(&rp));
 	switch(rp->type){
@@ -1087,6 +1100,8 @@ rrcat(RR **start, RR *rp)
 	RR *olp, *nlp;
 	RR **last;
 
+	if (canlock(&dnlock))
+		abort();	/* rrcat called with dnlock not held */
 	/* check for duplicates */
 	for (olp = *start; 0 && olp; olp = olp->next)
 		for (nlp = rp; nlp; nlp = nlp->next)

+ 1 - 1
sys/src/cmd/ndb/dns.c

@@ -218,7 +218,7 @@ main(int argc, char *argv[])
 
 	srand(now*getpid());
 	db2cache(1);
-//	dnageallnever();
+//	dnageallnever();		/* someday try this again */
 
 	if (cfg.straddle && !seerootns())
 		dnslog("straddle server misconfigured; can't see root name servers");

+ 2 - 0
sys/src/cmd/ndb/dnsdebug.c

@@ -343,7 +343,9 @@ preloadserveraddrs(void)
 
 	l = &first;
 	for(rp = serveraddrs; rp != nil; rp = rp->next){
+		lock(&dnlock);
 		rrcopy(rp, l);
+		unlock(&dnlock);
 		rrattach(first, Authoritative);
 	}
 }

+ 2 - 1
sys/src/cmd/ndb/dnserver.c

@@ -216,8 +216,9 @@ hint(RR **last, RR *rp)
 			hp = dblookup(rp->host->name, Cin, Taaaa, 0, 0);
 		if (hp && strncmp(hp->owner->name, "local#", 6) == 0)
 			dnslog("returning %s as hint", hp->owner->name);
+		lock(&dnlock);
 		rrcat(last, hp);
+		unlock(&dnlock);
 		break;
 	}
 }
- 

+ 10 - 1
sys/src/libc/9sys/dial.c

@@ -18,7 +18,7 @@ enum
 	 * this should be a plausible slight overestimate for non-interactive
 	 * use even if it's ridiculously long for interactive use.
 	 */
-	Maxconnms	= 20*60*1000,	/* 20 minutes */
+	Maxconnms	= 2*60*1000,	/* 2 minutes */
 };
 
 struct DS {
@@ -275,6 +275,12 @@ pickuperr(char *besterr, char *err)
 		strcpy(besterr, err);
 }
 
+static void
+catcher(void*, char *)
+{
+	noted(NDFLT);
+}
+
 /*
  * try all addresses in parallel and take the first one that answers;
  * this helps when systems have ip v4 and v6 addresses but are
@@ -296,9 +302,12 @@ dialmulti(DS *ds, Dest *dp)
 		if (kid < 0)
 			--dp->nkid;
 		else if (kid == 0) {
+			/* die on alarm, avoid atnotify callbacks */
+			notify(catcher);
 			/* don't override outstanding alarm */
 			oalarm = alarm(0);
 			alarm(oalarm > 0? oalarm: Maxconnms);
+
 			*besterr = '\0';
 			rv = call(clone, dest, ds, dp, &dp->conn[kidme]);
 			if(rv < 0)