RBTDB has been replaced with QP-tries. This is
expected to improve scalability and reduce
CPU consumption under load. It is currently known to
- have higher memory consumption than RBTDB; this
- will be addressed in future releases.
+ have higher memory consumption than the traditional
+ RBTDB; this will be addressed in future releases.
Nodes in a QP-trie contain the full domain name,
while nodes in a red-black tree only contain names
single-thread "dns_qp" interface with locks for
synchronization. A future version will use the
multithreaded "dns_qpmulti" interface instead,
- and will be renamed to QPDB. [GL #4411]
+ and will be renamed to QPDB.
+
+ The RBT-based version of RBTDB is still in place
+ for now, and can be used by specifying "database rbt"
+ in a "zone" statement, or by compiling with
+ "configure --with-zonedb=rbt --with-cachedb=rbt".
+ [GL #4411]
6354. [bug] Change 6035 introduced a regression when chasing DS
records resulting in an assertion failure. [GL #4612]
#define ERR_IS_MXCNAME 6
#define ERR_IS_SRVCNAME 7
-static const char *dbtype[] = { "qp" };
+static const char *dbtype[] = { ZONEDB_DEFAULT };
int debug = 0;
const char *journal = NULL;
* Skip checks when using an alternate data source.
*/
cfg_map_get(zoptions, "database", &dbobj);
- if (dbobj != NULL && strcmp("qp", cfg_obj_asstring(dbobj)) != 0) {
+ if (dbobj != NULL &&
+ strcmp(ZONEDB_DEFAULT, cfg_obj_asstring(dbobj)) != 0)
+ {
return (ISC_R_SUCCESS);
}
load_db(const char *filename, dns_db_t **dbp, dns_dbnode_t **nodep) {
isc_result_t result;
- result = dns_db_create(mctx, "qp", name, dns_dbtype_zone, rdclass, 0,
- NULL, dbp);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, name, dns_dbtype_zone,
+ rdclass, 0, NULL, dbp);
check_result(result, "dns_db_create()");
result = dns_db_load(*dbp, filename, dns_masterformat_text,
dns_rdataset_t diffset;
uint32_t save;
- result = dns_db_create(mctx, "qp", name, dns_dbtype_zone, rdclass, 0,
- NULL, &update_db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, name, dns_dbtype_zone,
+ rdclass, 0, NULL, &update_db);
check_result(result, "dns_db_create()");
result = dns_db_newversion(update_db, &update_version);
dns_name_format(name, setname, sizeof(setname));
- result = dns_db_create(mctx, "qp", name, dns_dbtype_zone, rdclass, 0,
- NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, name, dns_dbtype_zone,
+ rdclass, 0, NULL, &db);
if (result != ISC_R_SUCCESS) {
fatal("can't create database");
}
dns_name_format(name, setname, sizeof(setname));
- result = dns_db_create(mctx, "qp", name, dns_dbtype_zone, rdclass, 0,
- NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, name, dns_dbtype_zone,
+ rdclass, 0, NULL, &db);
if (result != ISC_R_SUCCESS) {
fatal("can't create database");
}
}
isc_buffer_putuint8(&b, 0);
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- rdclass, 0, NULL, dbp);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname,
+ dns_dbtype_zone, rdclass, 0, NULL, dbp);
check_result(result, "dns_db_create()");
result = dns_db_load(*dbp, filename, inputformat, DNS_MASTER_HINT);
isc_result_totext(result));
}
- result = dns_db_create(mctx, "qp", name, dns_dbtype_zone, rdclass, 0,
- NULL, db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, name, dns_dbtype_zone,
+ rdclass, 0, NULL, db);
check_result(result, "dns_db_create()");
result = dns_db_load(*db, file, inputformat, 0);
dns_diff_append(&diff, &tuple);
}
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- gclass, 0, NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname,
+ dns_dbtype_zone, gclass, 0, NULL, &db);
check_result(result, "dns_db_create");
result = dns_db_newversion(db, &dbversion);
isc_result_totext(result));
}
- result = dns_db_create(mctx, "qp", name, dns_dbtype_zone, rdclass, 0,
- NULL, db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, name, dns_dbtype_zone,
+ rdclass, 0, NULL, db);
check_result(result, "dns_db_create()");
result = dns_db_load(*db, file, inputformat, 0);
const cfg_obj_t *obj;
const cfg_obj_t *zconfig;
const cfg_obj_t *zoptions;
- const char *rbt_dbtype[4] = { "qp" };
+ const char *default_dbtype[4] = { ZONEDB_DEFAULT };
const char *sep = ": view ";
const char *str;
const char *viewname = view->name;
dns_name_t *ns;
dns_name_t *zname;
dns_zone_t *zone = NULL;
- int rbt_dbtypec = 1;
+ int default_dbtypec = 1;
isc_result_t result;
dns_namereln_t namereln;
int order;
}
}
if (db == NULL) {
- CHECK(dns_db_create(view->mctx, "qp", name,
+ CHECK(dns_db_create(view->mctx, ZONEDB_DEFAULT, name,
dns_dbtype_zone, view->rdclass, 0,
NULL, &db));
CHECK(dns_db_newversion(db, &version));
}
/*
- * Is the existing zone the ok to use?
+ * Is the existing zone ok to use?
*/
if (pzone != NULL) {
unsigned int typec;
- const char **dbargv;
+ const char **dbargv = NULL;
if (db != NULL) {
- typec = rbt_dbtypec;
- dbargv = rbt_dbtype;
+ typec = default_dbtypec;
+ dbargv = default_dbtype;
} else {
typec = empty_dbtypec;
dbargv = empty_dbtype;
uint32_t count;
unsigned int dbargc;
char **dbargv;
- static char default_dbtype[] = "qp";
+ static char default_dbtype[] = ZONEDB_DEFAULT;
static char dlz_dbtype[] = "dlz";
char *cpval = default_dbtype;
isc_mem_t *mctx = dns_zone_getmctx(zone);
return (result);
}
- result = dns_db_create(mctx, "qp", name, dns_dbtype_zone,
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, name, dns_dbtype_zone,
dns_rdataclass_in, 0, NULL, db);
if (result != ISC_R_SUCCESS) {
return (result);
AC_SUBST([DTRACE])
+#
+# Which should be the default zone database, RBTDB or QPDB?
+# [pairwise: --with-zonedb=qp, --with-zonedb=rbt]
+#
+AC_ARG_WITH([zonedb],
+ [AS_HELP_STRING([--with-zonedb=detect],[specify default zone database type (default is "qp")])],
+ [],[with_zonedb=qp])
+zonedb="qp"
+AS_CASE([$with_zonedb],
+ [RBT*|rbt*],[zonedb="rbt"],
+ [QP*|qp*],[],
+ [AC_MSG_ERROR([Unknown zone database type])]
+ )
+AC_DEFINE_UNQUOTED([ZONEDB_DEFAULT], ["$zonedb"], [Default zone database type])
+
+#
+# Which should be the default cache database, RBTDB or QPDB?
+# [pairwise: --with-cachedb=qp, --with-cachedb=rbt]
+#
+AC_ARG_WITH([cachedb],
+ [AS_HELP_STRING([--with-cachedb=detect],[specify default cache database type (default is "qp")])],
+ [],[with_cachedb=qp])
+cachedb="qp"
+AS_CASE([$with_cachedb],
+ [RBT*|rbt*],[cachedb="rbt"],
+ [QP*|qp*],[],
+ [AC_MSG_ERROR([Unknown cache database type])]
+ )
+AC_DEFINE_UNQUOTED([CACHEDB_DEFAULT], ["$cachedb"], [Default cache database type])
#
# Files to configure. These are listed here because we used to
if test "yes" = "$with_jemalloc"; then
echo " Memory allocator: jemalloc"
fi
+ if test "yes" = "$enable_full_report" -o "rbt" = "$zonedb"; then
+ echo " Default zone database type: $zonedb"
+ fi
+ if test "yes" = "$enable_full_report" -o "rbt" = "$zonedb"; then
+ echo " Default cache database type: $cachedb"
+ fi
if test "yes" = "$enable_full_report" -o "standard" = "$with_locktype"; then
echo " Mutex lock type: $with_locktype"
fi
A side effect of this change is that zone files that are created with
:any:`masterfile-style` ``relative`` - for example, the output of
:any:`dnssec-signzone` - will no longer have multiple different
- `$ORIGIN` statements. There should be no other behavior changes to
- server behavior. :gl:`#4411`.
+ `$ORIGIN` statements. There should be no other changes to server
+ behavior.
+
+ The old RBT-based database still exists for now, and can be used by
+ specifying ``database rbt`` in a ``zone`` statement in ``named.conf``,
+ or by compiling with ``configure --with-zonedb=rbt --with-cachedb=rbt``.
+ :gl:`#4411`.
Bug Fixes
~~~~~~~~~
dns_db_t *db = NULL;
isc_mem_create(&mctx);
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname,
+ dns_dbtype_zone, dns_rdataclass_in, 0, NULL,
+ &db);
if (result != ISC_R_SUCCESS) {
return 0;
}
* dns_db_create() via argv[0].
*/
argv[0] = (char *)cache->hmctx;
- result = dns_db_create(cache->mctx, "qp", dns_rootname,
+ result = dns_db_create(cache->mctx, CACHEDB_DEFAULT, dns_rootname,
dns_dbtype_cache, cache->rdclass, 1, argv, db);
if (result == ISC_R_SUCCESS) {
dns_db_setservestalettl(*db, cache->serve_stale_ttl);
CHECK(dns_view_createresolver(view, loopmgr, nm, 0, tlsctx_client_cache,
dispatchv4, dispatchv6));
- CHECK(dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_cache, rdclass,
- 0, NULL, &view->cachedb));
+ CHECK(dns_db_create(mctx, CACHEDB_DEFAULT, dns_rootname,
+ dns_dbtype_cache, rdclass, 0, NULL,
+ &view->cachedb));
*viewp = view;
return (ISC_R_SUCCESS);
REQUIRE(target != NULL && *target == NULL);
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- rdclass, 0, NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname,
+ dns_dbtype_zone, rdclass, 0, NULL, &db);
if (result != ISC_R_SUCCESS) {
goto failure;
}
axfr_makedb(dns_xfrin_t *xfr, dns_db_t **dbp) {
isc_result_t result;
- result = dns_db_create(xfr->mctx, /* XXX */
- "qp", /* XXX guess */
- &xfr->name, dns_dbtype_zone, xfr->rdclass, 0,
- NULL, /* XXX guess */
- dbp);
+ result = dns_db_create(xfr->mctx, ZONEDB_DEFAULT, &xfr->name,
+ dns_dbtype_zone, xfr->rdclass, 0, NULL, dbp);
if (result == ISC_R_SUCCESS) {
dns_zone_rpz_enable_db(xfr->zone, *dbp);
dns_zone_catz_enable_db(xfr->zone, *dbp);
#define ENTER zone_debuglog(zone, __func__, 1, "enter")
static const unsigned int dbargc_default = 1;
-static const char *dbargv_default[] = { "qp" };
+static const char *dbargv_default[] = { ZONEDB_DEFAULT };
#define DNS_ZONE_JITTER_ADD(a, b, c) \
do { \
INSIST(zone->db_argc >= 1);
- rbt = strcmp(zone->db_argv[0], "qp") == 0;
+ rbt = strcmp(zone->db_argv[0], ZONEDB_DEFAULT) == 0;
if (zone->db != NULL && zone->masterfile == NULL && rbt) {
/*
isc_result_t result;
dns_rpz_zone_t *rpz = zone->rpzs->zones[zone->rpz_num];
- CHECK(dns_db_create(zone->mctx, "qp", &zone->origin,
+ CHECK(dns_db_create(zone->mctx, ZONEDB_DEFAULT, &zone->origin,
dns_dbtype_zone, zone->rdclass, 0, NULL,
&db));
CHECK(dns_rpz_dbupdate_callback(db, rpz));
"and 'database'",
znamestr);
result = ISC_R_FAILURE;
- } else if (!dlz && (tresult == ISC_R_NOTFOUND ||
- (tresult == ISC_R_SUCCESS &&
- strcmp("qp", cfg_obj_asstring(obj)) == 0)))
+ } else if (!dlz &&
+ (tresult == ISC_R_NOTFOUND ||
+ (tresult == ISC_R_SUCCESS &&
+ strcmp(ZONEDB_DEFAULT, cfg_obj_asstring(obj)) == 0)))
{
isc_result_t res1;
const cfg_obj_t *fileobj = NULL;
UNUSED(state);
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname,
+ dns_dbtype_zone, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_db_getoriginnode(db, &node);
UNUSED(state);
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_cache,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, CACHEDB_DEFAULT, dns_rootname,
+ dns_dbtype_cache, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
ttl = 5000;
UNUSED(state);
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_cache,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, CACHEDB_DEFAULT, dns_rootname,
+ dns_dbtype_cache, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
example = dns_fixedname_initname(&example_fixed);
UNUSED(state);
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname,
+ dns_dbtype_zone, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_db_load(db, TESTS_DIR "/testdata/db/data.db",
UNUSED(state);
/* DB has zone semantics */
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname,
+ dns_dbtype_zone, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_db_load(db, TESTS_DIR "/testdata/db/data.db",
dns_masterformat_text, 0);
dns_db_detach(&db);
/* DB has cache semantics */
- result = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, CACHEDB_DEFAULT, dns_rootname,
+ dns_dbtype_cache, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
- result = dns_db_load(db, TESTS_DIR "/testdata/db/data.db",
- dns_masterformat_text, 0);
- assert_int_equal(result, ISC_R_SUCCESS);
- assert_false(dns_db_iscache(db));
- assert_true(dns_db_iszone(db));
+ assert_true(dns_db_iscache(db));
+ assert_false(dns_db_iszone(db));
dns_db_detach(&db);
}
isc_assertion_setcallback(local_callback);
- res = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
+ res = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname, dns_dbtype_zone,
dns_rdataclass_in, 0, NULL, &db1);
assert_int_equal(res, ISC_R_SUCCESS);
dns_db_newversion(db1, &v1);
assert_non_null(v1);
- res = dns_db_create(mctx, "qp", dns_rootname, dns_dbtype_zone,
+ res = dns_db_create(mctx, ZONEDB_DEFAULT, dns_rootname, dns_dbtype_zone,
dns_rdataclass_in, 0, NULL, &db2);
assert_int_equal(res, ISC_R_SUCCESS);
dns_db_newversion(db2, &v2);
&target);
assert_int_equal(result, ISC_R_SUCCESS);
- result = dns_db_create(mctx, "qp", &dnsorigin, dns_dbtype_zone,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx, ZONEDB_DEFAULT, &dnsorigin,
+ dns_dbtype_zone, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_dir_chdir(SRCDIR);
isc_mem_create(&mctx2);
- result = dns_db_create(mctx2, "qp", dns_rootname, dns_dbtype_cache,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx2, CACHEDB_DEFAULT, dns_rootname,
+ dns_dbtype_cache, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
isc_mem_setwater(mctx2, hiwater, lowater);
isc_mem_create(&mctx2);
- result = dns_db_create(mctx2, "qp", dns_rootname, dns_dbtype_cache,
- dns_rdataclass_in, 0, NULL, &db);
+ result = dns_db_create(mctx2, CACHEDB_DEFAULT, dns_rootname,
+ dns_dbtype_cache, dns_rdataclass_in, 0, NULL,
+ &db);
assert_int_equal(result, ISC_R_SUCCESS);
isc_mem_setwater(mctx2, hiwater, lowater);
const char *testfile) {
isc_result_t result;
dns_fixedname_t fixed;
- dns_name_t *name;
+ dns_name_t *name = NULL;
+ const char *dbimp = (dbtype == dns_dbtype_zone) ? ZONEDB_DEFAULT
+ : CACHEDB_DEFAULT;
name = dns_fixedname_initname(&fixed);
return (result);
}
- result = dns_db_create(mctx, "qp", name, dbtype, dns_rdataclass_in, 0,
+ result = dns_db_create(mctx, dbimp, name, dbtype, dns_rdataclass_in, 0,
NULL, db);
if (result != ISC_R_SUCCESS) {
return (result);
const char *testfile) {
isc_result_t result;
dns_fixedname_t fixed;
- dns_name_t *name;
+ dns_name_t *name = NULL;
+ const char *dbimp = (dbtype == dns_dbtype_zone) ? ZONEDB_DEFAULT
+ : CACHEDB_DEFAULT;
name = dns_fixedname_initname(&fixed);
return (result);
}
- result = dns_db_create(mctx, "qp", name, dbtype, dns_rdataclass_in, 0,
+ result = dns_db_create(mctx, dbimp, name, dbtype, dns_rdataclass_in, 0,
NULL, db);
if (result != ISC_R_SUCCESS) {
return (result);