Skip to content

feat: Async consistency polling harness #1142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: autogen-feature-branch
Choose a base branch
from

Conversation

gkevinzheng
Copy link

This PR implements both the async client's wait_for_consistency and __init__ methods, as well as the async polling harness class.

@gkevinzheng gkevinzheng requested review from a team as code owners June 23, 2025 21:00
@product-auto-label product-auto-label bot added size: l Pull request size is large. api: bigtable Issues related to the googleapis/python-bigtable API. labels Jun 23, 2025

This should not be used by the user to wait until the `check_consistency` call finishes;
use the :meth:`result <google.api_core.future.async_future.AsyncFuture.result>` method of
this class instead.
Copy link
Contributor

Choose a reason for hiding this comment

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

This should not be used by the user to wait until the check_consistency call finishes;
use the :meth:result <google.api_core.future.async_future.AsyncFuture.result> method of
this class instead.

Is this something you added? Whay happens if the user uses this directly?

Copy link
Contributor

Choose a reason for hiding this comment

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

I'm still wondering about this. It doesn't matter so much if this is internal, but I'm wondering why it needs this warning

Copy link
Author

@gkevinzheng gkevinzheng Jun 30, 2025

Choose a reason for hiding this comment

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

Ahh yeah, this is from when it wasn't internal. I think I can delete this part of the docstring now because the underscore prefix should convey this, and the fact that they're not going to use this directly.

I think my justification for this is that from the documentation perspective, it looks like done should do something for the user, and it does, but it's for the loop of using result, which indirectly calls done.

# Wait for the table to become consistent
print("Waiting for operation to complete...")

response = future.result()
Copy link
Contributor

Choose a reason for hiding this comment

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

this needs an await. And the sample needs an async

retry: OptionalRetry = gapic_v1.method.DEFAULT,
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
metadata: Sequence[Tuple[str, Union[str, bytes]]] = (),
) -> async_consistency.AsyncCheckConsistencyPollingFuture:
Copy link
Contributor

Choose a reason for hiding this comment

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

I wonder if we want to return this custom Future directly. We could encapsulate it and use pure asyncio-native coroutines instead

That would be more idiomatic, but wouldn't be as consistent between sync/async. Do you think users will do anything with this future other than call .result()?

Copy link
Author

Choose a reason for hiding this comment

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

They could call add_done_callback but that's not documented too well. Should we do the awaiting, aka poll the call in the function instead of returning the polling harness to the user?

try:
OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None]
except AttributeError: # pragma: NO COVER
OptionalRetry = Union[retries.Retry, object, None] # type: ignore
Copy link
Contributor

Choose a reason for hiding this comment

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

This should be AsyncRetry for the async client

transport=transport,
client_options=client_options,
client_info=client_info,
)
Copy link
Contributor

Choose a reason for hiding this comment

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

Is this doing anything different than the base client?

Copy link
Author

Choose a reason for hiding this comment

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

The only thing it's doing differently is using a different default option for the client_info parameter (see lines 61-62), to provide a different version in DEFAULT_CLIENT_INFO


This should not be used by the user to wait until the `check_consistency` call finishes;
use the :meth:`result <google.api_core.future.async_future.AsyncFuture.result>` method of
this class instead.
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm still wondering about this. It doesn't matter so much if this is internal, but I'm wondering why it needs this warning

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: bigtable Issues related to the googleapis/python-bigtable API. size: l Pull request size is large.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants