)]}'
{
  "commit": "a579e1cf05e7aaefa1ba2ee7701b8eea9e5ce8ab",
  "tree": "d0b3263f497796e30b79a099867c0dfe0a51348c",
  "parents": [
    "1a46c464810c5f9052f92240bd5eafe3a64f08cf"
  ],
  "author": {
    "name": "Kaushik Lingarkar",
    "email": "klingarkar@nvidia.com",
    "time": "Fri Jun 12 15:02:10 2026 -0700"
  },
  "committer": {
    "name": "Kaushik Lingarkar",
    "email": "klingarkar@nvidia.com",
    "time": "Thu Jul 09 17:46:31 2026 -0700"
  },
  "message": "Run ITS actions asynchronously on a work queue\n\nITS event handling ran synchronously on Gerrit\u0027s event dispatch\nthread. For every matching ref event, the plugin extracted\nproperties, evaluated rules, and executed the resulting actions\ninline. Those actions perform blocking network calls to the issue\ntracker (for example, the Jira REST API), which held up the\ndispatch thread and could slow down the Gerrit operations that\nproduced the events.\n\nKeep issue detection and rule evaluation on the dispatch thread, but\noffload action execution to a dedicated thread pool backed by\nGerrit\u0027s WorkQueue. Work is queued only when an event actually\ntriggers an action, so events that match no rule add nothing to the\nqueue. Asynchronous execution is enabled when actions.threads is set\nto a positive value in plugin config. The default of 0 preserves the\nprevious synchronous behavior.\n\nConcurrent processing can reorder events and corrupt issue state\ntransitions (for example, in Jira). A per-change ordering key ensures\ntasks for the same change run one at a time in submission order,\nwhile unrelated changes run in parallel.\n\nTo keep the backlog bounded, the number of in-flight tasks is limited\nto the pool size. When every thread is busy, submission blocks the\ndispatch thread until a running task completes.\n\nChange-Id: I9cf17b55fbf0fce836fcf8ed9f8909741e6a3911\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "81a0b27da5ba6425c7903dacba53cbc37cc853f4",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/Actions.java"
    },
    {
      "type": "modify",
      "old_id": "8835389bfc6435d26040504498196a8c3265a41e",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/ItsHookModule.java",
      "new_id": "e9efc812eed245fdbf60302a867304439ae98bea",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/ItsHookModule.java"
    },
    {
      "type": "modify",
      "old_id": "668ff1e266df1a5112b68dbfc94a0f81b4b1a445",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java",
      "new_id": "ecc25205023e95413fb0df84d2ae2b54690c5a41",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java"
    },
    {
      "type": "modify",
      "old_id": "d2166a30d7eda9bba1d0b878b6fad22165f60977",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java",
      "new_id": "f441a435f1de1a7d75041b65bc151c0ccbe9131e",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cf96e552b563faccc757ef6365a9463761b119c1",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/BoundedOrderedDispatcher.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b483a1df643fd57ba118736077278cf180ee5ad4",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LifecycleThreadPool.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "df71201b1e14697e74d0e1302c959f721b425e37",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuntimeQueueMap.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "35734d59e88742da4e97f355e0763cee71dc6ce9",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/Throttle.java"
    },
    {
      "type": "modify",
      "old_id": "11c5b582311e72a53aa1dbfafd39046f402c0489",
      "old_mode": 33188,
      "old_path": "src/main/resources/Documentation/config-common.md",
      "new_id": "cee24ba29bd0e5e85721040d5367d11d90d7d638",
      "new_mode": 33188,
      "new_path": "src/main/resources/Documentation/config-common.md"
    },
    {
      "type": "modify",
      "old_id": "27545a223709eafada45c7ca6da371cd9dcf429c",
      "old_mode": 33188,
      "old_path": "src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionControllerTest.java",
      "new_id": "237f84a248f718d1d67cd5596204243dd31d4d62",
      "new_mode": 33188,
      "new_path": "src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionControllerTest.java"
    }
  ]
}
