)]}'
{
  "commit": "ccf75ef9738e38bce6b64e75fa57245789495c9b",
  "tree": "8f86cc5c2b64e5663b2b01d9559253702bb65c54",
  "parents": [
    "9145471d2e43f3c3929795b56276a5adc0b6a788"
  ],
  "author": {
    "name": "Martin Fick",
    "email": "martin.fick@linaro.org",
    "time": "Tue Jul 12 10:53:00 2022 -0600"
  },
  "committer": {
    "name": "Martin Fick",
    "email": "martin.fick@linaro.org",
    "time": "Wed Sep 07 14:48:31 2022 -0600"
  },
  "message": "Add a TaskTree ApplicableNodeFilter\n\nThe ApplicableNodeFilter is able to determine whether a node can cache\nthe applicability of some of its subnodes by Branch. If so, it will\ncache this applicability for each Branch which it encounters, and reuse\nthe results when it encounters the same branch again. This potentially\nreduces the rescanning of large numbers of subnodes for each Change down\nto rescanning those nodes only for each Branch.\n\nDue to the nature of a global server task config, task applicability is\noften determined by a Change\u0027s project and branch, so it would not be\nunusual for this per Branch caching to benefit large task configs. It is\nrelevant to note that since ChangeNodes are not cached, this change does\nnot improve walking dependencies. Further more sophisticated\nimprovements are needed to noticeably improve the \"walking\" use case.\n\nIn a real world use case, there is a root task with over 1K subtasks and\nonly 1 or 2 of those subtasks is almost ever applicable to a Change. The\napplicability in these cases is almost exclusively determined by\n\u0027destination\u0027 and `destination like` queries which are based on the\nChange\u0027s destination. In this case, when the PW root task is being\nevaluated on a Change destined for an already seen Branch, instead of\nhaving to evaluate over 1K subnodes against the Change to see if they\nare applicable, the 1 or 2 applicable subnodes can be returned from the\ncache using a simple Branch lookup in a Map.\n\nWith this change, there is a significant performance increase of the\nfollowing ssh non change walking query:\n\n status:open --task--applicable --format json --no-limit\n\nBefore this change: 1m37s, 1m42s, 1m37s\nAfter this change:  1m11s, 1m10s, 1m14s\n\nChange-Id: I4c3ff9ceb990386e0f0d11fbd55cdc825c677e4c\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "b3f269f6ba0b917b359eea5403c8c95f96e0811f",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java",
      "new_id": "690b03583f8da362a658de0e42322c136f947ec2",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java"
    },
    {
      "type": "modify",
      "old_id": "977564301923d42abf676755f11c33dd75f5c500",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java",
      "new_id": "06ce1462ab29445bade4b56eac31950241c547f0",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java"
    },
    {
      "type": "modify",
      "old_id": "fede191df8f8f800368fb81b9e8953928b930ab9",
      "old_mode": 33188,
      "old_path": "src/main/resources/Documentation/test/task_states.md",
      "new_id": "71ee0ece30b5bbc9fdbe44218a6995584d196d6e",
      "new_mode": 33188,
      "new_path": "src/main/resources/Documentation/test/task_states.md"
    }
  ]
}
