Ошибка клиента Mercurial 255 и ошибка HTTP 404 при попытке отправить большие файлы на сервер - PullRequest
30 голосов
/ 18 июня 2010

Проблема:

19/06/10 Обновление: Больше проблем с доказательствами на стороне сервера. Получение этой ошибки в командной строке Windows 7 (полный обратный вызов см. Ниже):

URLError: <urlopen error [Errno 10054] An existing connection was forcibly closed by the remote host>
    abort: error: An existing connection was forcibly closed by the remote host

При попытке отправить набор изменений, который содержит 6 больших файлов (.exe, .dmg и т. Д.), На мой удаленный сервер, мой клиент (MacHG) сообщает об ошибке:

"Ошибка во время Push. Сообщено Mercurial ошибка номер 255: прервать: ошибка HTTP 404: не найдено "

Что вообще означает ошибка ?! Единственное, что уникально (что я могу сказать) об этом коммите, это размер, тип и имена файлов. Как определить, какой именно файл в наборе изменений не работает? Как я могу удалить поврежденную ревизию из репозитория? В другом посте кто-то сообщал об использовании расширений "mq" для эффективного удаления ошибочного набора изменений из истории в репозитории, но mq выглядит слишком сложным для того, что я пытаюсь решить.


Справочная информация:

Я могу отправлять и извлекать следующее: исходные файлы, каталоги, файлы .class и файл .jar на сервер и с сервера, используя MacHG и toirtoise HG.

Я успешно ввел в свой локальный репозиторий первое добавление 6 больших установочных файлов .exe, .dmg и т. Д. (Всего около 130 МБ).

В следующем коммите к моему локальному репозиторию я удалил («не отслеживал» / забыл) 6 файлов, вызывающих проблему, однако предыдущая (неудачная) ревизия все еще ставится в очередь для отправки на сервер (т.е. мой локальный хост пытаясь нажать «добавить», а затем «удалить» на удаленном сервере - и придерживаться принципа «держать все в истории» системы контроля версий).

Я могу фиксировать .txt .java файлы и т. Д. С помощью TortoiseHG с ПК с Windows. На самом деле я не тестировал фиксацию или отправку одинаковых больших файлов с помощью TortoiseHG.

Пожалуйста, помогите!


Установка:

Клиентские приложения = MacHG v0.9.7 (SCM 1.5.4) и TortoiseHG v1.0.4 (SCM 1.5.4)

Сервер = HTTPS, IIS7.5, Mercurial 1.5.4, Python 2.6.5, настройка с использованием следующих инструкций:

http://www.jeremyskinner.co.uk/mercurial-on-iis7/

В IIS7.5 обработчик CGI сконфигурирован для обработки ВСЕХ глаголов (не только GET, POST и HEAD).

Мой файл hgweb.cgi на сервере выглядит следующим образом:

#!/usr/bin/env python
#
# An example hgweb CGI script, edit as necessary

# Path to repo or hgweb config to serve (see 'hg help hgweb')
#config = "/path/to/repo/or/config"

# Uncomment and adjust if Mercurial is not installed system-wide:
#import sys; sys.path.insert(0, "/path/to/python/lib")

# Uncomment to send python tracebacks to the browser if an error occurs:
#import cgitb; cgitb.enable()

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb('C:\inetpub\wwwroot\hg\hgweb.config')
wsgicgi.launch(application)

Мой файл hgweb.config на сервере выглядит следующим образом:

[collections]
C:\Mercurial Repositories = C:\Mercurial Repositories

[web]
baseurl = /hg
allow_push = usernamea
allow_push = usernameb

Вывод из командной строки из моего macbook (установлены и Mercurial, и MacHG) с использованием флагов -v и --trackback:

