Browse Source

Plan 9 from Bell Labs 2007-07-07

David du Colombier 17 years ago
parent
commit
50f327ab9a

+ 6 - 6
dist/replica/_plan9.db

@@ -12823,17 +12823,17 @@ sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1183184540 11853
 sys/src/cmd/ndb/cs.c - 664 sys sys 1182275681 33213
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
 sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183406703 22445
-sys/src/cmd/ndb/dn.c - 664 sys sys 1183614213 35390
+sys/src/cmd/ndb/dn.c - 664 sys sys 1183743268 35708
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
-sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1178508075 3140
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183614243 32682
-sys/src/cmd/ndb/dns.c - 664 sys sys 1183614217 16261
-sys/src/cmd/ndb/dns.h - 664 sys sys 1183448016 11240
+sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1183750450 3195
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183756960 33524
+sys/src/cmd/ndb/dns.c - 664 sys sys 1183750507 16257
+sys/src/cmd/ndb/dns.h - 664 sys sys 1183748115 11440
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1183184428 8754
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1183447961 4402
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435
 sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1183184439 7440
-sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183406741 5366
+sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183750487 5470
 sys/src/cmd/ndb/ipquery.c - 664 sys sys 1124711423 773
 sys/src/cmd/ndb/mkdb.c - 664 sys sys 957402054 2886
 sys/src/cmd/ndb/mkfile - 664 sys sys 1174623575 1984

+ 6 - 6
dist/replica/plan9.db

@@ -12823,17 +12823,17 @@ sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1183184540 11853
 sys/src/cmd/ndb/cs.c - 664 sys sys 1182275681 33213
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
 sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183406703 22445
-sys/src/cmd/ndb/dn.c - 664 sys sys 1183614213 35390
+sys/src/cmd/ndb/dn.c - 664 sys sys 1183743268 35708
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
-sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1178508075 3140
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183614243 32682
-sys/src/cmd/ndb/dns.c - 664 sys sys 1183614217 16261
-sys/src/cmd/ndb/dns.h - 664 sys sys 1183448016 11240
+sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1183750450 3195
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183756960 33524
+sys/src/cmd/ndb/dns.c - 664 sys sys 1183750507 16257
+sys/src/cmd/ndb/dns.h - 664 sys sys 1183748115 11440
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1183184428 8754
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1183447961 4402
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435
 sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1183184439 7440
-sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183406741 5366
+sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183750487 5470
 sys/src/cmd/ndb/ipquery.c - 664 sys sys 1124711423 773
 sys/src/cmd/ndb/mkdb.c - 664 sys sys 957402054 2886
 sys/src/cmd/ndb/mkfile - 664 sys sys 1174623575 1984

+ 12 - 0
dist/replica/plan9.log

@@ -49461,3 +49461,15 @@
 1183662057 0 c 386/lib/ape/libap.a - 664 sys sys 1183661796 792640
 1183662057 1 c sys/man/2/mp - 664 sys sys 1183661200 10770
 1183663859 0 c sys/src/ape/lib/ap/mkfile - 664 sys sys 1183662148 307
+1183703403 0 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183702443 32850
+1183703403 1 c sys/src/cmd/ndb/dns.h - 664 sys sys 1183701878 11330
+1183744804 0 c sys/src/cmd/ndb/dn.c - 664 sys sys 1183743268 35708
+1183744804 1 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183743296 33188
+1183744804 2 c sys/src/cmd/ndb/dns.c - 664 sys sys 1183743268 16238
+1183744804 3 c sys/src/cmd/ndb/dns.h - 664 sys sys 1183743303 11406
+1183748404 0 c sys/src/cmd/ndb/dns.h - 664 sys sys 1183748115 11440
+1183752004 0 c sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1183750450 3195
+1183752004 1 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183750507 33209
+1183752004 2 c sys/src/cmd/ndb/dns.c - 664 sys sys 1183750507 16257
+1183752004 3 c sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183750487 5470
+1183757405 0 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183756960 33524

+ 19 - 11
sys/src/cmd/ndb/dn.c

