Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 4295:05031fce7ce8
Now nginx uses TTL of a DNS response when calculating cache validity.
Previously it used a hardcoded value of 300 seconds. Also added the
"valid=" parameter to the "resolver" directive that can be used to
override the cache validity time.
Patch by Kirill A. Korinskiy with minor changes.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Wed, 16 Nov 2011 13:11:39 +0000 |
parents | 768212ca0745 |
children | 783fd9c38d98 |
comparison
equal
deleted
inserted
replaced
4294:56cb2255735a | 4295:05031fce7ce8 |
---|---|
91 | 91 |
92 | 92 |
93 ngx_resolver_t * | 93 ngx_resolver_t * |
94 ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) | 94 ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) |
95 { | 95 { |
96 ngx_str_t s; | |
96 ngx_url_t u; | 97 ngx_url_t u; |
97 ngx_uint_t i; | 98 ngx_uint_t i; |
98 ngx_resolver_t *r; | 99 ngx_resolver_t *r; |
99 ngx_pool_cleanup_t *cln; | 100 ngx_pool_cleanup_t *cln; |
100 ngx_udp_connection_t *uc; | 101 ngx_udp_connection_t *uc; |
144 r->event->log = &cf->cycle->new_log; | 145 r->event->log = &cf->cycle->new_log; |
145 r->ident = -1; | 146 r->ident = -1; |
146 | 147 |
147 r->resend_timeout = 5; | 148 r->resend_timeout = 5; |
148 r->expire = 30; | 149 r->expire = 30; |
149 r->valid = 300; | 150 r->valid = 0; |
150 | 151 |
151 r->log = &cf->cycle->new_log; | 152 r->log = &cf->cycle->new_log; |
152 r->log_level = NGX_LOG_ERR; | 153 r->log_level = NGX_LOG_ERR; |
153 | 154 |
154 for (i = 0; i < n; i++) { | 155 for (i = 0; i < n; i++) { |
156 if (ngx_strncmp(names[i].data, "valid=", 6) == 0) { | |
157 s.len = names[i].len - 6; | |
158 s.data = names[i].data + 6; | |
159 | |
160 r->valid = ngx_parse_time(&s, 1); | |
161 | |
162 if (r->valid == NGX_ERROR) { | |
163 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
164 "invalid parameter: %V", &names[i]); | |
165 return NULL; | |
166 } | |
167 | |
168 continue; | |
169 } | |
170 | |
155 ngx_memzero(&u, sizeof(ngx_url_t)); | 171 ngx_memzero(&u, sizeof(ngx_url_t)); |
156 | 172 |
157 u.host = names[i]; | 173 u.host = names[i]; |
158 u.port = 53; | 174 u.port = 53; |
159 | 175 |
1147 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t ans) | 1163 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t ans) |
1148 { | 1164 { |
1149 char *err; | 1165 char *err; |
1150 u_char *cname; | 1166 u_char *cname; |
1151 size_t len; | 1167 size_t len; |
1168 int32_t ttl; | |
1152 uint32_t hash; | 1169 uint32_t hash; |
1153 in_addr_t addr, *addrs; | 1170 in_addr_t addr, *addrs; |
1154 ngx_str_t name; | 1171 ngx_str_t name; |
1155 ngx_uint_t qtype, qident, naddrs, a, i, n, start; | 1172 ngx_uint_t qtype, qident, naddrs, a, i, n, start; |
1156 ngx_resolver_an_t *an; | 1173 ngx_resolver_an_t *an; |
1256 | 1273 |
1257 an = (ngx_resolver_an_t *) &buf[i]; | 1274 an = (ngx_resolver_an_t *) &buf[i]; |
1258 | 1275 |
1259 qtype = (an->type_hi << 8) + an->type_lo; | 1276 qtype = (an->type_hi << 8) + an->type_lo; |
1260 len = (an->len_hi << 8) + an->len_lo; | 1277 len = (an->len_hi << 8) + an->len_lo; |
1278 ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16) | |
1279 + (an->ttl[2] << 8) + (an->ttl[3]); | |
1280 | |
1281 if (ttl < 0) { | |
1282 ttl = 0; | |
1283 } | |
1261 | 1284 |
1262 if (qtype == NGX_RESOLVE_A) { | 1285 if (qtype == NGX_RESOLVE_A) { |
1263 | 1286 |
1264 i += sizeof(ngx_resolver_an_t); | 1287 i += sizeof(ngx_resolver_an_t); |
1265 | 1288 |
1285 ngx_log_error(r->log_level, r->log, 0, | 1308 ngx_log_error(r->log_level, r->log, 0, |
1286 "unexpected qtype %ui", qtype); | 1309 "unexpected qtype %ui", qtype); |
1287 } | 1310 } |
1288 } | 1311 } |
1289 | 1312 |
1290 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, | 1313 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, |
1291 "resolver naddrs:%ui cname:%p", naddrs, cname); | 1314 "resolver naddrs:%ui cname:%p ttl:%d", |
1315 naddrs, cname, ttl); | |
1292 | 1316 |
1293 if (naddrs) { | 1317 if (naddrs) { |
1294 | 1318 |
1295 if (naddrs == 1) { | 1319 if (naddrs == 1) { |
1296 rn->u.addr = addr; | 1320 rn->u.addr = addr; |
1355 | 1379 |
1356 rn->naddrs = (u_short) naddrs; | 1380 rn->naddrs = (u_short) naddrs; |
1357 | 1381 |
1358 ngx_queue_remove(&rn->queue); | 1382 ngx_queue_remove(&rn->queue); |
1359 | 1383 |
1360 rn->valid = ngx_time() + r->valid; | 1384 rn->valid = ngx_time() + (r->valid ? r->valid : ttl); |
1361 rn->expire = ngx_time() + r->expire; | 1385 rn->expire = ngx_time() + r->expire; |
1362 | 1386 |
1363 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); | 1387 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); |
1364 | 1388 |
1365 next = rn->waiting; | 1389 next = rn->waiting; |
1397 | 1421 |
1398 ngx_queue_remove(&rn->queue); | 1422 ngx_queue_remove(&rn->queue); |
1399 | 1423 |
1400 rn->cnlen = (u_short) name.len; | 1424 rn->cnlen = (u_short) name.len; |
1401 rn->u.cname = name.data; | 1425 rn->u.cname = name.data; |
1402 rn->valid = ngx_time() + r->valid; | 1426 |
1427 rn->valid = ngx_time() + (r->valid ? r->valid : ttl); | |
1403 rn->expire = ngx_time() + r->expire; | 1428 rn->expire = ngx_time() + r->expire; |
1404 | 1429 |
1405 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); | 1430 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); |
1406 | 1431 |
1407 ctx = rn->waiting; | 1432 ctx = rn->waiting; |
1448 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan) | 1473 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan) |
1449 { | 1474 { |
1450 char *err; | 1475 char *err; |
1451 size_t len; | 1476 size_t len; |
1452 in_addr_t addr; | 1477 in_addr_t addr; |
1478 int32_t ttl; | |
1453 ngx_int_t digit; | 1479 ngx_int_t digit; |
1454 ngx_str_t name; | 1480 ngx_str_t name; |
1455 ngx_uint_t i, mask, qident; | 1481 ngx_uint_t i, mask, qident; |
1456 ngx_resolver_an_t *an; | 1482 ngx_resolver_an_t *an; |
1457 ngx_resolver_ctx_t *ctx, *next; | 1483 ngx_resolver_ctx_t *ctx, *next; |
1543 } | 1569 } |
1544 | 1570 |
1545 an = (ngx_resolver_an_t *) &buf[i + 2]; | 1571 an = (ngx_resolver_an_t *) &buf[i + 2]; |
1546 | 1572 |
1547 len = (an->len_hi << 8) + an->len_lo; | 1573 len = (an->len_hi << 8) + an->len_lo; |
1574 ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16) | |
1575 + (an->ttl[2] << 8) + (an->ttl[3]); | |
1576 | |
1577 if (ttl < 0) { | |
1578 ttl = 0; | |
1579 } | |
1548 | 1580 |
1549 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, | 1581 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, |
1550 "resolver qt:%ui cl:%ui len:%uz", | 1582 "resolver qt:%ui cl:%ui len:%uz", |
1551 (an->type_hi << 8) + an->type_lo, | 1583 (an->type_hi << 8) + an->type_lo, |
1552 (an->class_hi << 8) + an->class_lo, len); | 1584 (an->class_hi << 8) + an->class_lo, len); |
1579 } | 1611 } |
1580 } | 1612 } |
1581 | 1613 |
1582 ngx_queue_remove(&rn->queue); | 1614 ngx_queue_remove(&rn->queue); |
1583 | 1615 |
1584 rn->valid = ngx_time() + r->valid; | 1616 rn->valid = ngx_time() + (r->valid ? r->valid : ttl); |
1585 rn->expire = ngx_time() + r->expire; | 1617 rn->expire = ngx_time() + r->expire; |
1586 | 1618 |
1587 ngx_queue_insert_head(&r->addr_expire_queue, &rn->queue); | 1619 ngx_queue_insert_head(&r->addr_expire_queue, &rn->queue); |
1588 | 1620 |
1589 next = rn->waiting; | 1621 next = rn->waiting; |