)]}'
{
  "commit": "80c395c2000480a43ebee1ff3921db8758ed161e",
  "tree": "b30af07b4b4245b7ee786413b186f8059631079f",
  "parents": [
    "4d94b2ff13723c9a8f4217153c7ca5c5fc54355f"
  ],
  "author": {
    "name": "Maxim Dounin",
    "email": "mdounin@mdounin.ru",
    "time": "Fri Mar 26 01:44:59 2021 +0300"
  },
  "committer": {
    "name": "Maxim Dounin",
    "email": "mdounin@mdounin.ru",
    "time": "Fri Mar 26 01:44:59 2021 +0300"
  },
  "message": "Events: fixed expiration of timers in the past.\n\nIf, at the start of an event loop iteration, there are any timers\nin the past (including timers expiring now), the ngx_process_events()\nfunction is called with zero timeout, and returns immediately even\nif there are no events.  But the following code only calls\nngx_event_expire_timers() if time actually changed, so this results\nin nginx spinning in the event loop till current time changes.\n\nWhile such timers are not expected to appear under normal conditions,\nas all such timers should be removed on previous event loop iterations,\nthey still can appear due to bugs, zero timeouts set in the configuration\n(if this is not explicitly handled by the code), or due to external\ntime changes on systems without clock_gettime(CLOCK_MONOTONIC).\n\nFix is to call ngx_event_expire_timers() unconditionally.  Calling\nit on each event loop iteration is not expected to be significant from\nperformance point of view, especially compared to a syscall in\nngx_process_events().\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "ed7b30bf3c0ba2145b4704fad9aaf35658c658ba",
      "old_mode": 33188,
      "old_path": "src/event/ngx_event.c",
      "new_id": "7777d043e4477ca5677f1ab01db4be8c6ff4792f",
      "new_mode": 33188,
      "new_path": "src/event/ngx_event.c"
    }
  ]
}
