tl; dr : по умолчанию datastoreRpcErrors
будет автоматически использовать 5 повторных попыток.
Я копаю код datastoreio
в луче Python SDK.Похоже, что окончательные мутации сущности сбрасываются в пакетном режиме через DatastoreWriteFn()
.
# Flush the current batch of mutations to Cloud Datastore.
_, latency_ms = helper.write_mutations(
self._datastore, self._project, self._mutations,
self._throttler, self._update_rpc_stats,
throttle_delay=_Mutate._WRITE_BATCH_TARGET_LATENCY_MS/1000)
RPCError перехватывается этим блоком кода в write_mutations
в helper
;и есть декоратор @retry.with_exponential_backoff
для commit
метода;и число повторов по умолчанию установлено на 5;retry_on_rpc_error
определяет конкретные RPCError
и SocketError
причины для запуска повтора.
for mutation in mutations:
commit_request.mutations.add().CopyFrom(mutation)
@retry.with_exponential_backoff(num_retries=5,
retry_filter=retry_on_rpc_error)
def commit(request):
# Client-side throttling.
while throttler.throttle_request(time.time()*1000):
try:
response = datastore.commit(request)
...
except (RPCError, SocketError):
if rpc_stats_callback:
rpc_stats_callback(errors=1)
raise
...