@@ -6,7 +6,8 @@
 #include "dns.h"
 
 enum {
-	Minage = 10*60,
+	Minage		= 10*60,
+	Defagefreq	= 30*60,	/* age names this often (seconds) */
 };
 
 /*
@@ -125,6 +126,8 @@ char *opname[] =
 
 Lock	dnlock;
 
+static ulong agefreq = Defagefreq;
+
 static int sencodefmt(Fmt*);
 
 void
@@ -212,18 +215,20 @@ dndump(char *file)
 		return;
 
 	qlock(&stats);
-	fprint(fd, "# slave procs high-water mark\t%ld\n", stats.slavehiwat);
-	fprint(fd, "# queries received by 9p\t%ld\n", stats.qrecvd9p);
-	fprint(fd, "# queries received by udp\t%ld\n", stats.qrecvdudp);
-	fprint(fd, "# queries answered from memory\t%ld\n", stats.answinmem);
-	fprint(fd, "# queries sent by udp\t%ld\n", stats.qsent);
+	fprint(fd, "# slave procs high-water mark\t%lud\n", stats.slavehiwat);
+	fprint(fd, "# queries received by 9p\t%lud\n", stats.qrecvd9p);
+	fprint(fd, "# queries received by udp\t%lud\n", stats.qrecvdudp);
+	fprint(fd, "# queries answered from memory\t%lud\n", stats.answinmem);
+	fprint(fd, "# queries sent by udp\t%lud\n", stats.qsent);
 	for (i = 0; i < nelem(stats.under10ths); i++)
 		if (stats.under10ths[i] || i == nelem(stats.under10ths) - 1)
-			fprint(fd, "# responses arriving within %.1f s.\t%ld\n",
+			fprint(fd, "# responses arriving within %.1f s.\t%lud\n",
 				(double)(i+1)/10, stats.under10ths[i]);
-	fprint(fd, "\n# queries sent & timed-out\t%ld\n", stats.tmout);
-	fprint(fd, "# cname queries timed-out\t%ld\n", stats.tmoutcname);
-	fprint(fd, "# ipv6  queries timed-out\t%ld\n", stats.tmoutv6);
+	fprint(fd, "\n# queries sent & timed-out\t%lud\n", stats.tmout);
+	fprint(fd, "# cname queries timed-out\t%lud\n", stats.tmoutcname);
+	fprint(fd, "# ipv6  queries timed-out\t%lud\n", stats.tmoutv6);
+	fprint(fd, "\n# negative answers received\t%lud\n", stats.negans);
+	fprint(fd, "# negative answers cached\t%lud\n", stats.negcached);
 	qunlock(&stats);
 
 	lock(&dnlock);
@@ -419,7 +424,10 @@ dnageall(int doit)
 		if (dnvars.oldest < Minage)
 			dnvars.oldest = Minage;		/* don't be silly */
 	}
-	nextage = now + maxage;
+	if (agefreq > dnvars.oldest / 2)
+		nextage = now + dnvars.oldest / 2;
+	else
+		nextage = now + agefreq;
 
 	lock(&dnlock);
 

+ 9 - 7
sys/src/cmd/ndb/dnnotify.c

@@ -29,14 +29,15 @@ dnnotify(DNSmsg *reqp, DNSmsg *repp, Request *)
 	if(repp->qd->type != Tsoa)
 		return;
 
-dnslog("notification for %s", repp->qd->owner->name);
+	dnslog("notification for %s", repp->qd->owner->name);
 
 	/* is it something we care about? */
 	a = inmyarea(repp->qd->owner->name);
 	if(a == nil)
 		return;
 
-dnslog("serial old %lud new %lud", a->soarr->soa->serial, repp->qd->soa->serial);
+	dnslog("serial old %lud new %lud", a->soarr->soa->serial,
+		repp->qd->soa->serial);
 
 	/* do nothing if it didn't change */
 	if(a->soarr->soa->serial != repp->qd->soa->serial)
@@ -86,9 +87,10 @@ send_notify(char *slave, RR *soa, Request *req)
 
 	/* send 3 times or until we get anything back */
 	n += Udphdrsize;
