From: Vlad S. <ser...@us...> - 2005-06-23 02:06:11
|
Update of /cvsroot/naviserver/modules/nsdns In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11949 Modified Files: ChangeLog dns.c dns.h nsdns.c Log Message: Index: nsdns.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/nsdns.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** nsdns.c 21 Jun 2005 20:18:51 -0000 1.13 --- nsdns.c 23 Jun 2005 02:06:02 -0000 1.14 *************** *** 32,35 **** --- 32,37 ---- Tcl_HashTable list; struct _dnsClient *link; + unsigned long rcount; + unsigned short rstats[256]; } dnsClient; *************** *** 241,250 **** enum commands { cmdAdd, cmdDel, cmdFlush, cmdList, cmdResolve, cmdQueue, cmdLookup, cmdStat, cmdFind, ! cmdClientAdd, cmdClientDel, cmdClientList, cmdClientLink, cmdClientFind }; static const char *sCmd[] = { "add", "del", "flush", "list", "resolve", "queue", "lookup", "stat", "find", ! "clientadd", "clientdel", "clientlist", "clientlink", "clientfind", 0 }; int i,cmd; --- 243,252 ---- enum commands { cmdAdd, cmdDel, cmdFlush, cmdList, cmdResolve, cmdQueue, cmdLookup, cmdStat, cmdFind, ! cmdClientAdd, cmdClientDel, cmdClientList, cmdClientLink, cmdClientFind, cmdClientStats }; static const char *sCmd[] = { "add", "del", "flush", "list", "resolve", "queue", "lookup", "stat", "find", ! "clientadd", "clientdel", "clientlist", "clientlink", "clientfind", "clientstats", 0 }; int i,cmd; *************** *** 352,356 **** } Ns_RWLockWrLock(&client->lock); ! if((hrec = Tcl_FindHashEntry(&client->list,Tcl_GetString(objv[argp])))) { int type = dnsType(Tcl_GetString(objv[argp+1])); dnsRecord *list = drec = Tcl_GetHashValue(hrec); --- 354,358 ---- } Ns_RWLockWrLock(&client->lock); ! if((hrec = Tcl_FindHashEntry(&client->list,Tcl_GetStringFromObj(objv[argp],&i)))) { int type = dnsType(Tcl_GetString(objv[argp+1])); dnsRecord *list = drec = Tcl_GetHashValue(hrec); *************** *** 367,370 **** --- 369,375 ---- drec = drec->next; } + // Update rstats + if(i < sizeof(client->rstats)) client->rstats[i]--; + client->rcount--; } Ns_RWLockUnlock(&client->lock); *************** *** 394,397 **** --- 399,422 ---- break; + case cmdClientStats: { + char *ptr,*stats; + Ns_RWLockWrLock(&dnsClientLock); + hrec = Tcl_FirstHashEntry(&dnsClientList,&search); + while(hrec) { + client = Tcl_GetHashValue(hrec); + stats = Tcl_HashStats(&client->list); + addr.s_addr = (unsigned long)Tcl_GetHashKey(&dnsClientList, hrec); + Tcl_AppendElement(interp, ns_inet_ntoa(addr)); + sprintf(tmp, "%lu", client->rcount); + Tcl_AppendElement(interp, tmp); + for(ptr = stats;*ptr;ptr++) if(*ptr == '\n') *ptr = ','; + Tcl_AppendElement(interp, stats); + hrec = Tcl_NextHashEntry(&search); + Tcl_Free(stats); + } + Ns_RWLockUnlock(&dnsClientLock); + break; + } + case cmdClientList: Ns_RWLockWrLock(&dnsClientLock); *************** *** 434,437 **** --- 459,464 ---- hrec = Tcl_NextHashEntry(&search); } + client->rcount = 0; + memset(client->rstats,0,sizeof(client->rstats)); Ns_RWLockUnlock(&client->lock); break; *************** *** 562,567 **** dnsQueue *queue; dnsRequest *req; - unsigned long rt,wt; struct timeval end_time; queue = (dnsQueue*)arg; --- 589,594 ---- dnsQueue *queue; dnsRequest *req; struct timeval end_time; + unsigned long rt,wt; queue = (dnsQueue*)arg; *************** *** 585,588 **** --- 612,616 ---- queue->size--; Ns_MutexUnlock(&queue->lock); + rt = wt = 0; gettimeofday(&req->start_time,0); req->sock = dnsUdpSock; *************** *** 601,611 **** dnsPacketFree(req->req,3); dnsPacketFree(req->reply,4); break; } } - // Update statistics, in milliseconds - gettimeofday(&end_time,0); - rt = (end_time.tv_sec - req->start_time.tv_sec)*1000 + (end_time.tv_usec - req->start_time.tv_usec)/1000; - wt = (req->start_time.tv_sec - req->recv_time.tv_sec)*1000 + (req->start_time.tv_usec - req->recv_time.tv_usec)/1000; Ns_MutexLock(&queue->lock); // Put request structure back if not handled by proxy --- 629,639 ---- dnsPacketFree(req->req,3); dnsPacketFree(req->reply,4); + // Update statistics, in milliseconds + gettimeofday(&end_time,0); + rt = (end_time.tv_sec - req->start_time.tv_sec)*1000 + (end_time.tv_usec - req->start_time.tv_usec)/1000; + wt = (req->start_time.tv_sec - req->recv_time.tv_sec)*1000 + (req->start_time.tv_usec - req->recv_time.tv_usec)/1000; break; } } Ns_MutexLock(&queue->lock); // Put request structure back if not handled by proxy *************** *** 836,841 **** dnsRequestHandle(dnsRequest *req) { ! char *dot,domain[255]; ! Tcl_HashEntry *hrec; dnsRecord *qrec,*qcache,*qstart,*qend; unsigned long now = time(0); --- 864,870 ---- dnsRequestHandle(dnsRequest *req) { ! char *ptr; ! int nsize; ! Tcl_HashEntry *hrec = 0; dnsRecord *qrec,*qcache,*qstart,*qend; unsigned long now = time(0); *************** *** 848,858 **** for(qrec = req->req->qdlist;qrec;qrec = qrec->next) { if(!qrec->name) continue; ! if(!(hrec = Tcl_FindHashEntry(&req->client->list,qrec->name))) { ! snprintf(domain,sizeof(domain)-1,"*.%s",qrec->name); ! if(!(hrec = Tcl_FindHashEntry(&req->client->list,domain))) { ! if(!(dot = strchr(qrec->name,'.'))) continue; ! snprintf(domain,sizeof(domain)-1,"*%s",dot); ! if(!(hrec = Tcl_FindHashEntry(&req->client->list,domain))) continue; ! } } if(!(qcache = Tcl_GetHashValue(hrec))) continue; --- 877,907 ---- for(qrec = req->req->qdlist;qrec;qrec = qrec->next) { if(!qrec->name) continue; ! switch(qrec->type) { ! case DNS_TYPE_NAPTR: ! // Calc how many dots we have in the name ! ptr = qrec->name; ! nsize = qrec->nsize; ! while(*ptr) { ! // Search only those names that we have in cache ! if(nsize > sizeof(req->client->rstats) || req->client->rstats[nsize]) { ! if((hrec = Tcl_FindHashEntry(&req->client->list,ptr))) break; ! } ! for(;*ptr && *ptr != '.';ptr++,nsize--); ! if(*ptr == '.') ptr++,nsize--; ! } ! if(!hrec) continue; ! break; ! ! default: ! // Exact and wildcard search ! if(!(hrec = Tcl_FindHashEntry(&req->client->list,qrec->name))) { ! char domain[255]; ! snprintf(domain,sizeof(domain)-1,"*.%s",qrec->name); ! if(!(hrec = Tcl_FindHashEntry(&req->client->list,domain))) { ! if(!(ptr = strchr(qrec->name,'.'))) continue; ! snprintf(domain,sizeof(domain)-1,"*%s",ptr); ! if(!(hrec = Tcl_FindHashEntry(&req->client->list,domain))) continue; ! } ! } } if(!(qcache = Tcl_GetHashValue(hrec))) continue; *************** *** 975,979 **** dnsRecordCache(dnsClient *client, dnsRecord **list) { ! int new; dnsRecord *drec,*hlist; Tcl_HashEntry *hrec; --- 1024,1028 ---- dnsRecordCache(dnsClient *client, dnsRecord **list) { ! int flag; dnsRecord *drec,*hlist; Tcl_HashEntry *hrec; *************** *** 986,992 **** drec->next = drec->prev = 0; Ns_RWLockWrLock(&client->lock); ! hrec = Tcl_CreateHashEntry(&client->list,drec->name,&new); ! if(new) { Tcl_SetHashValue(hrec,drec); } else { hlist = Tcl_GetHashValue(hrec); --- 1035,1042 ---- drec->next = drec->prev = 0; Ns_RWLockWrLock(&client->lock); ! hrec = Tcl_CreateHashEntry(&client->list,drec->name,&flag); ! if(flag) { Tcl_SetHashValue(hrec,drec); + client->rcount++; } else { hlist = Tcl_GetHashValue(hrec); *************** *** 998,1001 **** --- 1048,1057 ---- } } + switch(drec->type) { + case DNS_TYPE_NAPTR: + // Update route statistics, mark that we have routes with that length in the cache + if(drec->nsize < sizeof(client->rstats)) client->rstats[drec->nsize]++; + break; + } Ns_RWLockUnlock(&client->lock); } Index: dns.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/dns.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** dns.c 21 Jun 2005 03:36:40 -0000 1.8 --- dns.c 23 Jun 2005 02:06:02 -0000 1.9 *************** *** 348,351 **** --- 348,352 ---- if(from) { rec->name = ns_strcopy(from->name); + rec->nsize = from->nsize; rec->type = from->type; rec->class = from->class; *************** *** 397,401 **** { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->name = ns_strcopy(name); y->type = DNS_TYPE_A; y->class = DNS_CLASS_INET; --- 398,404 ---- { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->nsize = strlen(name); ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); y->type = DNS_TYPE_A; y->class = DNS_CLASS_INET; *************** *** 410,414 **** { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->name = ns_strcopy(name); y->type = DNS_TYPE_NS; y->class = DNS_CLASS_INET; --- 413,419 ---- { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->nsize = strlen(name); ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); y->type = DNS_TYPE_NS; y->class = DNS_CLASS_INET; *************** *** 423,427 **** { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->name = ns_strcopy(name); y->type = DNS_TYPE_CNAME; y->class = DNS_CLASS_INET; --- 428,434 ---- { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->nsize = strlen(name); ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); y->type = DNS_TYPE_CNAME; y->class = DNS_CLASS_INET; *************** *** 436,440 **** { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->name = ns_strcopy(name); y->type = DNS_TYPE_PTR; y->class = DNS_CLASS_INET; --- 443,449 ---- { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->nsize = strlen(name); ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); y->type = DNS_TYPE_PTR; y->class = DNS_CLASS_INET; *************** *** 449,453 **** { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->name = ns_strcopy(name); y->type = DNS_TYPE_MX; y->class = DNS_CLASS_INET; --- 458,464 ---- { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->nsize = strlen(name); ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); y->type = DNS_TYPE_MX; y->class = DNS_CLASS_INET; *************** *** 465,469 **** { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->name = ns_strcopy(name); y->type = DNS_TYPE_NAPTR; y->class = DNS_CLASS_INET; --- 476,482 ---- { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->nsize = strlen(name); ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); y->type = DNS_TYPE_NAPTR; y->class = DNS_CLASS_INET; *************** *** 487,491 **** { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->name = ns_strcopy(name); y->type = DNS_TYPE_SOA; y->class = DNS_CLASS_INET; --- 500,506 ---- { dnsRecord *y = ns_calloc(1,sizeof(dnsRecord)); ! y->nsize = strlen(name); ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); y->type = DNS_TYPE_SOA; y->class = DNS_CLASS_INET; *************** *** 700,704 **** buf[pos] = 0; // Remove last . in the name ! if(buf[pos-1] == '.') buf[pos-1] = 0; return pos; } --- 715,719 ---- buf[pos] = 0; // Remove last . in the name ! if(buf[pos-1] == '.') buf[--pos] = 0; return pos; } *************** *** 733,737 **** dnsParseRecord(dnsPacket *pkt,int query) { ! int rc, offset; char name[256] = ""; dnsRecord *y; --- 748,752 ---- dnsParseRecord(dnsPacket *pkt,int query) { ! int offset; char name[256] = ""; dnsRecord *y; *************** *** 740,748 **** offset = (pkt->buf.ptr - pkt->buf.data)-2; // The name of the resource ! if((rc = dnsParseName(pkt,&pkt->buf.ptr,name,255,0,0)) < 0) { ! snprintf(name,255,"invalid name: %d %s: ",rc,pkt->buf.ptr); goto err; } ! y->name = ns_strdup(name); // The type of data if(pkt->buf.ptr+2 > pkt->buf.data+pkt->buf.allocated) { --- 755,764 ---- offset = (pkt->buf.ptr - pkt->buf.data)-2; // The name of the resource ! if((y->nsize = dnsParseName(pkt,&pkt->buf.ptr,name,255,0,0)) < 0) { ! snprintf(name,255,"invalid name: %d %s: ",y->nsize,pkt->buf.ptr); goto err; } ! y->name = ns_malloc(y->nsize+1); ! strcpy(y->name,name); // The type of data if(pkt->buf.ptr+2 > pkt->buf.data+pkt->buf.allocated) { Index: dns.h =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/dns.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dns.h 21 Jun 2005 03:36:40 -0000 1.7 --- dns.h 23 Jun 2005 02:06:02 -0000 1.8 *************** *** 120,123 **** --- 120,124 ---- struct _dnsRecord *next,*prev; char *name; + short nsize; unsigned short type; unsigned short class; Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/ChangeLog,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ChangeLog 21 Jun 2005 03:36:40 -0000 1.4 --- ChangeLog 23 Jun 2005 02:06:02 -0000 1.5 *************** *** 1,2 **** --- 1,6 ---- + 2005-06-22 Vlad Seryakov vl...@cr... + + * statistics and NAPTR searching + 2005-06-20 Vlad Seryakov vl...@cr... |