Next: Expirační mechanismus DNSCache
Up: DNSCache
Previous: Co je DNSCache
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
- ano
goto 4
- ne
goto 6
- 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
- ano
goto 5
- ne
goto 3
- 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: Expirační mechanismus DNSCache
Up: DNSCache
Previous: Co je DNSCache
Stanislav Pavlicek
2000-06-12