macbook15:hgrepos coderunner$ hg -v --traceback push
pushing to https://coderunner:***@hg.mydomain.com.au/hg/hgrepos
searching for changes
3 changesets found
Traceback (most recent call last):
  File "/Library/Python/2.6/site-packages/mercurial/dispatch.py", line 50, in _runcatch
    return _dispatch(ui, args)
  File "/Library/Python/2.6/site-packages/mercurial/dispatch.py", line 471, in _dispatch
    return runcommand(lui, repo, cmd, fullargs, ui, options, d)
  File "/Library/Python/2.6/site-packages/mercurial/dispatch.py", line 341, in runcommand
    ret = _runcommand(ui, options, cmd, d)
  File "/Library/Python/2.6/site-packages/mercurial/dispatch.py", line 522, in _runcommand
    return checkargs()
  File "/Library/Python/2.6/site-packages/mercurial/dispatch.py", line 476, in checkargs
    return cmdfunc()
  File "/Library/Python/2.6/site-packages/mercurial/dispatch.py", line 470, in <lambda>
    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
  File "/Library/Python/2.6/site-packages/mercurial/util.py", line 401, in check
    return func(*args, **kwargs)
  File "/Library/Python/2.6/site-packages/mercurial/commands.py", line 2462, in push
    r = repo.push(other, opts.get('force'), revs=revs)
  File "/Library/Python/2.6/site-packages/mercurial/localrepo.py", line 1491, in push
    return self.push_unbundle(remote, force, revs)
  File "/Library/Python/2.6/site-packages/mercurial/localrepo.py", line 1636, in push_unbundle
    return remote.unbundle(cg, remote_heads, 'push')
  File "/Library/Python/2.6/site-packages/mercurial/httprepo.py", line 235, in unbundle
    heads=' '.join(map(hex, heads)))
  File "/Library/Python/2.6/site-packages/mercurial/httprepo.py", line 134, in do_read
    fp = self.do_cmd(cmd, **args)
  File "/Library/Python/2.6/site-packages/mercurial/httprepo.py", line 85, in do_cmd
    resp = self.urlopener.open(req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 389, in open
    response = meth(req, response)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 502, in http_response
    'http', request, response, code, msg, hdrs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 427, in error
    return self._call_chain(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 361, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 510, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 404: Not Found
abort: HTTP Error 404: Not Found
macbook15:hgrepos coderunner$ 

Вывод с хоста Windows 7 (на котором установлен только TortoiseHG), который пытается отправить те же файлы на сервер (другой набор изменений, но содержит те же 6 добавлений файлов, что и набор изменений, загружаемый из macbook)

c:\repositories\hgrepos>hg -v --traceback push
pushing to https://coderunner:***@hg.mydomain.com.au/hg/hgrepos
searching for changes
1 changesets found
Traceback (most recent call last):
  File "mercurial\dispatch.pyo", line 50, in _runcatch
  File "mercurial\dispatch.pyo", line 471, in _dispatch
  File "mercurial\dispatch.pyo", line 341, in runcommand
  File "mercurial\dispatch.pyo", line 522, in _runcommand
  File "mercurial\dispatch.pyo", line 476, in checkargs
  File "mercurial\dispatch.pyo", line 470, in <lambda>
  File "mercurial\util.pyo", line 401, in check
  File "mercurial\commands.pyo", line 2462, in push
  File "mercurial\localrepo.pyo", line 1491, in push
  File "mercurial\localrepo.pyo", line 1636, in push_unbundle
  File "mercurial\httprepo.pyo", line 235, in unbundle
  File "mercurial\httprepo.pyo", line 134, in do_read
  File "mercurial\httprepo.pyo", line 85, in do_cmd
  File "urllib2.pyo", line 389, in open
  File "urllib2.pyo", line 407, in _open
  File "urllib2.pyo", line 367, in _call_chain
  File "mercurial\url.pyo", line 523, in https_open
  File "mercurial\keepalive.pyo", line 259, in do_open
URLError: <urlopen error [Errno 10054] An existing connection was forcibly closed by the remote host>
abort: error: An existing connection was forcibly closed by the remote host

c:\repositories\hgrepos>

Это вопрос поддержания жизни? IIS7.5 виноват? Python 2.6.5 виноват?

Ответы [ 4 ]

51 голосов
/ 20 июня 2010

Прошел через те же болевые точки ...

При настройках по умолчанию на сервере IIS вы не сможете отправить большие репозитории на сервер, так как максимальная длина запроса IIS по умолчанию составляет только4 МБ и время ожидания для CGI-скриптов 15 минут, что делает невозможным загрузку больших файлов.Чтобы разрешить загрузку больших файлов (а это нелегко найти в Интернете ...), выполните следующие действия:
1. В диспетчере IIS щелкните узел веб-сайта и нажмите ссылку Ограничения ...
2. Затем укажите достаточно большое время ожидания соединения (я выбрал 1 час здесь, или 3600 секунд)
3. Затем щелкните узел, содержащий hg (согласно процедуре установки), затем дважды щелкните CGI * 1006.* 4. Укажите достаточно длительное время ожидания для сценариев CGI (например, 10 часов)

Теперь отредактируйте C: \ inetpub \ wwwroot \ hg \ web.config, чтобы у него был новый <security>раздел под <system.webserver> и спецификация <httpRuntime> под <system.web>:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
[…]
    <security>
         <requestFiltering>
           <requestLimits maxAllowedContentLength ="2147482624" />
      </requestFiltering>
    </security>
  </system.webServer>
  <system.web>
    <httpRuntime
      executionTimeout="540000" maxRequestLength="2097151"/>
  </system.web>
</configuration>

Указывает таймаут http чуть более 6 дней и максимальный лимит загрузки около 2 ГБ.

6 голосов
/ 23 февраля 2011

Возникла та же проблема с использованием IIS 7 в качестве сервера. Попробовал решение выше, которое решило проблему с ошибкой 255, но все равно получил Errorno 10054 с большими файлами. Затем я увеличил время ожидания подключения в IIS, которое сработало.

Чтобы изменить: Веб-сайт -> Управление веб-сайтом -> Расширенные настройки -> Ограничения подключения -> Время ожидания подключения. По умолчанию это 2 минуты. Поменял мой на 20 минут и все заработало.

Не уверен, почему это работает, но кажется, что Mercurial устанавливает соединение с сервером, занимает некоторое время для обработки больших файлов, а затем только отправляет запрос. К тому времени IIS отключил клиента.

0 голосов
/ 28 июня 2013

Я просто публикую это сообщение для всех, кто входит в эту тему из поиска.

В настоящее время существует проблема с использованием расширения largefiles в модуле python mercurial при размещении через IIS.См. этот пост , если вы столкнулись с проблемами при передаче больших наборов изменений (или больших файлов) в IIS через TortoiseHg.

В конечном итоге проблема заключается в ошибке обработки SSL, представленной в Python 2.7.3 (вероятно, объясняет, почему существует так много нерешенных сообщений людей, которые ищут проблемы с Mercurial).Откат к Python 2.7.2 позволил мне продвинуться немного дальше (заблокировано при толчках 30 МБ вместо 15 МБ), но для правильного решения проблемы мне пришлось установить утилиту IISCrypto , чтобы полностью отключить передачу по SSLv2.

0 голосов
/ 08 апреля 2013

Хорошо, ваше решение сделало это!
У меня уже был тег requestLimits, подобный этому:
<requestLimits maxUrl="16384" maxQueryString="65536" />
поэтому я добавил к нему maxAllowedContentLength = "524288000" следующим образом:
<requestLimits maxUrl="16384" maxQueryString="65536" maxAllowedContentLength ="524288000" />
И это сделал!

...