mirror of
https://github.com/isc-projects/bind9.git
synced 2026-05-28 04:34:54 -04:00
[9.20] fix: usr: preserve cache when reload fails and reload the server again
Fixes an issue where failing to reconfigure/reload the server would prevent to preserved the views caches on the subsequent server reconfiguration/reload. Closes #5523 Backport of MR !10984 Merge branch 'backport-colin/fix-cache-revert-9.20' into 'bind-9.20' See merge request isc-projects/bind9!10988
This commit is contained in:
commit
975aeda10b
4 changed files with 96 additions and 6 deletions
|
|
@ -4839,13 +4839,15 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
|
|||
dns_cache_getname(nsc->cache));
|
||||
nsc = NULL;
|
||||
} else {
|
||||
if (oldcache) {
|
||||
ISC_LIST_UNLINK(*oldcachelist, nsc, link);
|
||||
ISC_LIST_APPEND(*cachelist, nsc, link);
|
||||
nsc->primaryview = view;
|
||||
}
|
||||
dns_cache_attach(nsc->cache, &cache);
|
||||
shared_cache = true;
|
||||
dns_cache_attach(nsc->cache, &cache);
|
||||
if (oldcache) {
|
||||
/*
|
||||
* We need to re-use the cache, but we don't
|
||||
* want to mutate the old production list.
|
||||
*/
|
||||
nsc = NULL;
|
||||
}
|
||||
}
|
||||
} else if (strcmp(cachename, view->name) == 0) {
|
||||
result = dns_viewlist_find(&named_g_server->viewlist, cachename,
|
||||
|
|
|
|||
48
bin/tests/system/resolver/ns1/named.conf.j2
Normal file
48
bin/tests/system/resolver/ns1/named.conf.j2
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
||||
*
|
||||
* SPDX-License-Identifier: MPL-2.0
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
{% set wrongoption = wrongoption | default(False) %}
|
||||
|
||||
options {
|
||||
query-source address 10.53.0.1;
|
||||
notify-source 10.53.0.1;
|
||||
transfer-source 10.53.0.1;
|
||||
port @PORT@;
|
||||
pid-file "named.pid";
|
||||
listen-on { 10.53.0.1; };
|
||||
listen-on-v6 { none; };
|
||||
recursion yes;
|
||||
dnssec-validation no;
|
||||
attach-cache "globalcache";
|
||||
max-zone-ttl unlimited;
|
||||
resolver-query-timeout 5000; # 5 seconds
|
||||
max-recursion-queries 100;
|
||||
};
|
||||
|
||||
view "default" {
|
||||
zone "." {
|
||||
type hint;
|
||||
file "root.hint";
|
||||
};
|
||||
{% if wrongoption %}
|
||||
forwarders port 9999999 { 127.0.0.1; };
|
||||
{% endif %}
|
||||
};
|
||||
|
||||
key rndc_key {
|
||||
secret "1234abcd8765";
|
||||
algorithm @DEFAULT_HMAC@;
|
||||
};
|
||||
|
||||
controls {
|
||||
inet 10.53.0.1 port @CONTROLPORT@ allow { any; } keys { rndc_key; };
|
||||
};
|
||||
39
bin/tests/system/resolver/tests_resolver.py
Normal file
39
bin/tests/system/resolver/tests_resolver.py
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
||||
#
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
#
|
||||
# See the COPYRIGHT file distributed with this work for additional
|
||||
# information regarding copyright ownership.
|
||||
|
||||
import time
|
||||
|
||||
|
||||
import isctest
|
||||
|
||||
|
||||
def test_resolver_cache_reloadfails(ns1, templates):
|
||||
ns1.rndc("flush")
|
||||
msg = isctest.query.create("www.example.org.", "A")
|
||||
res = isctest.query.udp(msg, "10.53.0.1")
|
||||
isctest.check.noerror(res)
|
||||
assert res.answer[0].ttl == 300
|
||||
templates.render("ns1/named.conf", {"wrongoption": True})
|
||||
try:
|
||||
# The first reload fails, and the old cache list will be preserved
|
||||
ns1.rndc("reload")
|
||||
except isctest.rndc.RNDCException:
|
||||
templates.render("ns1/named.conf", {"wrongoption": False})
|
||||
# The second reload succeed, and the cache is still there, as preserved
|
||||
# from the old cache list
|
||||
ns1.rndc("reload")
|
||||
time.sleep(3)
|
||||
msg = isctest.query.create("www.example.org.", "A")
|
||||
res = isctest.query.udp(msg, "10.53.0.1")
|
||||
isctest.check.noerror(res)
|
||||
# The ttl being lower than 300 (provided by fake authoritative) proves
|
||||
# the cache is still in use
|
||||
assert res.answer[0].ttl < 300
|
||||
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
import pytest
|
||||
|
||||
|
||||
pytestmark = pytest.mark.extra_artifacts(
|
||||
[
|
||||
".digrc",
|
||||
|
|
|
|||
Loading…
Reference in a new issue