next up previous contents index
Next: Expirační mechanismus DNSCache Up: DNSCache Previous: Co je DNSCache

Implementace DNSCache v PETu

DNSCache submodul je volán ve funkci srv_connect(..) a to jen v případě, že je nastavena globální proměnná pet.use_dns_cache na hodnotu TRUE. Jestliže se DNSCache nepoužívá volá se místo ní systémová funkce getaddrinfo(..).

Úkolem DNSCache je tedy cachovat odpovědi od nameserveru ve formátu hostname:port. Tento formát odpovědi si DNSCache hašuje jednoduchou hašovací funkcí na long integer. Tento long int hash kód se používá jako klíč v binárním vyhledávacím stromu, který používá DNSCache jako datovou strukturu.

Jeden záznam DNSCache v binárním stromu tedy vypadá takto:

/* dns tree structure */

typedef struct dns_tree_{

  /* hash key of this entry */

  long int key;         

  /* hostname of this dns cache entry */

  char *hostname;       

  /* time when we create this structure */

  time_t born_time;     

  /* addrinfo structure used in socket,connect */

  struct addrinfo *addr;

  /* show the left node */

  struct dns_tree_ *left;

  /* shot the right node */

  struct dns_tree_ *right;

}dns_tree;

 

Aby si mohl uživatel regulovat maximální počet položek v DNSCache, byla do konfiguračního souboru přidána položka max_dns_objects. Jak se chová DNSCache v případech, že už je v paměti max_dns_objects položek a je třeba přidat další? V těchto případech provádí DNSCache algoritmus LRU, tedy vyhodí nejstarší objekt z cache. Nalezení takového objektu znamená projít všechny záznamy v DNSCache, což je pomalé, protože záznamu v cache může být mnoho. Z toho důvodu používá DNSCache ještě jednu datovou strukturu a to obousměrný seznam pointerů na záznamy v binárním vyhledávacím stromu:

/* dns list structure */

typedef struct dns_list_{

  dns_tree *tree;

  struct dns_list_ *next;

  struct dns_list_ *prev;

}dns_list;

Ihned po přidání nového záznamu se tedy přidá na konec tohoto seznamu pointer na nově přidaný záznam ve stromu.

Přidání nového záznamu probíhá v těchto krocích:

1.
vytvoření nového objektu dns_tree
2.
vytvoření nového objektu dns_list
3.
kontrola, zda-li není potřeba provést algoritmus LRU

4.
smazání objektu dns_tree, na který ukazuje začátek seznamu dns_list
5.
vyhození prvního prvku ze seznamu dns_list
6.
přidání nového objektu dns_tree do binárního stromu (podle hash klíče)
7.
přidání nového objektu dns_list nakonec seznamu
Vyhledání objektu v DNSCache je tedy velice jednoduché, protože se pouze spočítá hash hodnota a ta se najde v binárním stromu. Celý životní cyklus funkce dns_lookup je popsán v následující kapitole.

dns_lookup()
Tato funkce int dns_lookup(struct addrinfo **addr,char *hostname,long srvport) je hlavní funkce DNSCache a provádí následující kroky:
1.
spočtení hash hodnoty pro hostname:srvport
2.
existuje tato hodnota v binárním stromu

3.
volání funkce getaddrinfo(..) na hostname:port
4.
přidej nový záznam do stromu a seznamu(viz. výše)
5.
vrať nalezený záznam


next up previous contents index
Next: Expirační mechanismus DNSCache Up: DNSCache Previous: Co je DNSCache
Stanislav Pavlicek
2000-06-12