)]}'
{
  "commit": "3edc5affa1f3bf3053821e0aa762395cb9475376",
  "tree": "78297276779bc4ecc0dd1f56c965d6298a99ed32",
  "parents": [
    "bc2c23f32b0704276052e8f70d4c6746498c9fa4"
  ],
  "author": {
    "name": "arostovtsev",
    "email": "arostovtsev@google.com",
    "time": "Fri Nov 13 14:39:08 2020 -0800"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Fri Nov 13 14:40:17 2020 -0800"
  },
  "message": "Explicitly interrupt a cancelled strategy instead of relying on a misleading checkState\n\nFuture.cancel() is expected to return false if the future is done or had been\ncancelled previously - a situation that often arises in stopBranch(). We therefore\nwant to remove the checkState for Future.cancel()\u0027s return value.\n\nHowever, it turned out that removing the checkState by itself would cause some\ndynamic builds to fail: if the future of the strategy calling stopBranch() was\nitself cancelled but not interrupted (a situation that sometimes arises), both\nbranches could attempt to write outputs. The IllegalStateException thrown by\ncheckState had the effect of interrupting the cancelled branch, allowing the build\nto succeed most of the time, as long as the exception got caught somewhere (which\nit often was).\n\nWe therefore want to replace the implicit effect of the misleading checkState with\nan explicit check for a cancelled strategy and an explicit interruption.\n\nRELNOTES: None.\nPiperOrigin-RevId: 342340917\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c1dac1bada73bd10e798c8061f9b6c75638cfe2e",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/dynamic/DynamicSpawnStrategy.java",
      "new_id": "222f33682a47c9a041fdbe1947e7b79218d2d694",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/dynamic/DynamicSpawnStrategy.java"
    }
  ]
}
