Skip to content

feat(bigtable): Reroute Mutations Batcher to use data client - #18200

Merged
daniel-sanche merged 11 commits into
mainfrom
shim/13-mutations-batcher
Sep 28, 2026
Merged

daniel-sanche merged 11 commits into
mainfrom
shim/13-mutations-batcher

Conversation

@daniel-sanche

@daniel-sanche daniel-sanche commented Aug 21, 2026 •

Copy link
Copy Markdown
Contributor

Migrating over @gkevinzheng PR from bigtable monorepo googleapis/python-bigtable#1309

Original description:

Changes Made:

  • Replaced mutations batcher implementation with one based off of the data client.
  • Reworked unit tests.
  • Added additional system tests.

Additional Changes:

  • 785f138: fix references in propertoes to point to data client
  • ac62f4c: removed deprecation language around flush_interval, since it is supported in the data client

Note to reviewers: This PR has already been reviewed and merged to a staging branch, with the intention of doing a single merge to main. We are now planning to slowly rollout these changes back to the main branch. Minimal re-review should be necessary

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the MutationsBatcher to delegate batching, queueing, and flow control to the underlying table implementation, removing redundant internal classes. It also updates the exception handling across both sync and async batchers to ensure that MutationsExceptionGroup only contains FailedMutationEntryError instances. A review comment points out a potential issue where unpacking error.__cause__ could result in None being added to the exceptions queue, and suggests a defensive fallback to the error itself.

Comment thread packages/google-cloud-bigtable/google/cloud/bigtable/batcher.py Outdated
@daniel-sanche
daniel-sanche force-pushed the shim/13-mutations-batcher branch from dbfc051 to 57774e9 Compare September 2, 2026 18:42
)
return status_pb2.Status(
code=code_pb2.Code.UNKNOWN,
message="An unknown error has occurred",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe change this to GoogleApiCAllError with Unknown status code

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

# FailedMutationEntryError always has an Exception cause;
# defensively fall back to error itself if __cause__ is None.
cause = error.__cause__ if error.__cause__ is not None else error
self._exceptions.put(cause)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could there be other types of error? we should put them in the exception list

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't expect there to be, but we can add a guard to be safe

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be better if we wrap it in a standard grpc error (unknown or something) and wraps the cause, so we don't return FailedMutationEntryError to user directly?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, added. We do expect FailedMutationEntryError to always have a cause, but that feels like a worthwhile change either way

Comment thread packages/google-cloud-bigtable/google/cloud/bigtable/batcher.py
@daniel-sanche
daniel-sanche force-pushed the shim/13-mutations-batcher branch from 57774e9 to 87f74b5 Compare September 19, 2026 00:28
@daniel-sanche
daniel-sanche marked this pull request as ready for review September 19, 2026 00:50
@daniel-sanche
daniel-sanche requested a review from a team as a code owner September 19, 2026 00:50
exc.index = None
exceptions.extend(exc_list)
except Exception as e:
except FailedMutationEntryError as e:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would task raise a FailedMutationEntry? Or it always return a list?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's expected to always return a list. The catch is only for handling unexpected failures in the batcher's background task

I think Kevin added this to avoid double-wrapping exceptions, but I think we can just keep the other except block here. We realistically don't expect to ever see FailedMutationEntry here, and the worst that would happen is a slightly uglier exception message

Comment thread packages/google-cloud-bigtable/google/cloud/bigtable/batcher.py
# FailedMutationEntryError always has an Exception cause;
# defensively fall back to error itself if __cause__ is None.
cause = error.__cause__ if error.__cause__ is not None else error
self._exceptions.put(cause)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be better if we wrap it in a standard grpc error (unknown or something) and wraps the cause, so we don't return FailedMutationEntryError to user directly?

@daniel-sanche
daniel-sanche force-pushed the shim/13-mutations-batcher branch 3 times, most recently from a1ae8da to 29f69e6 Compare September 28, 2026 19:16
Base automatically changed from shim/12-batcher-callback to main September 28, 2026 20:53
@daniel-sanche
daniel-sanche force-pushed the shim/13-mutations-batcher branch from 29f69e6 to 3bbaad4 Compare September 28, 2026 20:53
@daniel-sanche
daniel-sanche force-pushed the shim/13-mutations-batcher branch from 3bbaad4 to 26f24d0 Compare September 28, 2026 21:16
@daniel-sanche
daniel-sanche merged commit 0b488a3 into main Sep 28, 2026
52 checks passed
@daniel-sanche
daniel-sanche deleted the shim/13-mutations-batcher branch September 28, 2026 22:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants