Ошибка Firestore: слишком много разногласий по этим документам, попробуйте еще раз - PullRequest
0 голосов
/ 05 мая 2020

Я использую Google Cloud Firestore для сохранения некоторых документов с помощью сценария Python. В Cloud Firestore мои данные разделены на коллекции и документы. Документы указывают на вложенные коллекции, содержащие другие документы (группу коллекций). Я выполняю несколько операций записи как один пакет ( ссылка на документацию), но иногда получаю такую ​​ошибку:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/google/api_core/grpc_helpers.py", line 57, in error_remapped_callable
    return callable_(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/grpc/_channel.py", line 690, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/usr/local/lib/python3.7/dist-packages/grpc/_channel.py", line 592, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
    status = StatusCode.ABORTED
    details = "Too much contention on these documents. Please try again."
    debug_error_string = "{"created":"@1587693610.322629065","description":"Error received from peer ipv4:173.194.76.95:443","file":"src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Too much contention on these documents. Please try again.","grpc_status":10}"

Для сохранения документов группы коллекции я использую следующую :

from google.cloud import firestore  #1.6.0
import time

def save(docs):
    """saving in Firestore using collection_group"""

    #chunk of 500 (batch commit does not support more than 500 savings at a time)
    docs_chunk=[docs[i:i+499] for i in range(0, len(docs), 500)]
    db = firestore.Client()
    for c in docs_chunk:
        batch = db.batch()
        for doc in c:
            c = db.collection('COLLECTION_NAME').document('DOCUMENT_NAME').collection('SUB_COLLECTION_NAME').document('SUB_DOCUMENT_NAME')
            batch.set(c, doc)
        batch.commit()
        time.sleep(5)

Что означает эта ошибка? Иногда, если я перезапускаю скрипт, ошибка больше не возникает.

...