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