René's URL Explorer Experiment


Title: fix: Major refactoring of Polling, Retry and Timeout logic by vam-google · Pull Request #462 · googleapis/python-api-core · GitHub

Open Graph Title: fix: Major refactoring of Polling, Retry and Timeout logic by vam-google · Pull Request #462 · googleapis/python-api-core

X Title: fix: Major refactoring of Polling, Retry and Timeout logic by vam-google · Pull Request #462 · googleapis/python-api-core

Description: If you are a user of python-api-core and experience polling timing out after ~15 minutes (900s) in your python code after this change, please make sure that instead of calling PollingFuture.result() you call it with additonal timeout argument like this: PollingFuture.result(timeout = ) or PollingFuture.result(timeout = None) (for infinite timeout, but infinite timeouts are strongly discouraged) for your code to stop timing out at 900s. The core libraries cannot and should not have infitine polling as as default behavior. The fact that it had it like that in python for years (unlike other GCP-supported languages) was a bug, as it contradicts original cross-language LRO methods design in GAPIC libraries and in general users are not supposed to be put into an infinite-loop scenario implicitly. If an LRO can actually ran for hours or even days and it is Ok, then users are expected to acknowledge this fact by providing the huge timeouts explicitly. This is in response to https://freeman.vc/notes/aws-vs-gcp-reliability-is-wildly-different, which triggered an investigation of the whole Polling/Retry/Timeout behavior in Python GAPIC clients and revealed many fundamental flaws in its implementation. To properly describe the refactoring in this PR we need to stick to a rigorous terminology, as vague definitions of retries, timeouts, polling and related concepts seems to be the main source of the present bugs and overall confusion among both groups: users of the library and creators of the library. Please check the updated (in this PR) documentation of the google.api_core.retry.Retry class and the google.api_core.future.polling.Polling.result() method for the proper definitions and context. Note, the overall semantics around Polling, Retry and Timeout remains quite confusing even after refactoring (although it is now more or less rigorously defined), but it was as clean as I could make it while still maintaining backward compatibility of the whole library. The quick summary of the changes in this PR: Properly define and fix the application of Deadline and Timeout concepts. Please check the updated documentation for the google.api_core.retry.Retry class for the actual definitions. Originally the deadline has been used to represent timeouts conflating the two concepts. As result this PR replaces deadline arguments with timeout ones in as backward-compatible manner as possible (i.e. backward compatible in all practical applications). Properly define RPC Timeout, Retry Timeout and Polling Timeout and how a generic Timeout concept (aka Logical Timeout) is mapped to one of those depending on the context. Please check google.api_core.retry.Retry class documentation for details. Properly define and fix the application of Retry and Polling concepts. Please check the updated documentation for google.api_core.future.polling.PollingFuture.result() for details. Separate retry and polling configurations for Polling future, as these are two different concepts (although both operating on Retry class). Originally both retry and polling configurations were controlled by a single retry parameter, merging configuration regarding how "rpc error responses" and how "operation not completed" responses are supposed to be handled. For the following config properties - Retry (including Retry Timeout), Polling (including Polling Timeout) and RPC Timeout - fix and properly define how each of the above properties gets configured and which config gets precedence in case of a conflict (check PollingFuture.result() method documentation for details). Each of those properties can be specified as follows: directly provided by the user for each call, specified during gapic generation time from config values in grpc_service_config.json file (for Retry and RPC Timeout) and gapic.yaml file (for Polling Timeout), or be provided as a hard-coded basic default values in python-api-core library itself. This alo includes fixing the per-call polling config propagation logic (the polling/retry configs supplied to PollingFuture.result() used to be ignored for actual call). Deprecate ExponentialTimeout, ConstantTimeout and related logic as those are outdated concepts and are not consistent with the other GAPIC Languages. Replace it with TimeToDeadlineTimeout to be consistent with how the rest of the languages do it. Deprecate google.api_core.operations_v1.config as it is an outdated concept and self-inconsistent (as all gapic clients provide configuraiton in code). The configs are directly provided in code instead. Switch randomized delay calculation from delay being treated as expected value for randomized_delay to delay being treated as maximum value for randomized_delay (i.e. the new expected valud for randomized_delay is delay / 2). See the exponential_sleep_generator() method implementation for details. This is needed to make Python implementation of retries and polling exponential backoff consistent with the rest of GAPIC languages. Also fix the uncontrollable growth of delay value (since it is a subject of exponential growth, the delay value was quickly reaching "infinity" value, and the whole thing was not failing simply due to python being a very forgiving language which forgives multiplying "infinity" by a number (inf * number = inf) binstead of simply overflowing to a (most likely) negative number). Also essentially rollback the 52f12af change, since that is inconsistent with the other languages and damages uniform distibution of retry delays artificially shifting their concentration towards the end of timeout. Fix url construction in OperationsRestTransport. Without this fix the polling logic for REST transport was completely broken (is not affecting Compute client, as that one has custom LRO). Last but not least: change the default values for Polling logic to be the following: initial=1.0 (same as before), maximum=20.0 (was 60), multiplier=1.5 (was 2.0), timeout=900 (was 120, but due to timeout resolution logic was actually None (i.e. infinity)). This, in conjunction with changed calculation of randomized delay (i.e. its expected value now being delay / 2) overall makes polling logic much less aggressive in terms of increasing delays between each polling iteration, making LRO return much earlier for users on average, but still keeping a healthy balance between strain put on both client and server by polling and responsiveness of LROs for user. *The design doc summarising all the changes and reasons for them is in progress. In addition to the timeout/retry fixes, this PR has some other non-related technical fixes: Fix and improve code coverage (and explicitly disables lines which are not supposed to be covered) Define Python 3.10 as the default python version used in CI. Upgrade to Sphinx 4.2.0, as it is the one supporting Python 3.10

