[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:
Colin Vidal 2025-09-18 09:45:18 +02:00
commit 975aeda10b
4 changed files with 96 additions and 6 deletions

View file

@ -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,

View 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; };
};

View 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

View file

@ -11,6 +11,7 @@
import pytest
pytestmark = pytest.mark.extra_artifacts(
[
".digrc",