#include <dns/rdatatype.h>
#include <dns/stats.h>
#include <dns/time.h>
+#include <dns/types.h>
#include <dns/view.h>
#include "db_p.h"
mark(dns_slabheader_t *header, uint_least16_t flag) {
uint_least16_t attributes = atomic_load_acquire(&header->attributes);
uint_least16_t newattributes = 0;
+ qpcache_t *qpdb = HEADERNODE(header)->qpdb;
dns_stats_t *stats = NULL;
- qpcache_t *qpdb = HEADERNODE(header)->qpdb;
/*
* If we are already ancient there is nothing to do.
*/
* RRtype.
*/
stats = dns_db_getrrsetstats(&qpdb->common);
- if (stats != NULL) {
- update_rrsetstats(stats, header->typepair, attributes, false);
- update_rrsetstats(stats, header->typepair, newattributes, true);
- }
+ update_rrsetstats(stats, header->typepair, attributes, false);
+ update_rrsetstats(stats, header->typepair, newattributes, true);
}
static void
* The NXDOMAIN/NODATA(QTYPE=ANY)
* is more trusted.
*/
- dns_slabheader_destroy(&newheader);
if (addedrdataset != NULL) {
bindrdataset(
qpdb, qpnode, topheader,
* Deleting an already non-existent rdataset has no effect.
*/
if (!EXISTS(header) && !EXISTS(newheader)) {
- dns_slabheader_destroy(&newheader);
return DNS_R_UNCHANGED;
}
if (trust < header->trust &&
(ACTIVE(header, now) || !EXISTS(header)))
{
- dns_slabheader_destroy(&newheader);
if (addedrdataset != NULL) {
bindrdataset(qpdb, qpnode, header, now,
nlocktype, tlocktype,
header->closest = newheader->closest;
newheader->closest = NULL;
}
- dns_slabheader_destroy(&newheader);
if (addedrdataset != NULL) {
bindrdataset(qpdb, qpnode, header, now,
nlocktype, tlocktype,
addedrdataset DNS__DB_FLARG_PASS);
}
- return ISC_R_SUCCESS;
+ return DNS_R_UNCHANGED;
}
/*
header->closest = newheader->closest;
newheader->closest = NULL;
}
- dns_slabheader_destroy(&newheader);
if (addedrdataset != NULL) {
bindrdataset(qpdb, qpnode, header, now,
nlocktype, tlocktype,
addedrdataset DNS__DB_FLARG_PASS);
}
- return ISC_R_SUCCESS;
+ return DNS_R_UNCHANGED;
}
qpcache_miss(qpdb, newheader, &nlocktype,
* The type already doesn't exist; no point trying
* to delete it.
*/
- dns_slabheader_destroy(&newheader);
return DNS_R_UNCHANGED;
} else {
/* No rdatasets of the given type exist at the node. */
result = addnoqname(qpnode->mctx, newheader, qpdb->maxrrperset,
rdataset);
if (result != ISC_R_SUCCESS) {
- dns_slabheader_destroy(&newheader);
return result;
}
}
result = addclosest(qpnode->mctx, newheader, qpdb->maxrrperset,
rdataset);
if (result != ISC_R_SUCCESS) {
- dns_slabheader_destroy(&newheader);
return result;
}
}
result = add(qpdb, qpnode, name, newheader, options, addedrdataset, now,
nlocktype, tlocktype DNS__DB_FLARG_PASS);
- if (result == ISC_R_SUCCESS && delegating) {
- qpnode->delegating = 1;
+ if (result == ISC_R_SUCCESS) {
+ if (delegating) {
+ qpnode->delegating = 1;
+ }
+ } else {
+ dns_slabheader_destroy(&newheader);
}
NODE_UNLOCK(nlock, &nlocktype);
NODE_WRLOCK(nlock, &nlocktype);
result = add(qpdb, qpnode, NULL, newheader, DNS_DBADD_FORCE, NULL, 0,
nlocktype, isc_rwlocktype_none DNS__DB_FLARG_PASS);
+ if (result != ISC_R_SUCCESS) {
+ dns_slabheader_destroy(&newheader);
+ }
NODE_UNLOCK(nlock, &nlocktype);
return result;