)]}'
{
  "commit": "e4cf762fa488b6f92b108d8abedd3c0e1df1a76f",
  "tree": "1c099da46cdd2c4e9e277bad4faf69de7a7dabf4",
  "parents": [
    "c3cc71cb46c6b5af2af0ef51e0e11574ed27561a"
  ],
  "author": {
    "name": "bazel.build machine account",
    "email": "ci.bazel@gmail.com",
    "time": "Fri Aug 28 18:04:39 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Aug 28 18:04:39 2026 +0000"
  },
  "message": "[9.3.0] Don\u0027t report cancelled remote transfers as errors (https://github.com/bazelbuild/bazel/pull/30652) (#30751)\n\n### Description\n\nWhen a bulk transfer to or from the remote cache is cancelled, every one\nof its in-flight transfers fails with a `CancellationException`.\n`mergeBulkTransfer` subscribes to all transfers of a bulk operation at\nonce via `flatMapSingle`, which terminates on the first error and hands\nevery subsequent one to RxJava\u0027s global error handler.\n\n`RemoteModule` installs a global error handler that reports those as\nerror events, so a single cancelled bulk transfer printed a\n`java.util.concurrent.CancellationException: Task was cancelled` stack\ntrace for every transfer but the first.\n\nA transfer is only ever cancelled as part of tearing down the operation\nit belongs to, so `toTransferResult` now maps `CancellationException` to\nthe same result as `InterruptedException` instead of propagating it\ndownstream.\n\nThis PR also replaces two `isDisposed()`-then-`onError()` sequences in\n`RxFutures` and `AsyncTaskCache` with `tryOnError`. Those checks aren\u0027t\natomic with the delivery: the emitter can be disposed in between, in\nwhich case `onError` hands the error to the global error handler as\nwell.\n\n### Motivation\n\nUsers see spurious `ERROR: java.util.concurrent.CancellationException:\nTask was cancelled` stack traces, one per concurrently cancelled\ntransfer, whenever a build that is uploading or downloading blobs is\ninterrupted or an action fails while a bulk transfer is in flight.\n\nThis also shows up as a flake in\n`RemoteExecutionServiceTest.uploadInputsIfNotPresent_interrupted_requestCancelled`,\nwhich fails whenever `RxNoGlobalErrorsRule` observes the leaked\nexception. That test failed in roughly 2-5% of runs before this change\nand passed 100 out of 100 times after it.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases (if any).\n- [ ] I have updated the documentation (if applicable).\n\nThe existing `uploadInputsIfNotPresent_interrupted_requestCancelled`\ncovers this, but only probabilistically: the number of transfers that\nare cancelled concurrently determines whether an error is leaked, and\nthe `tryOnError` changes fix races that can\u0027t be triggered\ndeterministically.\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #30652.\n\nPiperOrigin-RevId: 965871323\nChange-Id: I14b9109bb2e84544cb0a9d573604c8dd891ecce4\n\nCommit\nhttps://github.com/bazelbuild/bazel/commit/cec8ee49f731e48b5bb336a27a7f2f1be770da48\n\nCo-authored-by: Fabian Meumertzheim \u003cfabian@meumertzhe.im\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "38df92eea262e0e1b6d16368491919f298801365",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/remote/util/AsyncTaskCache.java",
      "new_id": "0b0cacea4fe8f1b8b037e1469335ff66b6dafda6",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/remote/util/AsyncTaskCache.java"
    },
    {
      "type": "modify",
      "old_id": "43e28baed00ef49076305454ed5db3fe3f66c2fd",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/remote/util/RxFutures.java",
      "new_id": "41e94ef67ceafac5adee48c1d22f912b089aab79",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/remote/util/RxFutures.java"
    },
    {
      "type": "modify",
      "old_id": "6d5260c3d717c0fb14882dcd04d59dc4e95795bd",
      "old_mode": 33188,
      "old_path": "src/main/java/com/google/devtools/build/lib/remote/util/RxUtils.java",
      "new_id": "8d6f22d9571b5bcdd0ab1357f1ae6eaccdbe1b21",
      "new_mode": 33188,
      "new_path": "src/main/java/com/google/devtools/build/lib/remote/util/RxUtils.java"
    }
  ]
}
