diff --git a/quic/api/QuicTransportBaseLite.cpp b/quic/api/QuicTransportBaseLite.cpp index 87401e14f..a423846e3 100644 --- a/quic/api/QuicTransportBaseLite.cpp +++ b/quic/api/QuicTransportBaseLite.cpp @@ -430,12 +430,7 @@ folly::Expected QuicTransportBaseLite::resetStream( // Invoke state machine sendRstSMHandler(*stream, errorCode); - for (auto pendingResetIt = conn_->pendingEvents.resets.begin(); - closeState_ == CloseState::OPEN && - pendingResetIt != conn_->pendingEvents.resets.end(); - pendingResetIt++) { - cancelByteEventCallbacksForStream(pendingResetIt->first); - } + cancelByteEventCallbacksForStream(id); pendingWriteCallbacks_.erase(id); QUIC_STATS(conn_->statsCallback, onQuicStreamReset, errorCode); } catch (const QuicTransportException& ex) { diff --git a/quic/api/test/QuicTransportBaseTest.cpp b/quic/api/test/QuicTransportBaseTest.cpp index a8a547474..71d68a63c 100644 --- a/quic/api/test/QuicTransportBaseTest.cpp +++ b/quic/api/test/QuicTransportBaseTest.cpp @@ -3091,6 +3091,29 @@ TEST_P(QuicTransportImplTestBase, TestGracefulCloseWithNoActiveStream) { .hasError()); } +TEST_P(QuicTransportImplTestBase, TestResetRemovesDeliveryCb) { + auto stream1 = transport->createBidirectionalStream().value(); + auto stream2 = transport->createBidirectionalStream().value(); + NiceMock deliveryCb1; + NiceMock deliveryCb2; + EXPECT_CALL(*socketPtr, write(_, _, _)) + .WillRepeatedly(SetErrnoAndReturn(EAGAIN, -1)); + transport->writeChain(stream1, IOBuf::copyBuffer("hello"), true, nullptr); + transport->writeChain(stream2, IOBuf::copyBuffer("hello"), true, nullptr); + EXPECT_FALSE( + transport->registerDeliveryCallback(stream1, 2, &deliveryCb1).hasError()); + EXPECT_FALSE( + transport->registerDeliveryCallback(stream2, 2, &deliveryCb2).hasError()); + EXPECT_EQ(transport->getNumByteEventCallbacksForStream(stream1), 1); + EXPECT_EQ(transport->getNumByteEventCallbacksForStream(stream2), 1); + EXPECT_FALSE( + transport->resetStream(stream1, GenericApplicationErrorCode::UNKNOWN) + .hasError()); + EXPECT_EQ(transport->getNumByteEventCallbacksForStream(stream1), 0); + EXPECT_EQ(transport->getNumByteEventCallbacksForStream(stream2), 1); + transport->close(none); +} + TEST_P(QuicTransportImplTestBase, TestImmediateClose) { auto stream = transport->createBidirectionalStream().value(); auto stream2 = transport->createBidirectionalStream().value();