diff --git a/tests/test_etcp_multipath.c b/tests/test_etcp_multipath.c index e971dae0..c4d40405 100644 --- a/tests/test_etcp_multipath.c +++ b/tests/test_etcp_multipath.c @@ -106,6 +106,8 @@ struct diagnostic_sample { unsigned unacked, budget, flight, attempts, cwnd, pace, mode, cycle, min_rtt, rtt, jitter, rto, bw, queue_cap; unsigned ack_count, ack_timer, ack_till, urgent_ack, pacer_timer, burst, stalled, rto_streak; unsigned channel_pending, channel_peak; + unsigned app_suspended, app_resume, fragment_suspended, fragment_resume, waiter_deferred; + unsigned tx_state, tx_scheduled, tx_delayed, tx_running, active_attempts, next_seq, peer_till, local_till; uint64_t channel_delay_max_us; int64_t debt_us; struct diagnostic_interval stats; @@ -166,7 +168,13 @@ static void diagnostic_snapshot(const char* phase) { for (struct ll_entry* e = c->input_send_q->head; e; e = e->next) if (((struct INFLIGHT_PACKET*)e)->last_attempt_id) s->retries++; else s->fresh++; s->normalizer_bytes = pn->data_ptr; s->normalizer_waiter = !!pn->input_waiter_handle.internal; + s->waiter_deferred = !!pn->input_waiter_handle.call_soon_id; s->normalizer_flush = !!pn->flush_timer; s->pending_bytes = pn->pending ? pn->pending->len - pn->pending_in_ptr : 0; + s->app_suspended = !!c->send_input_q->callback_suspended; s->app_resume = !!c->send_input_q->resume_timeout_id; + s->fragment_suspended = !!c->input_queue->callback_suspended; s->fragment_resume = !!c->input_queue->resume_timeout_id; + s->tx_state = c->tx_state; s->tx_scheduled = c->tx_token != NULL; s->tx_delayed = c->tx_delayed; + s->tx_running = c->tx_running; s->active_attempts = c->active_attempts; + s->next_seq = c->next_tx_id; s->peer_till = c->rx_ack_till; s->local_till = c->last_delivered_id; s->unacked = c->unacked_bytes; s->budget = c->optimal_inflight; s->flight = l->inflight_bytes; s->attempts = l->inflight_packets; s->cwnd = l->inflight_lim_bytes; s->pace = l->bbr_pacing_rate; s->mode = l->bbr->mode; s->cycle = l->bbr->cycle_idx; s->min_rtt = l->bbr->min_rtt_us; @@ -222,15 +230,18 @@ static void diagnostic_flush(void) { (unsigned long long)d->ack_delay_sum, (unsigned long long)d->ack_delay_max, (unsigned long long)d->early_ack_entries, (unsigned long long)d->control_packets, (unsigned long long)d->samples, (unsigned long long)d->limited, (unsigned long long)d->app_limited, (unsigned long long)d->rtt_min, (unsigned long long)d->rtt_max) > 0); - CHECK(fprintf(diagnostic_file, ",%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%u,%u,%u,%u,%u,%u,%lld,%lld\n", + CHECK(fprintf(diagnostic_file, ",%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%u,%u,%u,%u,%u,%u,%lld,%lld", (unsigned long long)d->ack_only_entries, (unsigned long long)d->ack_only_delay_sum, (unsigned long long)d->rtt_sum, (unsigned long long)d->rtt_samples, (unsigned long long)d->searches, (unsigned long long)d->window_blocked, (unsigned long long)d->pacer_blocked, (unsigned long long)d->observations, d->flight_min, d->flight_max, d->cwnd_min, d->cwnd_max, d->send_max, d->ack_max, (long long)d->debt_min_us, (long long)d->debt_max_us) > 0); + CHECK(fprintf(diagnostic_file, ",%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u\n", s->app_suspended, s->app_resume, + s->fragment_suspended, s->fragment_resume, s->waiter_deferred, s->tx_state, s->tx_scheduled, s->tx_delayed, + s->tx_running, s->active_attempts, s->next_seq, s->peer_till, s->local_till) > 0); DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "MPATH %s mask=%x %s t_ms=%llu dt_us=%llu side=%u path=%u " "Q_app=%u Q_fragment=%u Q_send=%u(new=%u retry=%u) Q_ACK=%u age_us=%llu flight=%u/%u " - "pace_Bps=%u debt_us=%lld ready_us=%llu timer=%u window_wait=%llu pacer_wait=%llu " + "pace_Bps=%u debt_us=%lld ready_us=%llu timer=%u window_blocked_checks=%llu pacer_blocked_checks=%llu " "channel_pending=%u mode=%u/%u DATA_B=%llu ACKonly=%llu early_ACK=%llu", case_name, enabled_mask, s->phase, (unsigned long long)(s->time_us/1000), (unsigned long long)s->interval_us, s->side, s->path, s->queue_count[0], s->queue_count[1], s->queue_count[2], s->fresh, s->retries, @@ -821,7 +832,9 @@ int main(int argc, char** argv) { "ack_delay_sum_us,ack_delay_max_us,early_ordinary_ack_entries,control_packets,bbr_samples,cwnd_limited_samples," "app_limited_samples,rtt_min_us,rtt_max_us,ack_only_entries,ack_only_delay_sum_us,rtt_sum_us,rtt_samples," "selection_checks,selection_window_blocked,selection_pacer_blocked,observed_states,flight_min,flight_max," - "cwnd_min,cwnd_max,send_peak_observed,ack_peak_observed,debt_min_us,debt_max_us\n") > 0); + "cwnd_min,cwnd_max,send_peak_observed,ack_peak_observed,debt_min_us,debt_max_us,app_callback_suspended," + "app_resume_scheduled,fragment_callback_suspended,fragment_resume_scheduled,normalizer_waiter_deferred," + "tx_state,tx_scheduled,tx_delayed,tx_running,active_attempts,next_tx_seq,peer_ack_till,local_delivered_till\n") > 0); debug_set_category_level(DEBUG_CATEGORY_DEBUG, DEBUG_LEVEL_INFO); DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "Multipath diagnostics: period_us=%u file=%s; snapshots buffered until drain", diagnostic_period_us, detail);