b2-sdk-python icon indicating copy to clipboard operation
b2-sdk-python copied to clipboard

b2sdk UploadTokenUsedConcurrently

Open mjurbanski-reef opened this issue 1 year ago • 0 comments

To utilize b2sdk under asyncio, I'm running it under threadpool executor, but strangely enough, error occurred once per server and not multiple times on a single server (I have ~80 of them running this code, and they upload a file every other minute). Error occurred on around 2023-11-16T04:59:14.000Z on 3 servers. Posting that info, since all my servers reported the same token in the exception, which seems to indicate b2 API server bug.

UploadTokenUsedConcurrently: More than one concurrent upload using auth token 4_005fREDACTED_01b061e5_0b1c7c_uplg_-OREDACTEDgux4J-REDACTED4hORgY=
  File "concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "myapp/worker/tasks_b2.py", line 179, in process_datasource_dir
    return _process_datasource_dir(datasource_dir, claimed_datasource_ids, datasource_id=datasource_id)
  File "myapp/worker/tasks_b2.py", line 219, in _process_datasource_dir
    chunk_data = _upload_merged_chunks(
  File "myapp/worker/tasks_b2.py", line 242, in _upload_merged_chunks
    upload_url = process_upload(BUCKET_dataS, data_file_merged, datasource_id, data_bucket_path)
  File "myapp/worker/tasks_b2.py", line 96, in process_upload
    upload_result = bucket.upload_local_file(
  File "logfury/_logfury/trace_call.py", line 86, in wrapper
    return function(*wrapee_args, **wrapee_kwargs)
  File "b2sdk/version_utils.py", line 116, in wrapper
    return func(*args, **kwargs)
  File "b2sdk/v2/bucket.py", line 83, in upload_local_file
    return super().upload_local_file(
  File "logfury/_logfury/trace_call.py", line 86, in wrapper
    return function(*wrapee_args, **wrapee_kwargs)
  File "b2sdk/bucket.py", line 592, in upload_local_file
    return self.concatenate(
  File "logfury/_logfury/trace_call.py", line 86, in wrapper
    return function(*wrapee_args, **wrapee_kwargs)
  File "b2sdk/bucket.py", line 1018, in concatenate
    return self.create_file(
  File "logfury/_logfury/trace_call.py", line 86, in wrapper
    return function(*wrapee_args, **wrapee_kwargs)
  File "b2sdk/bucket.py", line 842, in create_file
    return self._create_file(
  File "b2sdk/bucket.py", line 953, in _create_file
    return emerger_method(
  File "logfury/_logfury/trace_call.py", line 86, in wrapper
    return function(*wrapee_args, **wrapee_kwargs)
  File "b2sdk/transfer/emerge/emerger.py", line 177, in emerge
    return self._emerge(
  File "b2sdk/transfer/emerge/emerger.py", line 116, in _emerge
    return self.emerge_executor.execute_emerge_plan(
  File "b2sdk/transfer/emerge/executor.py", line 85, in execute_emerge_plan
    return execution.execute_plan(emerge_plan)
  File "b2sdk/transfer/emerge/executor.py", line 241, in execute_plan
    part_sha1_array = [f.result()['contentSha1'] for f in part_futures]
  File "b2sdk/transfer/emerge/executor.py", line 241, in <listcomp>
    part_sha1_array = [f.result()['contentSha1'] for f in part_futures]
  File "concurrent/futures/_base.py", line 456, in result
    return self.__get_result()
  File "concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "b2sdk/transfer/outbound/upload_manager.py", line 170, in _upload_part
    response = self.services.session.upload_part(
  File "b2sdk/session.py", line 386, in upload_part
    return self._wrap_token(
  File "b2sdk/session.py", line 462, in _wrap_token
    return self._reauthorization_loop(partial_callback)
  File "b2sdk/session.py", line 477, in _reauthorization_loop
    return callback()
  File "b2sdk/session.py", line 552, in _upload_part
    response = f(upload_url, upload_auth_token, *args, **kwargs)
  File "b2sdk/raw_api.py", line 998, in upload_part
    return self.b2_http.post_content_return_json(upload_url, headers, data_stream)
  File "b2sdk/b2http.py", line 262, in post_content_return_json
    response = self._translate_and_retry(do_post, try_count, post_params)
  File "b2sdk/b2http.py", line 507, in _translate_and_retry
    return cls._translate_errors(fcn, post_params)
  File "b2sdk/b2http.py", line 431, in _translate_errors

mjurbanski-reef avatar Nov 16 '23 07:11 mjurbanski-reef