)]}'
{
  "commit": "ac3aa860cd69645dd8fc71bbdcc04f22470c0159",
  "tree": "03228341210bd041774f6f7b3b00afd61f3abf00",
  "parents": [
    "9c009abcbd9d2c06ee8139b85b217d7dec1d2405"
  ],
  "author": {
    "name": "ianswett",
    "email": "ianswett@google.com",
    "time": "Fri Nov 06 10:29:04 2026 -0800"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Fri Nov 06 10:29:58 2026 -0800"
  },
  "message": "Batch standalone QUIC ACK-only packets across a receive batch with ScopedAckDeferrer.\n\nWhen a client processes a batch of incoming packets (for example, up to 16 packets from a single recvmmsg call), each per-packet flush can send a standalone ACK-only packet mid-batch. Testing on Cobalt showed the best performance when ACKs were held until the whole batch had been processed, but the earlier approach of blocking the writer caused other problems.\n\nAdd `QuicConnection::ScopedAckDeferrer`, an RAII helper for IETF QUIC connections. While it is in scope, standalone ACK-only packets are not sent, but pending ACKs can still be bundled with any outgoing data or control frames. When the outermost deferrer goes out of scope, it sends any ACKs that are due, leaves them to an imminent send alarm, or arms the ACK alarm for the earliest future ACK timeout. `QuicClientDefaultNetworkHelper` wraps its socket read loop in a deferrer.\n\nDeferral is enabled only on clients that set the new `DAOP` connection option, via either client connection options or connection options to send, so client experiments such as Chrome or Cobalt Finch can opt in. Servers ignore `DAOP`.\n\nPiperOrigin-RevId: 1015665961\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "98d21a6b36dda040d4bff6ebc5a3ca51530a5902",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/crypto/crypto_protocol.h",
      "new_id": "009b03207ed222e915df3e809e86bdc7fcaad8c9",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/crypto/crypto_protocol.h"
    },
    {
      "type": "modify",
      "old_id": "d32e0511eb522946075dcdbeee7974356c0f73e7",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/quic_connection.cc",
      "new_id": "3be26429b2528274ec6f3e36f71427b76c822d7e",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/quic_connection.cc"
    },
    {
      "type": "modify",
      "old_id": "ad1cdd3e10f4b9c5782a59624e57a03a0760860b",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/quic_connection.h",
      "new_id": "d320e896e8a0cdacd4e5ff53ded8eea57eb3564d",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/quic_connection.h"
    },
    {
      "type": "modify",
      "old_id": "b56e8b084a822259e7f7e84776a5c9ca73892893",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/quic_connection_test.cc",
      "new_id": "512b0d7580ae2696d74ae0f09a7d7f4b4abd892d",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/quic_connection_test.cc"
    },
    {
      "type": "modify",
      "old_id": "865e2b71433d3f8937b4b4a4237104b57cb58ef4",
      "old_mode": 33188,
      "old_path": "quiche/quic/test_tools/quic_connection_peer.cc",
      "new_id": "b458cd0e4abb5d5c6d122d162e904a9aa26eb890",
      "new_mode": 33188,
      "new_path": "quiche/quic/test_tools/quic_connection_peer.cc"
    },
    {
      "type": "modify",
      "old_id": "7ff6b4ecab841eaa1121b7680d2f2235689bd463",
      "old_mode": 33188,
      "old_path": "quiche/quic/test_tools/quic_connection_peer.h",
      "new_id": "7aa14ef55565cb5cce5f2a26aaff97cc2b3bf846",
      "new_mode": 33188,
      "new_path": "quiche/quic/test_tools/quic_connection_peer.h"
    },
    {
      "type": "modify",
      "old_id": "539b02c9c761bbc4dc2e7ce8262a8b0492387a3d",
      "old_mode": 33188,
      "old_path": "quiche/quic/tools/quic_client_default_network_helper.cc",
      "new_id": "d08b5abec9d00d48b119fc9598c39d5fff427c18",
      "new_mode": 33188,
      "new_path": "quiche/quic/tools/quic_client_default_network_helper.cc"
    }
  ]
}
