in src/router_core/delivery.c [351:435]
void qdr_delivery_increment_counters_CT(qdr_core_t *core, qdr_delivery_t *delivery)
{
qdr_link_t *link = qdr_delivery_link(delivery);
if (link) {
bool do_rate = false;
// router sets the disposition for incoming links, outgoing is set by
// the remote
const uint64_t outcome = (link->link_direction == QD_INCOMING)
? delivery->disposition // local
: delivery->remote_disposition;
if (delivery->presettled) {
do_rate = outcome != PN_RELEASED;
link->presettled_deliveries++;
if (link->link_direction == QD_INCOMING && link->link_type == QD_LINK_ENDPOINT)
core->presettled_deliveries++;
}
else if (outcome == PN_ACCEPTED) {
do_rate = true;
link->accepted_deliveries++;
if (link->link_direction == QD_INCOMING)
core->accepted_deliveries++;
}
else if (outcome == PN_REJECTED) {
do_rate = true;
link->rejected_deliveries++;
if (link->link_direction == QD_INCOMING)
core->rejected_deliveries++;
}
else if (outcome == PN_RELEASED && !delivery->presettled) {
link->released_deliveries++;
if (link->link_direction == QD_INCOMING)
core->released_deliveries++;
}
else if (outcome == PN_MODIFIED) {
link->modified_deliveries++;
if (link->link_direction == QD_INCOMING)
core->modified_deliveries++;
}
qd_log(core->log, QD_LOG_DEBUG,DLV_FMT" Delivery outcome %s: is %s (0x%"PRIX64")",
DLV_ARGS(delivery), delivery->presettled ? "pre-settled" : "",
pn_disposition_type_name(outcome), outcome);
uint32_t delay = qdr_core_uptime_ticks(core) - delivery->ingress_time;
if (delay > 10) {
link->deliveries_delayed_10sec++;
if (link->link_direction == QD_INCOMING)
core->deliveries_delayed_10sec++;
} else if (delay > 1) {
link->deliveries_delayed_1sec++;
if (link->link_direction == QD_INCOMING)
core->deliveries_delayed_1sec++;
}
//
// If this delivery was marked as stuck, decrement the currently-stuck counters in the link and router.
//
if (delivery->stuck) {
link->deliveries_stuck--;
core->deliveries_stuck--;
}
if (qd_bitmask_valid_bit_value(delivery->ingress_index) && link->ingress_histogram)
link->ingress_histogram[delivery->ingress_index]++;
//
// Compute the settlement rate
//
if (do_rate) {
uint32_t delta_time = qdr_core_uptime_ticks(core) - link->core_ticks;
if (delta_time > 0) {
if (delta_time > QDR_LINK_RATE_DEPTH)
delta_time = QDR_LINK_RATE_DEPTH;
for (uint8_t delta_slots = 0; delta_slots < delta_time; delta_slots++) {
link->rate_cursor = (link->rate_cursor + 1) % QDR_LINK_RATE_DEPTH;
link->settled_deliveries[link->rate_cursor] = 0;
}
link->core_ticks = qdr_core_uptime_ticks(core);
}
link->settled_deliveries[link->rate_cursor]++;
}
}
}