)]}'
{
  "commit": "fb78d66508e9cefd609fec3b423fddbfc9eb4935",
  "tree": "c577c1f947aebafc3fd2c39886acce5939ddf12e",
  "parents": [
    "d85dc0a5b7f6cb3e3a8f03403fc6beabca9617c6"
  ],
  "author": {
    "name": "ianswett",
    "email": "ianswett@google.com",
    "time": "Wed Oct 07 00:28:34 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Wed Oct 07 00:29:59 2026 -0700"
  },
  "message": "Send pending ACKs after visitor_-\u003eOnCanWrite() in QuicConnection::OnCanWrite().\n\nPreviously, `QuicConnection::OnCanWrite()` called `SendAllPendingAcks()` before `visitor_-\u003eOnCanWrite()`. When a pending ACK\u0027s encryption level differed from the connection\u0027s current default encryption level (such as during a handshake or 0-RTT connection), `SendAllPendingAcks()` switched encryption levels via `ScopedEncryptionLevelContext`, immediately flushing a standalone ACK packet before `visitor_-\u003eOnCanWrite()` could write `CRYPTO` or `STREAM` frames at that encryption level.\n\nWhen `send_acks_after_on_can_write_` is enabled (via `gfe2_reloadable_flag_quic_send_acks_after_on_can_write` and the `SAOW` connection option), `QuicConnection::OnCanWrite()` invokes `visitor_-\u003eOnCanWrite()` before `SendAllPendingAcks()` so that outgoing `CRYPTO` and `STREAM` packets opportunistically bundle pending ACKs at the same encryption level, and only remaining unbundled ACKs are sent afterward.\n\nOverview of impact including Handshake Simulations: https://docs.google.com/document/d/1CiaBRfPAfKbL0SuEhrBQeZxDeXvdREseGe1AE89pR-I/edit?usp\u003dsharing\n\nProtected by quic_reloadable_flag_quic_send_acks_after_on_can_write.\n\nPiperOrigin-RevId: 994903307\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "7f950d845f80395b5fe5b9a98bb2660aad839a00",
      "old_mode": 33261,
      "old_path": "quiche/common/quiche_feature_flags_list.h",
      "new_id": "dab5eb6a0752cdebd1a2dc1bd3d379f406fb4936",
      "new_mode": 33261,
      "new_path": "quiche/common/quiche_feature_flags_list.h"
    },
    {
      "type": "modify",
      "old_id": "c56eefcb05264f0907ed93fe0fcf7518e4648f38",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/crypto/crypto_protocol.h",
      "new_id": "c504c5d1a2a2ec99470fe5e6c29b4332ea7c0095",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/crypto/crypto_protocol.h"
    },
    {
      "type": "modify",
      "old_id": "c29d91ea447d4f74ff898ec680c2f19506bdd82d",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/http/end_to_end_test.cc",
      "new_id": "e805d37002fc528b694f7b5bc821884042879e4f",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/http/end_to_end_test.cc"
    },
    {
      "type": "modify",
      "old_id": "c39b098d9e6a4a5686c7c009a92ee1b1c2b5f294",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/quic_connection.cc",
      "new_id": "8018c7d0746b394d56f92f19f5b90754de3e9a48",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/quic_connection.cc"
    },
    {
      "type": "modify",
      "old_id": "442df61b81e6458e1b6d1fafa571ad4e86cf7a9c",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/quic_connection.h",
      "new_id": "1bbb8240c6b40af5127c890f94eaab992afb78b0",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/quic_connection.h"
    },
    {
      "type": "modify",
      "old_id": "72258ed7fefcdb118a7741c0e791b6123b4954e2",
      "old_mode": 33188,
      "old_path": "quiche/quic/core/quic_connection_test.cc",
      "new_id": "441e8adfdcadd88ba862520374b97ebf235fbac4",
      "new_mode": 33188,
      "new_path": "quiche/quic/core/quic_connection_test.cc"
    }
  ]
}
