From 43aea02df6cf0d3a606cc201ed09db61b5bad26c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Vavru=C5=A1a?= Date: Thu, 4 Jun 2015 00:42:06 +0200 Subject: [PATCH] lib/cache: improve cache materialization --- lib/cache.c | 35 +++++++++++++++++------------------ lib/cache.h | 5 +++-- lib/layer/rrcache.c | 14 ++++++++------ 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/cache.c b/lib/cache.c index 9f639d6d0..b5df16282 100644 --- a/lib/cache.c +++ b/lib/cache.c @@ -241,35 +241,34 @@ int kr_cache_peek_rr(struct kr_cache_txn *txn, knot_rrset_t *rr, uint32_t *times return kr_error(ENOENT); } -knot_rrset_t kr_cache_materialize(const knot_rrset_t *src, uint32_t drift, mm_ctx_t *mm) +int kr_cache_materialize(knot_rrset_t *dst, const knot_rrset_t *src, uint32_t drift, mm_ctx_t *mm) { assert(src); - /* Make RRSet copy. */ - knot_rrset_t copy; - knot_rrset_init(©, NULL, src->type, src->rclass); - copy.owner = knot_dname_copy(src->owner, mm); - if (!copy.owner) { - return copy; + /* Make RRSet copy */ + knot_rrset_init(dst, NULL, src->type, src->rclass); + dst->owner = knot_dname_copy(src->owner, mm); + if (!dst->owner) { + return kr_error(ENOMEM); } + knot_rdata_t *rd = knot_rdataset_at(&src->rrs, 0); + knot_rdata_t *rd_dst = NULL; for (uint16_t i = 0; i < src->rrs.rr_count; ++i) { - knot_rdata_t *rd = knot_rdataset_at(&src->rrs, i); if (knot_rdata_ttl(rd) > drift) { - if (knot_rdataset_add(©.rrs, rd, mm) != 0) { - knot_rrset_clear(©, mm); - return copy; + /* Append record */ + if (knot_rdataset_add(&dst->rrs, rd, mm) != 0) { + knot_rrset_clear(dst, mm); + return kr_error(ENOMEM); } + /* Fixup TTL from absolute time */ + rd_dst = knot_rdataset_at(&dst->rrs, dst->rrs.rr_count - 1); + knot_rdata_set_ttl(rd_dst, knot_rdata_ttl(rd) - drift); } + rd += knot_rdata_array_size(knot_rdata_rdlen(rd)); } - /* Update TTLs. */ - for (uint16_t i = 0; i < copy.rrs.rr_count; ++i) { - knot_rdata_t *rd = knot_rdataset_at(©.rrs, i); - knot_rdata_set_ttl(rd, knot_rdata_ttl(rd) - drift); - } - - return copy; + return kr_ok(); } int kr_cache_insert_rr(struct kr_cache_txn *txn, const knot_rrset_t *rr, uint32_t timestamp) diff --git a/lib/cache.h b/lib/cache.h index 1b7c48526..9981aba4f 100644 --- a/lib/cache.h +++ b/lib/cache.h @@ -165,12 +165,13 @@ int kr_cache_peek_rr(struct kr_cache_txn *txn, knot_rrset_t *rr, uint32_t *times /** * Clone read-only RRSet and adjust TTLs. + * @param dst destination for materialized RRSet * @param src read-only RRSet (its rdataset may be changed depending on the result) * @param drift time passed between cache time and now * @param mm memory context - * @return materialized (or empty) RRSet + * @return 0 or an errcode */ -knot_rrset_t kr_cache_materialize(const knot_rrset_t *src, uint32_t drift, mm_ctx_t *mm); +int kr_cache_materialize(knot_rrset_t *dst, const knot_rrset_t *src, uint32_t drift, mm_ctx_t *mm); /** * Insert RRSet into cache, replacing any existing data. diff --git a/lib/layer/rrcache.c b/lib/layer/rrcache.c index 1557bca36..1618029c6 100644 --- a/lib/layer/rrcache.c +++ b/lib/layer/rrcache.c @@ -54,13 +54,15 @@ static int loot_rr(struct kr_cache_txn *txn, knot_pkt_t *pkt, const knot_dname_t } /* Update packet answer */ - knot_rrset_t rr_copy = kr_cache_materialize(&cache_rr, timestamp, &pkt->mm); - ret = knot_pkt_put(pkt, KNOT_COMPR_HINT_NONE, &rr_copy, KNOT_PF_FREE); - if (ret != 0) { - knot_rrset_clear(&rr_copy, &pkt->mm); - return ret; + knot_rrset_t rr_copy; + ret = kr_cache_materialize(&rr_copy, &cache_rr, timestamp, &pkt->mm); + if (ret == 0) { + ret = knot_pkt_put(pkt, KNOT_COMPR_HINT_QNAME, &rr_copy, KNOT_PF_FREE); + if (ret != 0) { + knot_rrset_clear(&rr_copy, &pkt->mm); + } } - return kr_ok(); + return ret; } static int loot_cache_set(struct kr_cache_txn *txn, knot_pkt_t *pkt, const knot_dname_t *qname, -- 2.47.3