Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1 [RSS Feed]

#1 Сен. 8, 2015 08:37:02

shuhart
Зарегистрирован: 2015-09-08
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

Привет всем!
Обнаружилась проблема в следующей задаче: загрузка файлов размером более 1Гб на ftp находясь за squid прокси. Файлы меньшего размера загружаются без проблем. Сразу скажу, что явно заданных ограничений ни на размер файла, ни на время сессии ни на стороне ftp, ни на стороне прокси нет. Это подтверждается тем, что при использовании ftp-клиента (например, того, который есть в TotalCommander), загрузка проходит успешно. Загружались файлы размером от 1 до 5 Гб.
Вот python-скрипт (за основу взят скрипт из примеров работы pycurl):

# -*- coding: utf-8 -*-
import os, sys
import pycurl
ftp_user_name = "*****"
ftp_user_password = "*****"
proxy = "*****"
proxy_port = *****
proxy_user_name = "*****"
proxy_user_password = "*****"
ftp_destination = "ftp://*****/test.zip"
source_file = "test.zip"
class FileReader:
    def __init__(self, fp):
        self.fp = fp
    def read_callback(self, size):
        return self.fp.read(size)
if not os.path.exists(source_file):
    print("Error: the file '%s' does not exist" % source_file)
    raise SystemExit
c = pycurl.Curl()
c.setopt(pycurl.URL, ftp_destination)
c.setopt(pycurl.UPLOAD, 1)
c.setopt(pycurl.USERPWD, "%s:%s" % (ftp_user_name, ftp_user_password))
c.setopt(pycurl.PROXY, proxy)
c.setopt(pycurl.PROXYPORT, proxy_port)
c.setopt(pycurl.PROXYUSERPWD, "%s:%s" % (proxy_user_name, proxy_user_password))
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.HTTPPROXYTUNNEL, 1)
c.setopt(pycurl.READFUNCTION, FileReader(open(source_file, 'rb')).read_callback)
filesize = os.path.getsize(source_file)
c.setopt(pycurl.INFILESIZE, filesize)
print('Uploading file %s to url %s' % (source_file, ftp_destination))
c.perform()
c.close()
После запуска на ftp загружается ~900Мб данных (каждый раз разный размер) и выдается ообщение:
* Send failure: Connection was aborted
* Closing connection 0
Traceback (most recent call last):
  File ".\file_upload.py", line 39, in <module>
    c.perform()
pycurl.error: (55, 'Send failure: Connection was aborted')
Сталкивался ли кто-либо с подобным? С чем это может быть связано? Можно ли детализировать ошибку?

Офлайн

#2 Сен. 9, 2015 05:00:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9730
Репутация: +  843  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

shuhart
Файлы меньшего размера загружаются без проблем.
Уменьши до 800Mb, посмотри.



Отредактировано py.user.next (Сен. 9, 2015 05:00:29)

Офлайн

#3 Сен. 9, 2015 22:18:50

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

shuhart
Это подтверждается тем, что при использовании ftp-клиента (например, того, который есть в TotalCommander)
Вы можете контролировать что TotalCommander не посылает каждые 10 сек keep alive пакеты?



Офлайн

#4 Сен. 10, 2015 07:10:06

shuhart
Зарегистрирован: 2015-09-08
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

doza_and
Вы можете контролировать что TotalCommander не посылает каждые 10 сек keep alive пакеты?
Думал об этом. Как проверить\проконтролировать, не знаю. Скорее всего что-то в этом роде и происходит. Можно ли организовать подобное поведение для PyCurl?

Офлайн

#5 Сен. 10, 2015 12:50:01

shuhart
Зарегистрирован: 2015-09-08
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

Удалось найти решение обходным путём!
Оказалось, что соединение закрывалось по истечени времени, определенном в параметре read_timeout squid'а. По умолчанию значение параметра: 15 минут. После увеличения временного интервала, появилась возможность при помощи pycurl “успевать” копировать на ftp файлы бОльшего размера.
Всем спасибо! Тему можно закрывать.

Отредактировано shuhart (Сен. 10, 2015 12:50:29)

Офлайн

#6 Сен. 14, 2015 15:29:18

shuhart
Зарегистрирован: 2015-09-08
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

Как оказалось, тему закрывать рано. Вылез ещё один “косяк”.
Обнаружилось, что файл загружается не полностью. Сравнивались размеры и CRC. При сравнении файлов по содержимому выяснилось, что какое-то кол-во байт “конца” файла не загружается на ftp-сервер. При чем от размера файла это не зависит.
Код скрипта такой же как и в тексте темы.
Не связано ли это с тем что, что машина под x64, а python (ну, и, соответственно, pycurl) 32-х разрядный?

Офлайн

#7 Сен. 14, 2015 21:36:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

shuhart
Не связано ли это с тем что, что машина под x64, а python (ну, и, соответственно, pycurl) 32-х разрядный?
Очень сомневаюсь. А сколько байт не догружается?



Офлайн

#8 Сен. 15, 2015 01:06:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9730
Репутация: +  843  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

shuhart
Обнаружилось, что файл загружается не полностью. Сравнивались размеры и CRC.
Возьми 800-метровый файл, посчитай у него md5, выгрузи и сравни.



Офлайн

#9 Сен. 15, 2015 08:00:17

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

py.user.next
посчитай у него md5, выгрузи и сравни.
А что это даст? Если воспользоваться утилитами сравнения то больше информации получится. Под windows fc /b file1 file2,winmerge под unix diff, cmp -l, vbindiff, dhex, Jdiff,meld



Отредактировано doza_and (Сен. 15, 2015 08:02:11)

Офлайн

#10 Сен. 15, 2015 11:07:35

shuhart
Зарегистрирован: 2015-09-08
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1

Прикрепил скрин из winmerge. Слева оригинал, справа файл с ftp.
Что-то пока не понимаю, в какую сторону копать. То ли прокся где-то мешает, то ли что-то с параметрами режима работы pycurl. А может стоит искать другой инструмент для этой задачи.

Отредактировано shuhart (Сен. 15, 2015 11:09:21)

Прикреплённый файлы:
attachment diff.PNG (59,4 KБ)

Офлайн

  • Начало
  • » Network
  • » Загрузка больших файлов на ftp через squid с авторизацией с использованием pycurl 7.19.5.1[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version