diff --git a/quic/api/test/QuicTransportFunctionsTest.cpp b/quic/api/test/QuicTransportFunctionsTest.cpp index 37202bd54..a8be26edd 100644 --- a/quic/api/test/QuicTransportFunctionsTest.cpp +++ b/quic/api/test/QuicTransportFunctionsTest.cpp @@ -1683,7 +1683,7 @@ TEST_F(QuicTransportFunctionsTest, TestStreamDetailsControlPacket) { ASSERT_EQ(1, conn->outstandings.packets.size()); const auto& detailsPerStream = getFirstOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(0, detailsPerStream.size()); } @@ -1707,9 +1707,9 @@ TEST_F(QuicTransportFunctionsTest, TestStreamDetailsAppDataPacketSingleStream) { ASSERT_EQ(1, conn->outstandings.packets.size()); auto detailsPerStream = getFirstOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(1, detailsPerStream.size()); - auto streamDetail = detailsPerStream[stream->id]; + auto streamDetail = detailsPerStream.at(stream->id); EXPECT_EQ(false, streamDetail.finObserved); EXPECT_EQ(10, streamDetail.streamBytesSent); EXPECT_EQ(10, streamDetail.newStreamBytesSent); @@ -1742,9 +1742,9 @@ TEST_F( ASSERT_EQ(1, conn->outstandings.packets.size()); auto detailsPerStream = getFirstOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(1, detailsPerStream.size()); - auto streamDetail = detailsPerStream[stream->id]; + auto streamDetail = detailsPerStream.at(stream->id); EXPECT_EQ(true, streamDetail.finObserved); EXPECT_EQ(15, streamDetail.streamBytesSent); EXPECT_EQ(15, streamDetail.newStreamBytesSent); @@ -1777,9 +1777,9 @@ TEST_F( // The first outstanding packet is the one with new data auto detailsPerStream = getFirstOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(1, detailsPerStream.size()); - auto streamDetail = detailsPerStream[stream->id]; + auto streamDetail = detailsPerStream.at(stream->id); EXPECT_EQ(false, streamDetail.finObserved); EXPECT_EQ(frame1Len, streamDetail.streamBytesSent); EXPECT_EQ(frame1Len, streamDetail.newStreamBytesSent); @@ -1801,9 +1801,9 @@ TEST_F( // The second outstanding packet is the one with retransmit data detailsPerStream = getLastOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(1, detailsPerStream.size()); - streamDetail = detailsPerStream[stream->id]; + streamDetail = detailsPerStream.at(stream->id); EXPECT_EQ(false, streamDetail.finObserved); EXPECT_EQ(frame1Len, streamDetail.streamBytesSent); EXPECT_EQ(0, streamDetail.newStreamBytesSent); @@ -1831,9 +1831,9 @@ TEST_F( // The third outstanding packet will have both new and retransmitted data. detailsPerStream = getLastOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(1, detailsPerStream.size()); - streamDetail = detailsPerStream[stream->id]; + streamDetail = detailsPerStream.at(stream->id); EXPECT_EQ(false, streamDetail.finObserved); EXPECT_EQ(frame1Len + frame2Len, streamDetail.streamBytesSent); EXPECT_EQ(frame2Len, streamDetail.newStreamBytesSent); @@ -1856,9 +1856,9 @@ TEST_F( // The forth outstanding packet will have only retransmit data. detailsPerStream = getLastOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(1, detailsPerStream.size()); - streamDetail = detailsPerStream[stream->id]; + streamDetail = detailsPerStream.at(stream->id); EXPECT_EQ(false, streamDetail.finObserved); EXPECT_EQ(frame1Len + frame2Len, streamDetail.streamBytesSent); EXPECT_EQ(0, streamDetail.newStreamBytesSent); @@ -1900,10 +1900,10 @@ TEST_F( ASSERT_EQ(1, conn->outstandings.packets.size()); auto detailsPerStream = getFirstOutstandingPacket(*conn, PacketNumberSpace::AppData) - ->metadata.detailsPerStream.getDetails(); + ->metadata.detailsPerStream; EXPECT_EQ(2, detailsPerStream.size()); - auto stream1Detail = detailsPerStream[stream1Id]; - auto stream2Detail = detailsPerStream[stream2Id]; + auto stream1Detail = detailsPerStream.at(stream1Id); + auto stream2Detail = detailsPerStream.at(stream2Id); EXPECT_EQ(false, stream1Detail.finObserved); EXPECT_EQ(5, stream1Detail.streamBytesSent); diff --git a/quic/state/OutstandingPacket.h b/quic/state/OutstandingPacket.h index 8dc4c9adf..98858eedd 100644 --- a/quic/state/OutstandingPacket.h +++ b/quic/state/OutstandingPacket.h @@ -45,23 +45,22 @@ struct OutstandingPacketMetadata { // tracks the number of writes on this socket. uint64_t writeCount{0}; - // Structure used to hold information about each stream with frames in packet - class DetailsPerStream { + struct StreamDetails { + template + using IntervalSetVec = SmallVec; + using StreamIntervals = IntervalSet; + StreamIntervals streamIntervals; + + bool finObserved{false}; + uint64_t streamBytesSent{0}; + uint64_t newStreamBytesSent{0}; + folly::Optional maybeFirstNewStreamByteOffset; + }; + + class DetailsPerStream : private folly::F14FastMap { public: - struct StreamDetails { - template - using IntervalSetVec = SmallVec; - using StreamIntervals = IntervalSet; - StreamIntervals streamIntervals; - - bool finObserved{false}; - uint64_t streamBytesSent{0}; - uint64_t newStreamBytesSent{0}; - folly::Optional maybeFirstNewStreamByteOffset; - }; - void addFrame(const WriteStreamFrame& frame, const bool newData) { - auto ret = detailsPerStream.emplace( + auto ret = emplace( std::piecewise_construct, std::make_tuple(frame.streamId), std::make_tuple()); @@ -87,13 +86,26 @@ struct OutstandingPacketMetadata { } } - FOLLY_NODISCARD const folly::F14FastMap& - getDetails() const { - return detailsPerStream; + [[nodiscard]] auto at(StreamId id) const { + return folly::F14FastMap::at(id); } - private: - folly::F14FastMap detailsPerStream; + [[nodiscard]] auto begin() const { + return cbegin(); + } + + [[nodiscard]] auto end() const { + return cend(); + } + + using folly::F14FastMap::cbegin; + using folly::F14FastMap::cend; + using folly::F14FastMap::const_iterator; + using folly::F14FastMap::empty; + using folly::F14FastMap::find; + using folly::F14FastMap::mapped_type; + using folly::F14FastMap::size; + using folly::F14FastMap::value_type; }; // Details about each stream with frames in this packet