Internal QUICHE change

PiperOrigin-RevId: 319294627
Change-Id: Ib05a6027c6a7dcea0cd81804e96c9b6e3ab31002
diff --git a/quic/core/batch_writer/quic_batch_writer_base.cc b/quic/core/batch_writer/quic_batch_writer_base.cc
index 46e230c..51b6188 100644
--- a/quic/core/batch_writer/quic_batch_writer_base.cc
+++ b/quic/core/batch_writer/quic_batch_writer_base.cc
@@ -66,9 +66,9 @@
     ReleaseTime result{actual_release_time,
                        QuicTime::Delta::FromMicroseconds(offset_ns / 1000)};
 
-    QUIC_DLOG(INFO) << "ideal_release_time:" << ideal_release_time
-                    << ", actual_release_time:" << actual_release_time
-                    << ", offset:" << result.release_time_offset;
+    QUIC_DVLOG(1) << "ideal_release_time:" << ideal_release_time
+                  << ", actual_release_time:" << actual_release_time
+                  << ", offset:" << result.release_time_offset;
     return result;
   }
 
diff --git a/quic/core/batch_writer/quic_gso_batch_writer.cc b/quic/core/batch_writer/quic_gso_batch_writer.cc
index 56c0e10..fd023ae 100644
--- a/quic/core/batch_writer/quic_gso_batch_writer.cc
+++ b/quic/core/batch_writer/quic_gso_batch_writer.cc
@@ -66,18 +66,23 @@
   // [2] It won't cause this batch to exceed kMaxGsoPacketSize.
   // [3] Already buffered writes all have the same length.
   // [4] Length of already buffered writes must >= length of the new write.
-  // [5] The new packet has the same release time as buffered writes.
+  // [5] The new packet can be released without delay, or it has the same
+  //     release time as buffered writes.
   const BufferedWrite& first = buffered_writes().front();
   const BufferedWrite& last = buffered_writes().back();
+  // Whether this packet can be sent without delay, regardless of release time.
+  const bool can_burst = !SupportsReleaseTime() || !options ||
+                         options->release_time_delay.IsZero() ||
+                         options->allow_burst;
   size_t max_segments = MaxSegments(first.buf_len);
   bool can_batch =
-      buffered_writes().size() < max_segments &&                       // [0]
-      last.self_address == self_address &&                             // [1]
-      last.peer_address == peer_address &&                             // [1]
-      batch_buffer().SizeInUse() + buf_len <= kMaxGsoPacketSize &&     // [2]
-      first.buf_len == last.buf_len &&                                 // [3]
-      first.buf_len >= buf_len &&                                      // [4]
-      (!SupportsReleaseTime() || first.release_time == release_time);  // [5]
+      buffered_writes().size() < max_segments &&                    // [0]
+      last.self_address == self_address &&                          // [1]
+      last.peer_address == peer_address &&                          // [1]
+      batch_buffer().SizeInUse() + buf_len <= kMaxGsoPacketSize &&  // [2]
+      first.buf_len == last.buf_len &&                              // [3]
+      first.buf_len >= buf_len &&                                   // [4]
+      (can_burst || first.release_time == release_time);            // [5]
 
   // A flush is required if any of the following is true:
   // [a] The new write can't be batched.
diff --git a/quic/core/batch_writer/quic_gso_batch_writer_test.cc b/quic/core/batch_writer/quic_gso_batch_writer_test.cc
index 158783d..d202c67 100644
--- a/quic/core/batch_writer/quic_gso_batch_writer_test.cc
+++ b/quic/core/batch_writer/quic_gso_batch_writer_test.cc
@@ -249,25 +249,27 @@
     for (size_t j = 0; j < test_data_table.size(); ++j) {
       const BatchCriteriaTestData& test_data = test_data_table[j];
       SCOPED_TRACE(testing::Message() << "i=" << i << ", j=" << j);
+      TestPerPacketOptions options;
+      options.release_time_delay = QuicTime::Delta::FromMicroseconds(
+          test_data.buffered_write.release_time);
       TestQuicGsoBatchWriter::CanBatchResult result = writer->CanBatch(
           test_data.buffered_write.buffer, test_data.buffered_write.buf_len,
           test_data.buffered_write.self_address,
-          test_data.buffered_write.peer_address,
-          /*options=*/nullptr, test_data.buffered_write.release_time);
+          test_data.buffered_write.peer_address, &options,
+          test_data.buffered_write.release_time);
 
       ASSERT_EQ(test_data.can_batch, result.can_batch);
       ASSERT_EQ(test_data.must_flush, result.must_flush);
 
       if (result.can_batch) {
-        ASSERT_TRUE(
-            writer->batch_buffer()
-                .PushBufferedWrite(test_data.buffered_write.buffer,
-                                   test_data.buffered_write.buf_len,
-                                   test_data.buffered_write.self_address,
-                                   test_data.buffered_write.peer_address,
-                                   /*options=*/nullptr,
-                                   test_data.buffered_write.release_time)
-                .succeeded);
+        ASSERT_TRUE(writer->batch_buffer()
+                        .PushBufferedWrite(
+                            test_data.buffered_write.buffer,
+                            test_data.buffered_write.buf_len,
+                            test_data.buffered_write.self_address,
+                            test_data.buffered_write.peer_address, &options,
+                            test_data.buffered_write.release_time)
+                        .succeeded);
       }
     }
   }
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 8c395a5..a979139 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -2737,8 +2737,6 @@
   if (result.status == WRITE_STATUS_OK) {
     // packet_send_time is the ideal send time, if allow_burst is true, writer
     // may have sent it earlier than that.
-    DCHECK((per_packet_options_ && per_packet_options_->allow_burst) ||
-           result.send_time_offset.IsZero());
     packet_send_time = packet_send_time + result.send_time_offset;
   }