ivknv/yadisk

Падает при загрузке на диск больших файлов

maxifly opened this issue · 7 comments

Файл вот такого размера
-rw-rw-r-- 1 maxim maxim 99194880 Jan 12 01:04 cb7d9207.tar

Код метода
def upload_file():
print('Start') # Press Ctrl+F8 to toggle the breakpoint.

y = yadisk.YaDisk(token=TOKEN)
print(y.get_disk_info())

y.upload('/home/maxim/.homeassistant/backups/cb7d9207.tar', '/ha_test/Core 2023.1.0.dev12.tar', overwrite=True, n_retries=3, retry_interval=5.0)

Текст ошибки
Traceback (most recent call last):
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 703, in urlopen
httplib_response = self._make_request(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 398, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/usr/lib/python3.10/http/client.py", line 1282, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1328, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1277, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1076, in _send_output
self.send(chunk)
File "/usr/lib/python3.10/http/client.py", line 998, in send
self.sock.sendall(data)
File "/usr/lib/python3.10/ssl.py", line 1237, in sendall
v = self.send(byte_view[count:])
File "/usr/lib/python3.10/ssl.py", line 1206, in send
return self._sslobj.write(data)
TimeoutError: The write operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/adapters.py", line 489, in send
resp = conn.urlopen(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 787, in urlopen
retries = retries.increment(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/util/retry.py", line 550, in increment
raise six.reraise(type(error), error, _stacktrace)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/packages/six.py", line 769, in reraise
raise value.with_traceback(tb)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 703, in urlopen
httplib_response = self._make_request(
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 398, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/usr/lib/python3.10/http/client.py", line 1282, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1328, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1277, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1076, in _send_output
self.send(chunk)
File "/usr/lib/python3.10/http/client.py", line 998, in send
self.sock.sendall(data)
File "/usr/lib/python3.10/ssl.py", line 1237, in sendall
v = self.send(byte_view[count:])
File "/usr/lib/python3.10/ssl.py", line 1206, in send
return self._sslobj.write(data)
urllib3.exceptions.ProtocolError: ('Connection aborted.', TimeoutError('The write operation timed out'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/maxim/Work/yaBackup/main.py", line 45, in
upload_file()
File "/home/maxim/Work/yaBackup/main.py", line 20, in upload_file
y.upload('/home/maxim/.homeassistant/backups/cb7d9207.tar', '/ha_test/Core 2023.1.0.dev12.tar', overwrite=True, n_retries=3, retry_interval=5.0)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/yadisk.py", line 313, in upload
functions.upload(self.get_session(), path_or_file, dst_path, **kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/functions/resources.py", line 465, in upload
auto_retry(attempt, n_retries, retry_interval)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/utils.py", line 88, in auto_retry
raise e
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/utils.py", line 85, in auto_retry
return func()
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/yadisk/functions/resources.py", line 461, in attempt
with contextlib.closing(session.put(link, data=file, **temp_kwargs)) as response:
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/sessions.py", line 647, in put
return self.request("PUT", url, data=data, **kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/sessions.py", line 587, in request
resp = self.send(prep, **send_kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/sessions.py", line 701, in send
r = adapter.send(request, **kwargs)
File "/home/maxim/Work/yaBackup/venv/lib/python3.10/site-packages/requests/adapters.py", line 547, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', TimeoutError('The write operation timed out'))

Process finished with exit code 1

ivknv commented

Это известный нюанс Яндекс.Диска (см. #11, #12). Для загрузки больших файлов нужно подбирать увеличенный таймаут.

А это таймаут чего? Ожидания загрузки ВСЕГО файла или файл режется на чанки и это таймаут чанка и просто когда чанков много Яндекс с каждым чанком всё медленне обрабатывает запросы?

ivknv commented

Речь идет о read timeout. После полной загрузки файла Яндекс.Диск делает какую-то обработку (возможно вычисление хэш-сумм файла или что-то в этом роде). Из-за этого PUT запрос может долго висеть, на больших файлах это проявляется особенно сильно.

Да. Мне помогло.
Ещё я порылся по закрытым багам, нашёл, что можно расширение у файла не указывать, либо указывать левое. Типа xxx или что-то такое.. Тоже помогает. 90Мб Моментально в этом случае грузятся.

Наверное стоит про таймаут и расширение в документации указать. А то такие баги будут часто регистрировать.

ivknv commented

Мда, учитывая что все эти приколы Яндекс.Диска несколько лет уже как не исправляют, похоже и правда пора отдельный пункт добавить в документацию.

ivknv commented

Теперь про эту проблему есть пункт в документации. Там описано что это такое и что с этим делать.

Круто, Только исправьте "оффициальный" на "официальный" (мелочь, но юудет лучше)