Closed
Description
Environment details
- OS type and version:
Debian 5.18.16
- Python version:
Python 3.10.7
- pip version:
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
- google-api-core version:
2.10.1
Steps to reproduce
- Use any GCP API that returns LRO
- Use
operation.result
method call with customretry
parameter - This method will return ~60 seconds after actual operation finishes, while it should not have more than 10 seconds of overhead with custom retry policy (see below)
Code example
from google.api_core import retry
from google.cloud import dataproc_v1
from google.api_core.client_options import ClientOptions
import time
project = '. . .'
region = 'us-central1'
# Create Dataproc batch
client_options = ClientOptions(api_endpoint="{}-dataproc.googleapis.com:443".format(region))
client = dataproc_v1.BatchControllerClient(client_options=client_options)
batch = dataproc_v1.Batch()
batch.spark_batch.main_class = 'org.apache.spark.examples.SparkPi'
batch.spark_batch.jar_file_uris = [
'file:///usr/lib/spark/examples/jars/spark-examples.jar',
]
batch.spark_batch.args = ['1']
batch.runtime_config.properties = {
'spark.executor.instances': '2',
}
parent = f"projects/{project}/locations/{region}"
request = dataproc_v1.CreateBatchRequest(
parent=parent, # type: ignore
batch=batch, # type: ignore
)
# Make the request
print("Creating batch")
operation = client.create_batch(request=request) # type: ignore
print("Batch created")
# This takes quite a while, waiting on GCP response to resolve
retry = retry.Retry(initial=10, maximum=10, multiplier=1.0, deadline=600)
start = time.time()
response = operation.result(retry=retry)
print("Batch finished")
print(f"Took {time.time() - start} seconds to finish batch job")
print(response)
After replacing response = operation.result(retry=retry)
call with custom wait/retry logic operation completion will be detected as expected:
while not operation.done(retry=None):
time.sleep(10)
response = operation.metadata