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;