Move cansendstreamdata() from quicconnection to quicsession. no functional change, not flag protected. PiperOrigin-RevId: 312172952 Change-Id: I1bcff4cf48ca8f0e895e99ea76e90bfa911e0e62
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index d692913..b647916 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -3177,22 +3177,6 @@ packet_creator_.HasPendingFrames() || !buffered_packets_.empty(); } -bool QuicConnection::CanWriteStreamData() { - // Don't write stream data if there are negotiation or queued data packets - // to send. Otherwise, continue and bundle as many frames as possible. - if (pending_version_negotiation_packet_ || !buffered_packets_.empty()) { - return false; - } - - IsHandshake pending_handshake = - visitor_->HasPendingHandshake() ? IS_HANDSHAKE : NOT_HANDSHAKE; - // Sending queued packets may have caused the socket to become write blocked, - // or the congestion manager to prohibit sending. If we've sent everything - // we had queued and we're still not blocked, let the visitor know it can - // write more. - return ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, pending_handshake); -} - void QuicConnection::SetNetworkTimeouts(QuicTime::Delta handshake_timeout, QuicTime::Delta idle_timeout) { QUIC_BUG_IF(idle_timeout > handshake_timeout)
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h index f931567e..0f8f997 100644 --- a/quic/core/quic_connection.h +++ b/quic/core/quic_connection.h
@@ -158,9 +158,6 @@ // or yielded to other connections. virtual bool WillingAndAbleToWrite() const = 0; - // Called to ask if any handshake messages are pending in this visitor. - virtual bool HasPendingHandshake() const = 0; - // Called to ask if the connection should be kept alive and prevented // from timing out, for example if there are outstanding application // transactions expecting a response. @@ -672,14 +669,10 @@ return server_supported_versions_; } - // Testing only. + bool HasQueuedPackets() const { return !buffered_packets_.empty(); } + // Testing only. TODO(ianswett): Use a peer instead. size_t NumQueuedPackets() const { return buffered_packets_.size(); } - // Returns true if the underlying UDP socket is writable, there is - // no queued data and the connection is not congestion-control - // blocked. - bool CanWriteStreamData(); - // Returns true if the connection has queued packets or frames. bool HasQueuedData() const;
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc index 2e48f49..c53b730 100644 --- a/quic/core/quic_connection_test.cc +++ b/quic/core/quic_connection_test.cc
@@ -740,7 +740,7 @@ // Ensures the connection can write stream data before writing. QuicConsumedData EnsureWritableAndSendStreamData5() { - EXPECT_TRUE(CanWriteStreamData()); + EXPECT_TRUE(CanWrite(HAS_RETRANSMITTABLE_DATA)); return SendStreamData5(); } @@ -1092,7 +1092,6 @@ EXPECT_CALL(*send_algorithm_, OnApplicationLimited(_)).Times(AnyNumber()); EXPECT_CALL(visitor_, WillingAndAbleToWrite()).Times(AnyNumber()); EXPECT_CALL(visitor_, OnPacketDecrypted(_)).Times(AnyNumber()); - EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); EXPECT_CALL(visitor_, OnCanWrite()) .WillRepeatedly(Invoke(¬ifier_, &SimpleSessionNotifier::OnCanWrite)); EXPECT_CALL(visitor_, ShouldKeepConnectionAlive()) @@ -7226,7 +7225,7 @@ connection_.CloseConnection(QUIC_PEER_GOING_AWAY, "no reason", ConnectionCloseBehavior::SILENT_CLOSE); EXPECT_FALSE(connection_.connected()); - EXPECT_FALSE(connection_.CanWriteStreamData()); + EXPECT_FALSE(connection_.CanWrite(HAS_RETRANSMITTABLE_DATA)); std::unique_ptr<QuicPacket> packet = ConstructDataPacket(1, !kHasStopWaiting, ENCRYPTION_INITIAL); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(1), _, _)) @@ -7250,7 +7249,7 @@ connection_.CloseConnection(QUIC_PEER_GOING_AWAY, "no reason", ConnectionCloseBehavior::SILENT_CLOSE); EXPECT_FALSE(connection_.connected()); - EXPECT_FALSE(connection_.CanWriteStreamData()); + EXPECT_FALSE(connection_.CanWrite(HAS_RETRANSMITTABLE_DATA)); EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(1), _, _)) .Times(0);
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index 033495f..32ada39 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -619,7 +619,7 @@ ConnectionCloseBehavior::SILENT_CLOSE); return; } - if (!connection_->CanWriteStreamData()) { + if (!CanWriteStreamData()) { return; } currently_writing_stream_id_ = write_blocked_streams_.PopFront(); @@ -2279,6 +2279,18 @@ return QuicUtils::GenerateStatelessResetToken(connection_->connection_id()); } +bool QuicSession::CanWriteStreamData() const { + // Don't write stream data if there are queued data packets. + if (connection_->HasQueuedPackets()) { + return false; + } + // Immediately write handshake data. + if (HasPendingHandshake()) { + return true; + } + return connection_->CanWrite(HAS_RETRANSMITTABLE_DATA); +} + bool QuicSession::RetransmitLostData() { QuicConnection::ScopedPacketFlusher retransmission_flusher(connection_); // Retransmit crypto data first. @@ -2311,7 +2323,7 @@ } } while (!streams_with_pending_retransmission_.empty()) { - if (!connection_->CanWriteStreamData()) { + if (!CanWriteStreamData()) { break; } // Retransmit lost data on headers and data streams.
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index 626349c..490f4d0 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -117,7 +117,6 @@ void OnAckNeedsRetransmittableFrame() override; void SendPing() override; bool WillingAndAbleToWrite() const override; - bool HasPendingHandshake() const override; void OnPathDegrading() override; bool AllowSelfAddressChange() const override; HandshakeState GetHandshakeState() const override; @@ -364,6 +363,10 @@ // Called when stream |id| is newly waiting for acks. void OnStreamWaitingForAcks(QuicStreamId id); + // Returns true if there is pending handshake data in the crypto stream. + // TODO(ianswett): Make this private or remove. + bool HasPendingHandshake() const; + // Returns true if the session has data to be sent, either queued in the // connection, or in a write-blocked stream. bool HasDataToWrite() const; @@ -705,6 +708,9 @@ // if all lost data is retransmitted. Returns false otherwise. bool RetransmitLostData(); + // Returns true if stream data should be written. + bool CanWriteStreamData() const; + // Closes the pending stream |stream_id| before it has been created. void ClosePendingStream(QuicStreamId stream_id);
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h index df91aab..bec5692 100644 --- a/quic/test_tools/quic_test_utils.h +++ b/quic/test_tools/quic_test_utils.h
@@ -506,7 +506,6 @@ (override)); MOCK_METHOD(void, OnPathDegrading, (), (override)); MOCK_METHOD(bool, WillingAndAbleToWrite, (), (const, override)); - MOCK_METHOD(bool, HasPendingHandshake, (), (const, override)); MOCK_METHOD(bool, ShouldKeepConnectionAlive, (), (const, override)); MOCK_METHOD(void, OnSuccessfulVersionNegotiation,
diff --git a/quic/test_tools/simulator/quic_endpoint.cc b/quic/test_tools/simulator/quic_endpoint.cc index c908f98..5f8ee56 100644 --- a/quic/test_tools/simulator/quic_endpoint.cc +++ b/quic/test_tools/simulator/quic_endpoint.cc
@@ -153,9 +153,6 @@ } return bytes_to_transfer_ != 0; } -bool QuicEndpoint::HasPendingHandshake() const { - return false; -} bool QuicEndpoint::ShouldKeepConnectionAlive() const { return true; }
diff --git a/quic/test_tools/simulator/quic_endpoint.h b/quic/test_tools/simulator/quic_endpoint.h index b5be76f..9a3277b 100644 --- a/quic/test_tools/simulator/quic_endpoint.h +++ b/quic/test_tools/simulator/quic_endpoint.h
@@ -53,7 +53,6 @@ bool SendProbingData() override; void OnStatelessResetForProbing() override {} bool WillingAndAbleToWrite() const override; - bool HasPendingHandshake() const override; bool ShouldKeepConnectionAlive() const override; void OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/) override {}