files_upload_v2 should respect the retry handlers
Mantenedores costumam responder em até 5 dias
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 52/100
Direção de pesquisa
Comece em slack_sdk/web/async_client.py, em files_upload_v2 e na etapa _upload_file, depois compare o tratamento de retry usado por api_call nas etapas (1) e (3). Analise também a implementação síncrona de WebClient. O trabalho estará concluído quando erros HTTP transitórios durante o POST do arquivo usarem os handlers de retry existentes do cliente, em vez de escaparem diretamente para o chamador.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
The WebClient (and async version of the same) have the convenience method files_upload_v2 that does the three step process for uploading a file using the "new" style: call getUploadURLExternal, POST the file to that URL, then call completeUploadExternal. For steps (1) and (3), the call goes through api_call so will respect the retry handlers that are available on the client itself. However, step (2) is not covered by the retry handlers, so transient HTTP errors can escape up to the caller, who could only retry the entire operation (and would need to implement retry support from scratch, not using the retry system available in the SDK).
This started coming up for us recently. We are seeing 2-6 HTTP 504 errors per day in the _upload_file internal call. Here's an example from our logs, showing the timing (all times EDT). It looks like about 30 seconds from the upload starting to the exception being raised from the SDK:
20260406 16:34:46.349 INFO txn 85 </rpc.slackmessenger.SlackMessenger/SendSlackThread: 75978> processing request from ('<ip>', <port>)
20260406 16:34:46.350 INFO pylib3.slackmessenger.basic 466 </rpc.slackmessenger.SlackMessenger/SendSlackThread: 75978> SendSlackThread()
20260406 16:34:46.350 INFO root 281 </rpc.slackmessenger.SlackMessenger/SendSlackThread: 75978> Channel '@<user> resolved to User IDs ['U<uid>'].
20260406 16:34:46.351 INFO pylib3.slackmessenger.basic 112 </rpc.slackmessenger.SlackMessenger/SendSlackThread: 75978> Uploading a file with title=Test result summary, filetype=text, filename=Test_result_summary.txt, type=text
20260406 16:35:17.740 ERROR pylib3.rpc.servers.exceptions_and_metadata 274 </rpc.slackmessenger.SlackMessenger/SendSlackThread: 75978> The following exception was propagated to the client:
Traceback (most recent call last):
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/rpc/servers/exceptions_and_metadata.py", line 248, in handle_exceptions_and_metadata_asyncio
yield
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/rpc/servers/service_base.py", line 347, in method_wrapper_asyncio
yield
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/rpc/servers/service_base.py", line 355, in wrapper
await method(stream)
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/rpc/servers/trio_decorators.py", line 122, in aio_rpc_handler
stream, await trio_as_aio(rpc_func)(self, request, metadata)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/trio_asyncio/_handles.py", line 148, in _run
res = await self._callback(*self._args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/slackmessenger/basic.py", line 472, in SendSlackThread
return await self._send_slack_thread(message_state, request.messages)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/slackmessenger/basic.py", line 452, in _send_slack_thread
await message_state.direct_send(first_message, self.slack_client)
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/slackmessenger/basic.py", line 138, in direct_send
permalink = await self._upload_file(slack_client, message.new_file)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/trio_asyncio/_adapter.py", line 54, in __call__
return await self.loop.run_aio_coroutine(f)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/trio_asyncio/_base.py", line 225, in run_aio_coroutine
return await run_aio_future(fut)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/trio_asyncio/_util.py", line 43, in run_aio_future
res = await trio.lowlevel.wait_task_rescheduled(abort_cb)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/trio/_core/_traps.py", line 178, in wait_task_rescheduled
return (await _async_yield(WaitTaskRescheduled(abort_func))).unwrap()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/outcome/_impl.py", line 213, in unwrap
raise captured_error
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/trio_asyncio/_adapter.py", line 17, in _call_defer
return await proc(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/mnt/macaroon_binaries/obin/obin-bamboo/20260405233709/pylib3/slackmessenger/basic.py", line 119, in _upload_file
uploaded = await slack_client.files_upload_v2(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/venvs/opsvenv2/lib/python3.11/site-packages/slack_sdk/web/async_client.py", line 3844, in files_upload_v2
raise e.SlackRequestError(message)
slack_sdk.errors.SlackRequestError: Failed to upload a file (status: 504, body: None, filename: Test_result_summary.txt, title: Test result summary)
Can you consider an enhancement to _upload_file to have it use the same retry system? Do you have other advice for handling or avoiding this situation? I will also open a support request to understand why this has started happening more often.
Category
- slack_sdk.web.WebClient (sync/async) (Web API client)
- Linguagem predominante
- Python
- Estrelas
- 4k
- Forks
- 861
- Merge médio
- 3d 17h
- PRs com merge (30d)
- 10
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de slackapi/python-slack-sdk
-
Missing method from SDK // admin.users.getExpirationTalvez já em andamento @srtaalej assumiu há 2 dias. Abertabug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
slackapi/python-slack-sdk#1982 · 1 comentário ·
Mantenedores costumam responder em até 5 dias
-
auto-triage-stale needs info server-side-issue
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
slackapi/python-slack-sdk#1961 · 4 comentários ·
Mantenedores costumam responder em até 5 dias
-
auto-triage-skip discussion
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
slackapi/python-slack-sdk#1940 · 2 comentários ·
Mantenedores costumam responder em até 5 dias
-
chat_postMessage silently forwards thread_id to the API, so a threaded reply posts to the channelAbertaauto-triage-skip enhancement
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
slackapi/python-slack-sdk#1923 · 2 comentários ·
Mantenedores costumam responder em até 5 dias
-
auto-triage-skip bug server-side-issue
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 68/100
slackapi/python-slack-sdk#1847 · 5 comentários ·
Mantenedores costumam responder em até 5 dias
Todas as issues de slackapi/python-slack-sdk
Issues semelhantes
-
bug Triage-Needed
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
FuRongJun-1999/dsh-memory#170 ·
Mantenedores costumam responder em até 1 dia
-
[开源推荐] 打拼音就出篆书的输入法,附古文字创作小工具Aberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 82/100
521xueweihan/HelloGitHub#3940 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100