Record object ACKs into MOQT traces.
PiperOrigin-RevId: 824650956
diff --git a/quiche/quic/moqt/moqt_integration_test.cc b/quiche/quic/moqt/moqt_integration_test.cc
index fcf84df..8831652 100644
--- a/quiche/quic/moqt/moqt_integration_test.cc
+++ b/quiche/quic/moqt/moqt_integration_test.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include <cstddef>
+#include <cstdint>
#include <memory>
#include <optional>
#include <string>
@@ -44,6 +45,7 @@
using ::quiche::QuicheMemSlice;
using ::testing::_;
using ::testing::Assign;
+using ::testing::ElementsAre;
using ::testing::Return;
class MoqtIntegrationTest : public quiche::test::QuicheTest {
@@ -754,6 +756,15 @@
.WillOnce([&] { done = true; });
bool success = test_harness_.RunUntilWithDefaultTimeout([&] { return done; });
EXPECT_TRUE(success);
+
+ const quic_trace::Trace& trace = *server_->trace_visitor()->trace();
+ std::vector<int64_t> ack_deltas;
+ for (const quic_trace::Event& event : trace.events()) {
+ if (event.event_type() == quic_trace::EventType::MOQT_OBJECT_ACKNOWLEDGED) {
+ ack_deltas.push_back(event.moq_object_ack_time_delta_us());
+ }
+ }
+ EXPECT_THAT(ack_deltas, ElementsAre(-123, 456));
}
TEST_F(MoqtIntegrationTest, DeliveryTimeout) {
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc
index 01b64be..6518125 100644
--- a/quiche/quic/moqt/moqt_session.cc
+++ b/quiche/quic/moqt/moqt_session.cc
@@ -2656,4 +2656,17 @@
stream->GetStreamId());
}
+void MoqtSession::PublishedSubscription::ProcessObjectAck(
+ const MoqtObjectAck& message) {
+ session_->trace_recorder_.RecordObjectAck(
+ track_alias_, Location(message.group_id, message.object_id),
+ message.delta_from_deadline);
+
+ if (monitoring_interface_ == nullptr) {
+ return;
+ }
+ monitoring_interface_->OnObjectAckReceived(
+ message.group_id, message.object_id, message.delta_from_deadline);
+}
+
} // namespace moqt
diff --git a/quiche/quic/moqt/moqt_session.h b/quiche/quic/moqt/moqt_session.h
index db35e5e..8b719ba 100644
--- a/quiche/quic/moqt/moqt_session.h
+++ b/quiche/quic/moqt/moqt_session.h
@@ -381,13 +381,7 @@
void OnSubgroupAbandoned(uint64_t group, uint64_t subgroup,
webtransport::StreamErrorCode error_code) override;
void OnGroupAbandoned(uint64_t group_id) override;
- void ProcessObjectAck(const MoqtObjectAck& message) {
- if (monitoring_interface_ == nullptr) {
- return;
- }
- monitoring_interface_->OnObjectAckReceived(
- message.group_id, message.object_id, message.delta_from_deadline);
- }
+ void ProcessObjectAck(const MoqtObjectAck& message);
// Updates the window and other properties of the subscription in question.
void Update(Location start, std::optional<uint64_t> end,
diff --git a/quiche/quic/moqt/moqt_trace_recorder.cc b/quiche/quic/moqt/moqt_trace_recorder.cc
index 0a503ef..0f8eb6e 100644
--- a/quiche/quic/moqt/moqt_trace_recorder.cc
+++ b/quiche/quic/moqt/moqt_trace_recorder.cc
@@ -7,6 +7,7 @@
#include <cstdint>
#include <optional>
+#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/moqt/moqt_object.h"
#include "quiche/quic/moqt/moqt_priority.h"
@@ -101,4 +102,18 @@
}
}
+void MoqtTraceRecorder::RecordObjectAck(uint64_t track_alias, Location location,
+ quic::QuicTimeDelta ack_delta) {
+ if (parent_ == nullptr) {
+ return;
+ }
+ quic_trace::Event* event = AddEvent();
+ event->set_event_type(EventType::MOQT_OBJECT_ACKNOWLEDGED);
+ event->set_moq_object_ack_time_delta_us(ack_delta.ToMicroseconds());
+ event->mutable_moqt_object()->set_track_alias(track_alias);
+ event->mutable_moqt_object()->set_group_id(location.group);
+ event->mutable_moqt_object()->set_object_id(location.object);
+ parent_->PopulateTransportState(event->mutable_transport_state());
+}
+
} // namespace moqt
diff --git a/quiche/quic/moqt/moqt_trace_recorder.h b/quiche/quic/moqt/moqt_trace_recorder.h
index a40693a..81b5531 100644
--- a/quiche/quic/moqt/moqt_trace_recorder.h
+++ b/quiche/quic/moqt/moqt_trace_recorder.h
@@ -9,6 +9,7 @@
#include <memory>
#include "absl/base/nullability.h"
+#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/core/quic_trace_visitor.h"
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/moqt/moqt_priority.h"
@@ -55,6 +56,10 @@
Location location, uint64_t subgroup,
MoqtPriority publisher_priority);
+ // Records an incoming MOQT Object ACK message.
+ void RecordObjectAck(uint64_t track_alias, Location location,
+ quic::QuicTimeDelta ack_delta);
+
private:
// Adds a new event to the trace, and populates the timestamp.
quic_trace::Event* AddEvent();