? ../ircu2.10.06/patch.dbh13 ? ../ircu2.10.06/patch.xmode2 ? ../ircu2.10.06/patch.dbh14 ? ../ircu2.10.06/patch.db31 ? ../ircu2.10.06/patch.db32 Index: ../ircu2.10.06/todo.jcea =================================================================== RCS file: /cvsroot/ircd/todo.jcea,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** ../ircu2.10.06/todo.jcea 1999/10/14 09:17:19 1.12 --- ../ircu2.10.06/todo.jcea 1999/10/14 12:31:39 1.13 *************** *** 1,3 **** --- 1,18 ---- + 14/Oct/99 + A la hora de buscar el registro que debemos + enviar a un vecino, aprovechar el mmap() + para buscarlo por subdivision. + + 14/Oct/99 + Ahora que leer las BDD de disco es rapido (map()), + el problema es escribir. Suponiendo que escribir + cada registro nos lleve 0.1 segundos, propagar + 100 registros por rafaga supone 10 segundos. + + Intolerable. + + De momento bajo el taman~o de la rafaga a 10 registros. + 13/Oct/99 La compactacion no elimina registros duplicados. Ese es un problema cuando, por ejemplo, un usuario Index: ../ircu2.10.06/include/struct.h =================================================================== RCS file: /cvsroot/ircd/include/struct.h,v retrieving revision 1.15 retrieving revision 1.16 diff -c -r1.15 -r1.16 *** ../ircu2.10.06/include/struct.h 1999/10/13 19:30:09 1.15 --- ../ircu2.10.06/include/struct.h 1999/10/14 12:31:39 1.16 *************** *** 202,207 **** --- 202,214 ---- /* Para las features del Virtual CHaN */ #define DBH_CHANSERV "ChanServ" + struct tabla_en_memoria { + char *posicion; + unsigned long len; + char *puntero_r; + char *puntero_w; + }; + struct dbh_reg { char *destino; char *clave; Index: ../ircu2.10.06/ircd/s_debug.c =================================================================== RCS file: /cvsroot/ircd/ircd/s_debug.c,v retrieving revision 1.53 retrieving revision 1.54 diff -c -r1.53 -r1.54 *** ../ircu2.10.06/ircd/s_debug.c 1999/10/14 10:16:33 1.53 --- ../ircu2.10.06/ircd/s_debug.c 1999/10/14 12:31:39 1.54 *************** *** 191,197 **** '-', #endif #endif ! 'D','B','3','1', #ifdef DB_ESNET '+', #else --- 191,197 ---- '-', #endif #endif ! 'D','B','3','2', #ifdef DB_ESNET '+', #else Index: ../ircu2.10.06/ircd/s_serv.c =================================================================== RCS file: /cvsroot/ircd/ircd/s_serv.c,v retrieving revision 1.35 retrieving revision 1.36 diff -c -r1.35 -r1.36 *** ../ircu2.10.06/ircd/s_serv.c 1999/10/14 10:16:33 1.35 --- ../ircu2.10.06/ircd/s_serv.c 1999/10/14 12:31:39 1.36 *************** *** 1495,1521 **** /* * leer_db * ! * Lee un registro de la base de datos. Si hay error, cierra el handle. * */ ! int leer_db(int handle,char *buf) { int cont=0; int estado; ! do { ! alarm(3); ! estado=read(handle,buf,1); ! alarm(0); ! if(estado!=1) { ! close(handle); ! *buf='\0'; ! return estado; } ! cont++; ! } while((*buf++!='\n') && (cont<500)); ! *(--buf)='\0'; ! return cont; } /* --- 1495,1520 ---- /* * leer_db * ! * Lee un registro de la base de datos. * */ ! int leer_db(struct tabla_en_memoria *mapeo,char *buf) { int cont=0; int estado; + char *p=mapeo->posicion+mapeo->len; ! while(mapeo->puntero_rpuntero_r++); ! if(*buf=='\r') continue; ! if((*buf++=='\n')) { ! *--buf='\0'; ! return cont; } ! if(cont++>500) break; ! } ! *buf='\0'; ! return -1; } /* *************** *** 1524,1543 **** * Se mueve hasta un registro de la base de datos * */ ! int abrir_db(unsigned long registro,char *buf,char bdd) { int handle; int cont; char path[1024]; *buf='\0'; - alarm(3); sprintf_irc(path,"%s/tabla.%c",DBPATH,bdd); handle=open(path, O_RDONLY, S_IRUSR | S_IWUSR); alarm(0); ! if(handle==-1) return -1; do { ! cont=leer_db(handle,buf); if(cont==-1) { *buf='\0'; return -1; --- 1523,1551 ---- * Se mueve hasta un registro de la base de datos * */ ! int abrir_db(unsigned long registro,char *buf,char bdd,struct tabla_en_memoria *mapeo) { int handle; int cont; char path[1024]; + struct stat estado; *buf='\0'; sprintf_irc(path,"%s/tabla.%c",DBPATH,bdd); + alarm(3); handle=open(path, O_RDONLY, S_IRUSR | S_IWUSR); + fstat(handle,&estado); + mapeo->len=estado.st_size; + mapeo->posicion=mmap(NULL,mapeo->len, + PROT_READ,MAP_SHARED | MAP_NORESERVE,handle,0); + close(handle); alarm(0); ! mapeo->puntero_r= ! mapeo->puntero_w= ! mapeo->posicion; ! if((handle==-1)||(mapeo->posicion==MAP_FAILED)) return -1; do { ! cont=leer_db(mapeo,buf); if(cont==-1) { *buf='\0'; return -1; *************** *** 1546,1551 **** --- 1554,1563 ---- return handle; } + void cerrar_db(struct tabla_en_memoria *mapeo) { + munmap(mapeo->posicion,mapeo->len); + } + /* ** almacena_hash ** *************** *** 1819,1828 **** char path[1024]; int db_file; Dlink *lp; borrar_db(que_bdd); ! db_file=abrir_db(0,buf,que_bdd); if(db_file!=-1) do { /* db_alta modifica la cadena */ if(tabla_residente[que_bdd]) { --- 1831,1841 ---- char path[1024]; int db_file; Dlink *lp; + struct tabla_en_memoria mapeo; borrar_db(que_bdd); ! db_file=abrir_db(0,buf,que_bdd,&mapeo); if(db_file!=-1) do { /* db_alta modifica la cadena */ if(tabla_residente[que_bdd]) { *************** *** 1830,1836 **** } else { actualiza_hash(buf,que_bdd); } ! } while(leer_db(db_file,buf)!=-1); dbh_eliminar_borrados(que_bdd); --- 1843,1850 ---- } else { actualiza_hash(buf,que_bdd); } ! } while(leer_db(&mapeo,buf)!=-1); ! cerrar_db(&mapeo); dbh_eliminar_borrados(que_bdd); *************** *** 1945,1950 **** --- 1959,1965 ---- char que_bdd=ESNET_NICKDB; unsigned long mascara_bdd; int cont; + struct tabla_en_memoria mapeo; if(!IsServer(sptr) || parc<5) return 0; *************** *** 1980,1986 **** } } ! cont=100; if(db>=tabla_serie[que_bdd]) { /* Se le pueden mandar registros individuales */ sptr->serv->esnet_db|=mascara_bdd; --- 1995,2001 ---- } } ! cont=10; if(db>=tabla_serie[que_bdd]) { /* Se le pueden mandar registros individuales */ sptr->serv->esnet_db|=mascara_bdd; *************** *** 2004,2010 **** db=0; /* Nos curamos en salud; se la enviamos entera */ } ! db_file=abrir_db(db,db_buf,que_bdd); if(db_file==-1) return 0; /* Problemas con la DB */ do { p=strchr(db_buf,' '); --- 2019,2025 ---- db=0; /* Nos curamos en salud; se la enviamos entera */ } ! db_file=abrir_db(db,db_buf,que_bdd,&mapeo); if(db_file==-1) return 0; /* Problemas con la DB */ do { p=strchr(db_buf,' '); *************** *** 2024,2031 **** sendto_one(sptr,"%s DB %s %s %s %s :%s",NumServ(&me),p,db_buf,p2,p3,p4); } if(!(--cont)) break; ! } while(leer_db(db_file,db_buf)!=-1); ! close(db_file); if(cont) sptr->serv->esnet_db|=mascara_bdd; else sendto_one(sptr,"%s DB %s 0 B %lu %c", NumServ(&me),parv[0],tabla_serie[que_bdd],que_bdd); --- 2039,2046 ---- sendto_one(sptr,"%s DB %s %s %s %s :%s",NumServ(&me),p,db_buf,p2,p3,p4); } if(!(--cont)) break; ! } while(leer_db(&mapeo,db_buf)!=-1); ! cerrar_db(&mapeo); if(cont) sptr->serv->esnet_db|=mascara_bdd; else sendto_one(sptr,"%s DB %s 0 B %lu %c", NumServ(&me),parv[0],tabla_serie[que_bdd],que_bdd);