gfe-relnote: In QUIC batch writers, always drop buffered packets on write errors. Protected by --gfe2_restart_flag_quic_batch_writer_always_drop_packets_on_error. Currently, GfeQuicGsoBatchWriter and GfeQuicSendmmsgBatchWriter drops buffered packets when their WritePacket fails, this change moves this functionality to QuicBatchWriterBase::InternalWritePacket which is used by both writers. This change also adds the functionality to QuicBatchWriterBase::Flush to drop packets on flush errors. PiperOrigin-RevId: 299998487 Change-Id: I3976801ca6bc8a84cb5b17f4780bd7e79f531bb8
diff --git a/quic/core/quic_types.cc b/quic/core/quic_types.cc index d39fffe..ef5f5da 100644 --- a/quic/core/quic_types.cc +++ b/quic/core/quic_types.cc
@@ -57,10 +57,16 @@ case WRITE_STATUS_NUM_VALUES: return "NUM_VALUES"; } - QUIC_DLOG(ERROR) << "Invalid WriteStatus value: " << enum_value; + QUIC_DLOG(ERROR) << "Invalid WriteStatus value: " + << static_cast<int16_t>(enum_value); return "<invalid>"; } +std::ostream& operator<<(std::ostream& os, const WriteStatus& status) { + os << HistogramEnumString(status); + return os; +} + std::ostream& operator<<(std::ostream& os, const WriteResult& s) { os << "{ status: " << s.status; if (s.status == WRITE_STATUS_OK) {
diff --git a/quic/core/quic_types.h b/quic/core/quic_types.h index f096069..b8a77a9 100644 --- a/quic/core/quic_types.h +++ b/quic/core/quic_types.h
@@ -86,7 +86,7 @@ }; // TODO(wtc): see if WriteStatus can be replaced by QuicAsyncStatus. -enum WriteStatus { +enum WriteStatus : int16_t { WRITE_STATUS_OK, // Write is blocked, caller needs to retry. WRITE_STATUS_BLOCKED, @@ -102,6 +102,8 @@ }; std::string HistogramEnumString(WriteStatus enum_value); +QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, + const WriteStatus& status); inline std::string HistogramEnumDescription(WriteStatus /*dummy*/) { return "status"; @@ -143,6 +145,9 @@ const WriteResult& s); WriteStatus status; + // Number of packets dropped as a result of this write. + // Only used by batch writers. Otherwise always 0. + uint16_t dropped_packets = 0; union { int bytes_written; // only valid when status is WRITE_STATUS_OK int error_code; // only valid when status is WRITE_STATUS_ERROR