1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-22 16:02:34 +03:00

Convert IntervalSet from throwing exceptions to using CHECKs with Expected error handling

Summary:
This commit converts IntervalSet to use CHECKs instead of throwing exceptions and provides safe tryInsert methods that return quic::Expected for error handling.

**Core Problem Solved:**
IntervalSet was throwing `std::invalid_argument` exceptions in two scenarios:
1. When constructing an Interval with `start > end`
2. When interval bounds exceed the maximum allowed value

This change eliminates exceptions in favor of CHECKs (for internal validation) and Expected-based error handling (for caller validation).

**Implementation Details:**

**1. IntervalSet Core Changes:**
- Replaced `throw std::invalid_argument` with `CHECK_LE` in Interval constructor
- Replaced `throw std::invalid_argument` with `CHECK_LE` in `insert(start, end)`
- Added `IntervalSetError` enum for error classification
- Added `folly::Expected` include

**2. Safe API Layer:**
- Added `tryInsert(interval)` method returning `Expected<Unit, IntervalSetError>`
- Added `tryInsert(start, end)` method with pre-validation
- Added `tryInsert(point)` method
- Added static `Interval::tryCreate()` method for safe interval construction

**3. Updated  Code:**
- **QuicWriteCodec.cpp**: Updated `fillFrameWithPacketReceiveTimestamps` to use `tryInsert`
  - Returns `QuicError` if interval validation fails
  - Maintains existing error handling patterns
- **QuicTransportFunctions.cpp**: Updated `implicitAckCryptoStream` to use `tryInsert`
  - Logs errors and continues processing other packets
  - Robust error handling for crypto stream implicit acks

Reviewed By: kvtsoy

Differential Revision: D76792362

fbshipit-source-id: 5bd7c22e69a91d60cc41c603a1f2380893f4c8a0
This commit is contained in:
Matt Joras
2025-08-19 10:47:24 -07:00
committed by Facebook GitHub Bot
parent 8f8be8d5d0
commit d3e8fe246a
19 changed files with 262 additions and 51 deletions

View File

@@ -703,7 +703,7 @@ TEST(StreamDataTest, AllBytesAckedTillNotStartAtZero) {
QuicStreamState state(0, qcsb);
EXPECT_TRUE(state.ackedIntervals.empty());
state.updateAckedIntervals(1, 5, false);
ASSERT_TRUE(state.updateAckedIntervals(1, 5, false).has_value());
EXPECT_EQ(state.allBytesAckedTill(5), false);
}
@@ -712,7 +712,7 @@ TEST(StreamDataTest, AllBytesAckedTillNotEnoughLength) {
QuicStreamState state(0, qcsb);
EXPECT_TRUE(state.ackedIntervals.empty());
state.updateAckedIntervals(0, 5, false);
ASSERT_TRUE(state.updateAckedIntervals(0, 5, false).has_value());
EXPECT_EQ(state.allBytesAckedTill(5), false);
}
@@ -721,7 +721,7 @@ TEST(StreamDataTest, AllBytesAckedPass) {
QuicStreamState state(0, qcsb);
EXPECT_TRUE(state.ackedIntervals.empty());
state.updateAckedIntervals(0, 6, false);
ASSERT_TRUE(state.updateAckedIntervals(0, 6, false).has_value());
EXPECT_EQ(state.allBytesAckedTill(5), true);
}
@@ -730,8 +730,8 @@ TEST(StreamDataTest, AllBytesAckedDisjointIntervals) {
QuicStreamState state(0, qcsb);
EXPECT_TRUE(state.ackedIntervals.empty());
state.updateAckedIntervals(0, 2, false);
state.updateAckedIntervals(3, 5, false);
ASSERT_TRUE(state.updateAckedIntervals(0, 2, false).has_value());
ASSERT_TRUE(state.updateAckedIntervals(3, 5, false).has_value());
EXPECT_EQ(state.allBytesAckedTill(5), false);
}