Open Graph Description: If you are a user of python-api-core and experience polling timing out after ~15 minutes (900s) in your python code after this change, please make sure that instead of calling PollingFuture.result...

X Description: If you are a user of python-api-core and experience polling timing out after ~15 minutes (900s) in your python code after this change, please make sure that instead of calling PollingFuture.result...

Opengraph URL: https://github.com/googleapis/python-api-core/pull/462

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:d2ffbc5e-e82a-77c6-cb8b-1f51e645633a
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idAF08:8AE8C:2D45E7:410920:6A4E6A02
html-safe-noncee44b0be4eebe3eebe95a26a8c2a87d18a0cd33706d7bb0fd20474233cee9b7b4
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBRjA4OjhBRThDOjJENDVFNzo0MTA5MjA6NkE0RTZBMDIiLCJ2aXNpdG9yX2lkIjoiNzUxNTY1NTA0NDE3MzAzMTkzOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacdf6912fb6d965d17e65e33b8c681f137fd3a0b4015e70d9c2109189044f4d971
hovercard-subject-tagpull_request:1091637586
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/googleapis/python-api-core/pull/462/files
twitter:imagehttps://avatars.githubusercontent.com/u/25311427?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/25311427?s=400&v=4
og:image:altIf you are a user of python-api-core and experience polling timing out after ~15 minutes (900s) in your python code after this change, please make sure that instead of calling PollingFuture.result...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None41b6ab3ba6d20a71766ac245b5a4a94c6fc672a9cd4da7d44c1b33ab8bf6a21c
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/googleapis/python-api-core git https://github.com/googleapis/python-api-core.git
octolytics-dimension-user_id16785467
octolytics-dimension-user_logingoogleapis
octolytics-dimension-repository_id226992456
octolytics-dimension-repository_nwogoogleapis/python-api-core
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id226992456
octolytics-dimension-repository_network_root_nwogoogleapis/python-api-core
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasee6a744804e8e70f97b4d5a18a94dcc63db22f97a
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/googleapis/python-api-core/pull/462/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgoogleapis%2Fpython-api-core%2Fpull%2F462%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgoogleapis%2Fpython-api-core%2Fpull%2F462%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=googleapis%2Fpython-api-core
Reloadhttps://github.com/googleapis/python-api-core/pull/462/files
Reloadhttps://github.com/googleapis/python-api-core/pull/462/files
Reloadhttps://github.com/googleapis/python-api-core/pull/462/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
googleapis https://github.com/googleapis
python-api-corehttps://github.com/googleapis/python-api-core
Notifications https://github.com/login?return_to=%2Fgoogleapis%2Fpython-api-core
Fork 97 https://github.com/login?return_to=%2Fgoogleapis%2Fpython-api-core
Star 144 https://github.com/login?return_to=%2Fgoogleapis%2Fpython-api-core
Code https://github.com/googleapis/python-api-core
Issues 0 https://github.com/googleapis/python-api-core/issues
Pull requests 0 https://github.com/googleapis/python-api-core/pulls
Actions https://github.com/googleapis/python-api-core/actions
Projects https://github.com/googleapis/python-api-core/projects
Security and quality 0 https://github.com/googleapis/python-api-core/security
Insights https://github.com/googleapis/python-api-core/pulse
Code https://github.com/googleapis/python-api-core
Issues https://github.com/googleapis/python-api-core/issues
Pull requests https://github.com/googleapis/python-api-core/pulls
Actions https://github.com/googleapis/python-api-core/actions
Projects https://github.com/googleapis/python-api-core/projects
Security and quality https://github.com/googleapis/python-api-core/security
Insights https://github.com/googleapis/python-api-core/pulse
partheahttps://github.com/parthea
googleapis:mainhttps://github.com/googleapis/python-api-core/tree/main
vam-google:masterhttps://github.com/vam-google/python-api-core/tree/master
Conversation 156 https://github.com/googleapis/python-api-core/pull/462
Commits 12 https://github.com/googleapis/python-api-core/pull/462/commits
Checks 0 https://github.com/googleapis/python-api-core/pull/462/checks
Files changed https://github.com/googleapis/python-api-core/pull/462/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
fix: Major refactoring of Polling, Retry and Timeout logic https://github.com/googleapis/python-api-core/pull/462/files#top
Show all changes 12 commits https://github.com/googleapis/python-api-core/pull/462/files
94e4c21 fix: Major refactoring and fix for Polling, Retry and Timeout logic vam-google Oct 19, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/94e4c21385c2002528f4d73647652ec999307630
6a63d34 fix ci failures (mainly sphinx errors) vam-google Oct 19, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/6a63d3478279b66f9f81b74e5620f114b5aab7fa
ea8b176 remove unused code vam-google Oct 31, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/ea8b176a97f59de5bea3c22e14e3008a1807ba08
ad03684 fix typo vam-google Oct 31, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/ad03684aebad2fd0a4dccd37b029befcb4d4007d
eba0f38 Pin pytest version to <7.2.0 vam-google Oct 31, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/eba0f386c34979a2e23f7ad2da61bac2430d2360
23c02c6 reformat code vam-google Oct 31, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/23c02c67e0ab7def289f8253462c0eebb8de90e3
ac0d65f address pr feedback vam-google Nov 1, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/ac0d65fa0c650e7f7591bb9e366e141aecb79db1
cb7a0b2 address PR feedback vam-google Nov 1, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/cb7a0b233b61362adc3b3e648af641d62a19b661
fc72914 address pr feedback vam-google Nov 2, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/fc729146f1ba90784b854006880af22a8d543e54
a5a5f2e Update google/api_core/future/polling.py vam-google Nov 8, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/a5a5f2e5f006b521e89fcd7138987154ff5d785c
15db4b4 Apply documentation suggestions from code review vam-google Nov 8, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/15db4b4133bee80293e782ef16da7c01b35e1686
e382041 Address PR feedback vam-google Nov 8, 2022 https://github.com/googleapis/python-api-core/pull/462/commits/e38204128623d9ae33743ee48a5994a3608f5be5
Clear filters https://github.com/googleapis/python-api-core/pull/462/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
lint.yml https://github.com/googleapis/python-api-core/pull/462/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
mypy.yml https://github.com/googleapis/python-api-core/pull/462/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
extended_operation.py https://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
async_future.py https://github.com/googleapis/python-api-core/pull/462/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
polling.py https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
config.py https://github.com/googleapis/python-api-core/pull/462/files#diff-ea54b0e8e3b1279d3f45cbdfa472a34c04f6dae09fa015236717ee3270a9c008
method.py https://github.com/googleapis/python-api-core/pull/462/files#diff-12d0331ed4c2c217c6b87a4e74a1441222081ed74c9dd3d8a59da22e5b1203fd
grpc_helpers.py https://github.com/googleapis/python-api-core/pull/462/files#diff-9aeb5107dac746ab0e51a30c001ca48df095ca511bc881c40ed0c5e71cf7dc73
operation.py https://github.com/googleapis/python-api-core/pull/462/files#diff-c1ade7a5b8a2a4bab262545320e61c2636bf9374247de521d02d655578e91eed
operations_async_client.py https://github.com/googleapis/python-api-core/pull/462/files#diff-5fb933dfdbad5925d83718ab80ffb1bef9c3dca9dd805f51b338d58f33a782c8
operations_client.py https://github.com/googleapis/python-api-core/pull/462/files#diff-3585680ff7459038403e6b7b371c4478bc3fb5c7ca375f8f4383f89e3bd9e425
operations_client_config.py https://github.com/googleapis/python-api-core/pull/462/files#diff-8cbff791167ee8adb175bfeb631d74dadeb386040f14c5a238169f7ba5106f73
rest.py https://github.com/googleapis/python-api-core/pull/462/files#diff-9355b210dc5d75f42434462f3f0aca13acb3bb9bbf993541d5520cb1ec32aa4e
retry.py https://github.com/googleapis/python-api-core/pull/462/files#diff-c118188be6311975226123f406396979b3dbb200e36b425824fba2aa2d675fa7
retry_async.py https://github.com/googleapis/python-api-core/pull/462/files#diff-ed08ac118b7c20706443874d0296972aac7eea464ec013ac7020eafac320adff
timeout.py https://github.com/googleapis/python-api-core/pull/462/files#diff-eb593f229f522aee48e065ac85a221f6bb5d4184189d17170ca8b16e22aa68bb
noxfile.py https://github.com/googleapis/python-api-core/pull/462/files#diff-f7a16a65f061822bcc73b8296f4dc837353d379d8d9cc5307982cb6941442835
test_method_async.py https://github.com/googleapis/python-api-core/pull/462/files#diff-0fe43af876ef09c7d7fb7aa997dcaa7080733f0dbd76a1cdc4bcce0e84c75a95
test_operations_async_client.py https://github.com/googleapis/python-api-core/pull/462/files#diff-0aaf887b283c9bbdd5c511736bc27ea1e6fc066b32ce89007381aef4c03d1024
test_grpc_helpers_async.py https://github.com/googleapis/python-api-core/pull/462/files#diff-674e40c61f15aa7ba281c08b5ae7d3231c02189806f9c3b53b3e9a656815d2c5
test_operation_async.py https://github.com/googleapis/python-api-core/pull/462/files#diff-f3268c9d0afdbc7da7817cf1e4e3e5cbb7e86957529e48ca3e97cd202a289c89
test_retry_async.py https://github.com/googleapis/python-api-core/pull/462/files#diff-7afe2d64bf04b5c175e625d070e4755d8a132129d96de3a5366a80fe97580edd
test_polling.py https://github.com/googleapis/python-api-core/pull/462/files#diff-7e348606c2bc11070698256e05f546f8b97332481eef78a59584d3eec0c91eee
test_method.py https://github.com/googleapis/python-api-core/pull/462/files#diff-84ee6db6f215e230ce9a40a904aa27d74ce059ee9a0ba18711008c555f234a5e
test_operations_client.py https://github.com/googleapis/python-api-core/pull/462/files#diff-b9ecf20afed36970c99084446f9686f9ba3b5d47371a3d152e4de85f28faa8d7
test_operations_rest_client.py https://github.com/googleapis/python-api-core/pull/462/files#diff-c0182c2ab6436bb53b49d3fb9647c04ecebca4f56f5fb8e6fbc7eb0138d6c3e1
test_bidi.py https://github.com/googleapis/python-api-core/pull/462/files#diff-13ad29d4fe411bf57b42bd870cca2c9f33a571814a74693c755e52ad9eefeb49
test_client_info.py https://github.com/googleapis/python-api-core/pull/462/files#diff-bc76737836ee76fc1393fd2807a147ee9421b32a13adf4b9cf5edf4ccab68362
test_exceptions.py https://github.com/googleapis/python-api-core/pull/462/files#diff-e621f60722938a3fc61b7bc5e62f469d2dbc76c797f06861e1cbd32665c36ca3
test_general_helpers.py https://github.com/googleapis/python-api-core/pull/462/files#diff-255090e177071491484a0756be6717fb0b8170a053b03e5a2aefad3c778374cc
test_grpc_helpers.py https://github.com/googleapis/python-api-core/pull/462/files#diff-a2ab7509503191e922431f02fd347dd02debe706b046872c0ee6f41785fd0acb
test_operation.py https://github.com/googleapis/python-api-core/pull/462/files#diff-e062fc388e40a1117a6309996e19501a47839b982e6faa65a6325bbded4f2705
test_retry.py https://github.com/googleapis/python-api-core/pull/462/files#diff-6700a5065875409f1d2b7481bc9c1f6446c347d4266a7f455883b6d9a4fe2855
test_timeout.py https://github.com/googleapis/python-api-core/pull/462/files#diff-111231c4f179ffcbda5628ab92b80c9a4cc31ea0210962f4842948953686dbfc
.github/workflows/lint.ymlhttps://github.com/googleapis/python-api-core/pull/462/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
View file https://github.com/vam-google/python-api-core/blob/e38204128623d9ae33743ee48a5994a3608f5be5/.github/workflows/lint.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/462/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/462/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
https://github.com/googleapis/python-api-core/pull/462/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
.github/workflows/mypy.ymlhttps://github.com/googleapis/python-api-core/pull/462/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
View file https://github.com/vam-google/python-api-core/blob/e38204128623d9ae33743ee48a5994a3608f5be5/.github/workflows/mypy.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/462/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/462/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
https://github.com/googleapis/python-api-core/pull/462/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
google/api_core/extended_operation.pyhttps://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
View file https://github.com/vam-google/python-api-core/blob/e38204128623d9ae33743ee48a5994a3608f5be5/google/api_core/extended_operation.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/462/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
https://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
https://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
https://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
https://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
https://github.com/googleapis/python-api-core/pull/462/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
google/api_core/future/async_future.pyhttps://github.com/googleapis/python-api-core/pull/462/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
View file https://github.com/vam-google/python-api-core/blob/e38204128623d9ae33743ee48a5994a3608f5be5/google/api_core/future/async_future.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/462/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/462/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
https://github.com/googleapis/python-api-core/pull/462/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
google/api_core/future/polling.pyhttps://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
View file https://github.com/vam-google/python-api-core/blob/e38204128623d9ae33743ee48a5994a3608f5be5/google/api_core/future/polling.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/462/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
vchudnov-ghttps://github.com/vchudnov-g
Nov 7, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1015970013
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vam-googlehttps://github.com/vam-google
Nov 8, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1016983032
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
atulephttps://github.com/atulep
Nov 1, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1011007526
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vam-googlehttps://github.com/vam-google
Nov 2, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1012058635
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
atulephttps://github.com/atulep
Nov 2, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1012222852
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vchudnov-ghttps://github.com/vchudnov-g
Nov 7, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1015966335
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vam-googlehttps://github.com/vam-google
Nov 8, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1016939575
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
tswasthttps://github.com/tswast
Dec 14, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1049023009
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
#477https://github.com/googleapis/python-api-core/issues/477
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
sasha-gitghttps://github.com/sasha-gitg
Dec 29, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1058994430
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
googleapis/python-aiplatform#1870https://github.com/googleapis/python-aiplatform/issues/1870
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vam-googlehttps://github.com/vam-google
Jan 9, 2023https://github.com/googleapis/python-api-core/pull/462/files#r1065163165
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vchudnov-ghttps://github.com/vchudnov-g
Nov 7, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1015988583
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vam-googlehttps://github.com/vam-google
Nov 8, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1016988732
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
vchudnov-ghttps://github.com/vchudnov-g
Nov 7, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1015989599
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
vam-googlehttps://github.com/vam-google
Nov 8, 2022https://github.com/googleapis/python-api-core/pull/462/files#r1016989705
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
https://github.com/googleapis/python-api-core/pull/462/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/462/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.