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