};
/* Prepare raw memory for the new entry. */
+ size_t whole_val_len = 0;
ret = entry_h_splice(&val_new_entry, rank, key, k->type, rr->type,
- rr->owner, qry, cache, timestamp);
+ rr->owner, qry, cache, timestamp, &whole_val_len);
if (ret) return kr_ok(); /* some aren't really errors */
if (kr_fails_assert(val_new_entry.data))
return kr_error(EFAULT);
if (kr_fails_assert(entry_h_consistent_E(val_new_entry, rr->type)))
return kr_error(EINVAL);
if (qry) // it's possible to insert outside a request
- kr_cache_top_access(qry->request, key.data, key.len, val_new_entry.len, "stash_rrset");
+ kr_cache_top_access(qry->request, key.data, key.len, whole_val_len, "stash_rrset");
#if 0 /* Occasionally useful when debugging some kinds of changes. */
{
knot_db_val_t *val_new_entry, uint8_t rank,
const knot_db_val_t key, const uint16_t ktype, const uint16_t type,
const knot_dname_t *owner/*log only*/,
- const struct kr_query *qry, struct kr_cache *cache, uint32_t timestamp)
+ const struct kr_query *qry, struct kr_cache *cache, uint32_t timestamp,
+ size_t *cache_record_size_out)
{
//TODO: another review, perhaps including the API
if (kr_fails_assert(val_new_entry && val_new_entry->len > 0))
if (!i_type) {
/* The non-list types are trivial now. */
+ *cache_record_size_out = val_new_entry->len;
return cache_write_or_clear(cache, &key, val_new_entry, qry);
}
/* Now we're in trouble. In some cases, parts of data to be written
};
uint8_t buf[val.len];
entry_list_memcpy((struct entry_apex *)buf, el);
+ *cache_record_size_out = val.len;
ret = cache_write_or_clear(cache, &key, &val, qry);
if (ret) return kr_error(ret);
memcpy(val.data, buf, val.len); /* we also copy the "empty" space, but well... */
};
/* Prepare raw memory for the new entry and fill it. */
struct kr_cache *cache = &req->ctx->cache;
+ size_t whole_val_len = 0;
ret = entry_h_splice(&val_new_entry, rank, key, k->type, pkt_type,
- owner, qry, cache, qry->timestamp.tv_sec);
+ owner, qry, cache, qry->timestamp.tv_sec, &whole_val_len);
if (ret || kr_fails_assert(val_new_entry.data)) return; /* some aren't really errors */
struct entry_h *eh = val_new_entry.data;
memset(eh, 0, offsetof(struct entry_h, data));
eh->has_optout = qf->DNSSEC_OPTOUT;
memcpy(eh->data, &pkt_size, sizeof(pkt_size));
memcpy(eh->data + sizeof(pkt_size), pkt->wire, pkt_size);
- kr_cache_top_access(req, key.data, key.len, val_new_entry.len, "stash_pkt");
+ kr_cache_top_access(req, key.data, key.len, whole_val_len, "stash_pkt");
WITH_VERBOSE(qry) {
auto_free char *type_str = kr_rrtype_text(pkt_type),
* Some checks are performed (rank, TTL), the current entry in cache is copied
* with a hole ready for the new entry (old one of the same type is cut out).
*
- * \param val_new_entry The only changing parameter; ->len is read, ->data written.
+ * \param val_new_entry ->len is read, ->data written.
* \return error code
*/
int entry_h_splice(
knot_db_val_t *val_new_entry, uint8_t rank,
const knot_db_val_t key, const uint16_t ktype, const uint16_t type,
const knot_dname_t *owner/*log only*/,
- const struct kr_query *qry, struct kr_cache *cache, uint32_t timestamp);
+ const struct kr_query *qry, struct kr_cache *cache, uint32_t timestamp,
+ size_t *cache_record_size_out);
/** Parse an entry_apex into individual items. @return error code. */
KR_EXPORT int entry_list_parse(const knot_db_val_t val, entry_list_t list);
knot_db_val_t key = key_exact_type_maypkt(k, qry->stype);
knot_db_val_t val = { NULL, 0 };
ret = cache_op(cache, read, &key, &val, 1);
+ size_t whole_val_len = val.len;
if (!ret) {
/* found an entry: test conditions, materialize into pkt, etc. */
ret = found_exact_hit(qry, pkt, val, lowest_rank);
}
if (!ret) {
- kr_cache_top_access(req, key.data, key.len, val.len, "peek_nosync:exact"); // hits only
+ kr_cache_top_access(req, key.data, key.len, whole_val_len, "peek_nosync:exact"); // hits only
return KR_STATE_DONE;
} else if (kr_fails_assert(ret == kr_error(ENOENT))) {
VERBOSE_MSG(qry, "=> exact hit error: %d %s\n", ret, kr_strerror(ret));