-	for(i = 0; i < 3; i++){
+	for(i = 0; i < 3; i++, freeanswers(&repmsg)){
 		dnslog("sending %d byte notify to %s/%I.%d about %s", n, slave,
 			up->raddr, nhgets(up->rport), soa->owner->name);
+		memset(&repmsg, 0, sizeof repmsg);
 		if(write(fd, obuf, n) != n)
 			break;
 		alarm(2*1000);
@@ -96,7 +98,6 @@ send_notify(char *slave, RR *soa, Request *req)
 		alarm(0);
 		if(len <= Udphdrsize)
 			continue;
-		memset(&repmsg, 0, sizeof repmsg);
 		err = convM2DNS(&ibuf[Udphdrsize], len, &repmsg, nil);
 		if(err != nil) {
 			free(err);
@@ -105,6 +106,7 @@ send_notify(char *slave, RR *soa, Request *req)
 		if(repmsg.id == reqno && (repmsg.flags & Omask) == Onotify)
 			break;
 	}
+	freeanswers(&repmsg);
 	close(fd);
 }
 
@@ -133,10 +135,10 @@ void
 notifyproc(void)
 {
 	Request req;
-	static int already;
+//	static int already;
 
-	if(already)
-		return;
+//	if(already)
+//		return;
 
 	switch(rfork(RFPROC|RFNOTEG|RFMEM|RFNOWAIT)){
 	case -1:

+ 54 - 9
sys/src/cmd/ndb/dnresolve.c

@@ -53,7 +53,7 @@ struct Query {
 	Dest	*curdest;	/* pointer to one of them */
 	int	ndest;
 
-	int	udpfd;		/* can be shared by all udp users */
+	int	udpfd;
 
 	QLock	tcplock;	/* only one tcp call at a time per query */
 	int	tcpset;
@@ -290,9 +290,10 @@ static RR*
 dnresolve1(char *name, int class, int type, Request *req, int depth,
 	int recurse)
 {
+	char *cp;
+	Area *area;
 	DN *dp, *nsdp;
 	RR *rp, *nsrp, *dbnsrp;
-	char *cp;
 	Query query;
 
 	if(debug)
@@ -338,6 +339,19 @@ dnresolve1(char *name, int class, int type, Request *req, int depth,
 			return nil;
 	}
 
+	/*
+	 * if the domain name is within an area of ours,
+	 * we should have found its data in memory by now.
+	 */
+	area = inmyarea(dp->name);
+	if (area) {
+//		char buf[32];
+
+//		dnslog("%s %s: no data in area %s", dp->name,
+//			rrname(type, buf, sizeof buf), area->soarr->owner->name);
+		return nil;
+	}
+
 	queryinit(&query, dp, type, req);
 
 	/*
@@ -806,6 +820,8 @@ cacheneg(DN *dp, int type, int rcode, RR *soarr)
 	DN *soaowner;
 	ulong ttl;
 
+	stats.negcached++;
+
 	/* no cache time specified, don't make anything up */
 	if(soarr != nil){
 		if(soarr->next != nil){
@@ -1005,6 +1021,29 @@ xmitquery(Query *qp, int medium, int depth, uchar *obuf, int inns, int len)
 	return 0;
 }
 
+static int lckindex[Maxlcks] = {
+	0,			/* all others map here */
+	Ta,
+	Tns,
+	Tcname,
+	Tsoa,
+	Tptr,
+	Tmx,
+	Ttxt,
+	Taaaa,
+};
+
+static int
+qtype2lck(int qtype)		/* map query type to querylck index */
+{
+	int i;
+
+	for (i = 1; i < nelem(lckindex); i++)
+		if (lckindex[i] == qtype)
+			return i;
+	return 0;
+}
+
 static int
 procansw(Query *qp, DNSmsg *mp, uchar *srcip, int depth, Dest *p)
 {
@@ -1014,6 +1053,9 @@ procansw(Query *qp, DNSmsg *mp, uchar *srcip, int depth, Dest *p)
 	Query nquery;
 	RR *tp, *soarr;
 
+	if (mp->an == nil)
+		stats.negans++;
+
 	/* ignore any error replies */
 	if((mp->flags & Rmask) == Rserver){
 		freeanswers(mp);
@@ -1104,13 +1146,13 @@ procansw(Query *qp, DNSmsg *mp, uchar *srcip, int depth, Dest *p)
 	}
 	procsetname("recursive query for %s %s", qp->dp->name,
 		rrname(qp->type, buf, sizeof buf));
-	qunlock(&qp->dp->querylck);
+	qunlock(&qp->dp->querylck[qtype2lck(qp->type)]);
 
 	queryinit(&nquery, qp->dp, qp->type, qp->req);
 	nquery.nsrp = tp;
 	rv = netquery(&nquery, depth+1);
 
-	qlock(&qp->dp->querylck);
+	qlock(&qp->dp->querylck[qtype2lck(qp->type)]);
 	rrfreelist(tp);
 	querydestroy(&nquery);
 	return rv;
@@ -1196,9 +1238,9 @@ netquery1(Query *qp, int depth, uchar *ibuf, uchar *obuf, int waitsecs, int inns
 		for(replywaits = 0; replywaits < ndest; replywaits++){
 			DNSmsg m;
 
-			procsetname("reading %sside reply from %I for %s %s",
+			procsetname("reading %sside reply from %I: %s %s from %s",
 				(inns? "in": "out"), obuf, qp->dp->name,
-				rrname(qp->type, buf, sizeof buf));
+				rrname(qp->type, buf, sizeof buf), qp->req->from);
 
 			/* read udp answer into m */
 			if (readreply(qp, Udp, req, ibuf, &m, endtime) >= 0)
@@ -1362,6 +1404,7 @@ static int
 netquery(Query *qp, int depth)
 {
 	int lock, rv, triedin, inname;
+	char buf[32];
 	RR *rp;
 
 	if(depth > 12)			/* in a recursive loop? */
@@ -1378,7 +1421,8 @@ netquery(Query *qp, int depth)
 	if(1)
 		lock = qp->req->isslave != 0;
 	if(1 && lock) {
-		procsetname("query lock wait for %s", qp->dp->name);
+		procsetname("query lock wait: %s %s from %s", qp->dp->name,
+			rrname(qp->type, buf, sizeof buf), qp->req->from);
 		/*
 		 * don't make concurrent queries for this name.
 		 * dozens of processes blocking here probably indicates
@@ -1386,7 +1430,7 @@ netquery(Query *qp, int depth)
 		 * recognise a zone (area) as one of our own, thus
 		 * causing us to query other nameservers.
 		 */
-		qlock(&qp->dp->querylck);
+		qlock(&qp->dp->querylck[qtype2lck(qp->type)]);
 	}
 	procsetname("netquery: %s", qp->dp->name);
 
@@ -1429,7 +1473,7 @@ netquery(Query *qp, int depth)
 //		askoutdns(qp->dp, qp->type);
 
 	if(1 && lock)
-		qunlock(&qp->dp->querylck);
+		qunlock(&qp->dp->querylck[qtype2lck(qp->type)]);
 	return rv;
 }
 
@@ -1444,6 +1488,7 @@ seerootns(void)
 	memset(&req, 0, sizeof req);
 	req.isslave = 1;
 	req.aborttime = now + Maxreqtm;
+	req.from = "internal";
 	queryinit(&query, dnlookup(root, Cin, 1), Tns, &req);
 	query.nsrp = dblookup(root, Cin, Tns, 0, 0);
 	rv = netquery(&query, 0);

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

@@ -15,8 +15,7 @@ enum
 	Maxrrr=			32,		/* was 16 */
 	Maxfdata=		8192,
 
-	/* default seconds between passes to age domain names */
-	Defmaxage=		30*60,
+	Defmaxage=		60*60,	/* default domain name max. age */
 
 	Qdir=			0,
 	Qdns=			1,
@@ -411,6 +410,7 @@ io(void)
 
 		getactivity(&req, 0);
 		req.aborttime = now + Maxreqtm;
+		req.from = "9p";
 
 		switch(job->request.type){
 		default:

+ 7 - 2
sys/src/cmd/ndb/dns.h

@@ -137,6 +137,7 @@ enum
 	HTLEN= 		4*1024,
 
 	Maxpath=	128,	/* size of mntpt */
+	Maxlcks=	10,	/* max. query-type locks per domain name */
 
 	RRmagic=	0xdeadbabe,
 	DNmagic=	0xa110a110,
@@ -172,6 +173,7 @@ struct Request
 	ulong	aborttime;	/* time at which we give up */
 	jmp_buf	mret;		/* where master jumps to after starting a slave */
 	int	id;
+	char	*from;		/* who asked us? */
 };
 
 /*
@@ -192,7 +194,8 @@ struct DN
 	uchar	keep;		/* flag: never age this name */
 	uchar	respcode;	/* response code */
 /* was:	char	nonexistent; /* true if we get an authoritative nx for this domain */
-	QLock	querylck;	/* permit only 1 query per domain name at a time */
+	/* permit only 1 query per (domain name, type) at a time */
+	QLock	querylck[Maxlcks];
 };
 
 /*
@@ -382,7 +385,9 @@ typedef struct {
 	ulong	tmoutcname;
 	ulong	tmoutv6;
 
-	ulong	answinmem;	/* count: answer in memory */
+	ulong	answinmem;	/* answers in memory */
+	ulong	negans;		/* negative answers received */
+	ulong	negcached;	/* negative answers cached */
 } Stats;
 
 Stats stats;

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

@@ -125,6 +125,8 @@ restart:
 		//	((Udphdr*)buf)->raddr, ((Udphdr*)buf)->laddr);
 		getactivity(&req, 0);
 		req.aborttime = now + Maxreqtm;
+//		req.from = smprint("%I", ((Udphdr*)buf)->raddr);
+		req.from = smprint("%I", buf);
 		rcode = 0;
 		stats.qrecvdudp++;
 
@@ -192,6 +194,7 @@ restart:
 
 		p->inuse = 0;
 freereq:
+		free(req.from);
 		freeanswers(&reqmsg);
 		if(req.isslave){
 			putactivity(0);