)]}'
{
  "commit": "84241aba000e2c20b90b3e4d22497249bd78cfe0",
  "tree": "410c73dc78269f3371d9bd67aee3bd5843bf0fcf",
  "parents": [
    "4536113ad3ae6f16d1638aa4e4d81c94e1e6b357"
  ],
  "author": {
    "name": "Maxim Dounin",
    "email": "mdounin@mdounin.ru",
    "time": "Sat Oct 30 02:39:19 2021 +0300"
  },
  "committer": {
    "name": "Maxim Dounin",
    "email": "mdounin@mdounin.ru",
    "time": "Sat Oct 30 02:39:19 2021 +0300"
  },
  "message": "Changed ngx_chain_update_chains() to test tag first (ticket #2248).\n\nWithout this change, aio used with HTTP/2 can result in connection hang,\nas observed with \"aio threads; aio_write on;\" and proxying (ticket #2248).\n\nThe problem is that HTTP/2 updates buffers outside of the output filters\n(notably, marks them as sent), and then posts a write event to call\noutput filters.  If a filter does not call the next one for some reason\n(for example, because of an AIO operation in progress), this might\nresult in a state when the owner of a buffer already called\nngx_chain_update_chains() and can reuse the buffer, while the same buffer\nis still sitting in the busy chain of some other filter.\n\nIn the particular case a buffer was sitting in output chain\u0027s ctx-\u003ebusy,\nand was reused by event pipe.  Output chain\u0027s ctx-\u003ebusy was permanently\nblocked by it, and this resulted in connection hang.\n\nFix is to change ngx_chain_update_chains() to skip buffers from other\nmodules unconditionally, without trying to wait for these buffers to\nbecome empty.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c3783c44670404b37242d85e30ccf9515b79032e",
      "old_mode": 33188,
      "old_path": "src/core/ngx_buf.c",
      "new_id": "811f24d9637610ca519c557b523fd742ce1d8129",
      "new_mode": 33188,
      "new_path": "src/core/ngx_buf.c"
    }
  ]
}
