Compute LRO exceptions drop structured operation error details
Maintainers usually reply within 1 day
@nnicolee is already working on this.
Since Jul 29, 2026.
Assessment
This issue has not been assessed yet.
Description
Description
When a Compute Engine long-running operation completes with status: DONE and an operation-level error, the Java client exception produced by OperationFuture.get() appears to keep only httpErrorStatusCode / httpErrorMessage in the exception message. Structured details under operation.error.errors[] are not included, which can discard the actionable provider error.
Example operation payload shape:
status: DONE
error.errors[0].code: INVALID_USAGE
error.errors[0].message: No attached disk found with device name '<deviceName>'
httpErrorStatusCode: 400
httpErrorMessage: BAD REQUEST
The thrown exception message becomes similar to:
com.google.api.gax.rpc.InvalidArgumentException: Operation with name "..." failed with status = HttpJsonStatusCode{statusCode=INVALID_ARGUMENT} and message = BAD REQUEST
The important detail INVALID_USAGE: No attached disk found with device name ... is not present in the exception message.
Why this matters
For Compute operations such as InstancesClient.detachDiskAsync(...).get(), BAD REQUEST / INVALID_ARGUMENT is too generic for operators and applications to distinguish idempotent conditions from real invalid input. The structured operation error contains the actionable reason, but it is not surfaced by the default exception path.
Code path observed
Current generated Compute client code seems to build the REST LRO snapshot from only the HTTP error status/message:
InstancesClient.detachDiskAsync(...)callsdetachDiskOperationCallable().futureCall(request):
https://github.com/googleapis/google-cloud-java/blob/58e50fc35625f8364e99516235c887442f0958af/java-compute/google-cloud-compute/src/main/java/com/google/cloud/compute/v1/InstancesClient.java#L2489-L2531HttpJsonInstancesStubdetach disk operation snapshot uses onlyresponse.getHttpErrorStatusCode()andresponse.getHttpErrorMessage():
https://github.com/googleapis/google-cloud-java/blob/58e50fc35625f8364e99516235c887442f0958af/java-compute/google-cloud-compute/src/main/java/com/google/cloud/compute/v1/stub/HttpJsonInstancesStub.java#L671-L682InstancesStubSettingswires this intoProtoOperationTransformers.ResponseTransformer.create(Operation.class):
https://github.com/googleapis/google-cloud-java/blob/58e50fc35625f8364e99516235c887442f0958af/java-compute/google-cloud-compute/src/main/java/com/google/cloud/compute/v1/stub/InstancesStubSettings.java#L2294-L2305
In gax, the response transformer creates the exception message from operationSnapshot.getErrorCode() and operationSnapshot.getErrorMessage() only:
HTTP 400 is then mapped to INVALID_ARGUMENT, and ApiExceptionFactory maps that to InvalidArgumentException:
- https://github.com/googleapis/sdk-platform-java/blob/febe86f1ea4f0b5e6d8454024ed499adb7dc9328/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonStatusCode.java#L96-L103
- https://github.com/googleapis/sdk-platform-java/blob/febe86f1ea4f0b5e6d8454024ed499adb7dc9328/gax-java/gax/src/main/java/com/google/api/gax/rpc/ApiExceptionFactory.java#L44-L53
Expected behavior
When the operation response contains structured error details, the thrown exception should expose or preserve them. For example, the exception message or an accessible error detail field should include something like:
INVALID_USAGE: No attached disk found with device name '<deviceName>'
Actual behavior
The default exception message only includes:
status = HttpJsonStatusCode{statusCode=INVALID_ARGUMENT} and message = BAD REQUEST
Possible fixes
- Include
Operation.error.errors[]in the generated ComputeOperationSnapshoterror message, where available. - Or preserve the original Compute
Operationerror details in the gax exception /ErrorDetailsso callers can inspect them programmatically. - Or provide documented guidance for retrieving the full failed operation response after
OperationFuture.get()throws.
If this belongs in googleapis/sdk-platform-java instead of this generated client repo, please redirect or transfer. The generated Compute client appears to be where the Compute-specific Operation.error.errors[] data is first collapsed into generic HTTP status/message.
- Dominant language
- Java
- Stars
- 2.1k
- Forks
- 1.2k
- Avg merge
- 2d 14h
- Merged PRs (30d)
- 192
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from googleapis/google-cloud-java
-
[java-core] Timestamp.of(java.sql.Timestamp) is one second late for a time less than a second before the epochPossibly taken @Vcode2407 claimed this 4 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
googleapis/google-cloud-java#14636 ·
Maintainers usually reply within 1 day
-
[java-firestore] UserDataConverter encodes a pre-epoch Date with negative nanos, so the write is refusedPossibly taken @wu-hui claimed this 23 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
googleapis/google-cloud-java#14635 · 1 assignee ·
Maintainers usually reply within 1 day
-
[java-firestore] UserDataConverter throws IndexOutOfBoundsException on an empty __binary__ valuePossibly taken @wu-hui claimed this 23 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
googleapis/google-cloud-java#14634 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
-
[java-firestore] CustomClassMapper.convertBigDecimal calls .abs() on Double, unintentionally flipping negative values to positiveMay be free again @wu-hui claimed this 45 days ago, and no pull request is open. Open
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
googleapis/google-cloud-java#14533 · 1 assignee ·
Maintainers usually reply within 1 day
-
Github CI failing when trying to install xmllintPossibly taken @blakeli0 claimed this 81 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
googleapis/google-cloud-java#14132 · 1 comment ·
Maintainers usually reply within 1 day
All issues in googleapis/google-cloud-java
Similar issues
-
Difficulty 1/5 Under an hour Newbie friendliness 88/100
-
Difficulty 2/5 Under an hour Newbie friendliness 84/100
cpp-best-practices/project_validator#251 ·
Maintainers usually reply within 1 day
-
backend enhancement
Difficulty 2/5 Half a day Newbie friendliness 70/100
damodharg6/payledger#16 ·
-
[Bug]: An initiative list with no current entry logs an error on every changePossibly taken @dwizard0 claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
Maintainers usually reply within 1 day