2010-06-18 21 views
30

Problema:

19/06/10 Actualización: hay más problemas de evidencia en el servidor. Recibir este error en la línea de comandos de Windows 7 (ver más abajo para la plena rastreo):Mercurial cliente error 255 y HTTP error 404 al intentar enviar archivos de gran tamaño al servidor

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 

Al intentar empujar un conjunto de cambios que contiene 6 archivos de gran tamaño (.exe, .dmg, etc) a mi servidor remoto a mi cliente (MacHG) informa el error:

"Error During Push. Mercurial reported error number 255: abort: HTTP Error 404: Not Found"

¿Qué significa el error ?! Lo único único (que puedo decir) sobre este compromiso es el tamaño, el tipo y los nombres de archivo de los archivos. ¿Cómo puedo determinar qué archivo exacto dentro del conjunto de cambios está fallando? ¿Cómo puedo eliminar el conjunto de cambios corruptos del repositorio? En una publicación diferente, alguien reportó usar extensiones "mq" para eliminar de manera efectiva un conjunto de cambios erróneos del historial dentro de un repositorio, pero mq parece demasiado complicado para lo que estoy tratando de resolver.


Antecedentes:

puedo empujar y tirar lo siguiente: archivos de origen, directorios, archivos .class y un archivo .jar hacia y desde el servidor, utilizando tanto MachG y toirtoise HG.

Me he comprometido con éxito en mi repositorio local, añadiendo por primera vez los 6 archivos de instalador de .exe, .dmg, etc. (aproximadamente 130 MB en total).

En el siguiente commit a mi repositorio local, eliminé ("untracked"/forget) los 6 archivos que causan el problema, sin embargo el conjunto de cambios anterior (fallido) todavía está en cola para ser enviado al servidor (es decir, mi host local está intentando presionar "agregar" y luego "eliminar" al servidor remoto, y mantenerse alineado con la filosofía "mantener todo en la historia" del sistema de control de origen).

Puedo enviar archivos .txt .java, etc. utilizando TortoiseHG desde PC con Windows. En realidad, no he probado la confirmación o el envío de los mismos archivos de gran tamaño con TortoiseHG.

Por favor ayuda!


Configuración:

Las aplicaciones de cliente = MachG v0.9.7 (SCM 1.5.4), y v1.0.4 TortoiseHG (SCM 1.5.4)

Servidor = HTTPS, IIS7.5, Mercurial 1.5.4, Python 2.6.5, configuración mediante estas instrucciones:

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

En IIS7.5 el controlador CGI está configurado para gestionar todos los verbos (no sólo GET, POST y HEAD).

Mi archivo hgweb.cgi en el servidor es la siguiente:

#!/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) 

Mi hgweb.archivo de configuración en el servidor es la siguiente:

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

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

salida de la línea de comandos de mi macbook (tanto Mercurial y MachG instalados) usando -v y banderas --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$ 

salida desde Windows 7 host (sólo ha instalado TortoiseHG) intentar empujar los mismos archivos en el servidor (diferente changset, pero contiene los mismos 6 adiciones de archivo como el conjunto de cambios siendo empujados desde el 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> 

¿Es un problema para mantenerse vivo? ¿IIS7.5 tiene la culpa? Python 2.6.5 en la falla?

+3

Otra fuente de información es ejecutar desde la línea de comandos y pase el -v y banderas --traceback: hg -v --traceback empujar –

Respuesta

50

pasó por los mismos puntos de dolor ...

Con la configuración predeterminada en el servidor IIS, usted no será capaz de empujar grandes repositorios para el servidor, como IIS tiene un máximo predeterminado petición longitud de tan sólo 4 MB, y un tiempo de espera para secuencias de comandos CGI de 15 minutos, por lo que es imposible cargar archivos de gran tamaño. Para habilitar la carga de archivos grandes (y esto no es fácil de encontrar en la web ...), haga lo siguiente:
1. En el Administrador de IIS, haga clic en el nodo del sitio web y haga clic en el enlace Límites ...
2. A continuación, especificar un tiempo de espera de conexión suficientemente grande (elegí 1 hora aquí, o 3600 segundos)
3. A continuación, haga clic en el nodo que contiene Hg (según el procedimiento de instalación), haga doble clic en CGI
4. Especificar un suficientemente largo tiempo para secuencias de comandos CGI (por ejemplo, 10 horas)

Ahora, editar C: \ inetpub \ wwwroot \ hg \ web.config, de modo que tenga una nueva sección <security> bajo <system.webserver> y una especificación <httpRuntime> bajo <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> 

Esto especifica un tiempo de espera de HTTP de un poco más de 6 días y un límite máximo de carga de alrededor de 2 GB.

+2

Esto funcionó perfectamente para mí. ¡Gracias por tu contribución! –

+0

Gracias por publicar su solución. Solo lo he probado parcialmente hasta el momento. Hasta ahora todo va bien, ya que el problema no ocurre tanto, pero todavía está ocurriendo. Probaré en los próximos días y publicaré mis resultados pronto. – coderunner

+0

Su solución ayudó un poco, pero no completamente. Ahora puedo empujar aproximadamente 300Mb con éxito, pero solo a través de la línea de comandos en Mac OS 10.6.4 y Win7. El impulso de 300Mb falla tanto en MacHG como en TortoiseHG. He probado una inserción de 1.3GB de 5000 archivos, que van desde 1kB hasta 600MB. Falló, con IIS7.5 que devuelve "Error 502 - puerta de enlace incorrecta". Según la documentación de IIS, esto significa que la secuencia de comandos CGI devolvió una respuesta HTTP incorrecta. – coderunner

6

Tuve el mismo problema al utilizar IIS 7 como servidor. Intenté con la solución anterior que resolvió el problema del error 255, pero todavía tengo Errorno 10054 con archivos más grandes. Luego aumenté el Tiempo de espera de conexión en IIS que funcionó.

Para cambiar: Sitio web -> Administrar sitio web -> Configuración avanzada -> Límites de conexión -> Tiempo de espera de conexión. El valor predeterminado es 2 minutos. Cambié la mina a 20 minutos y funcionó.

No estoy seguro de por qué funciona, pero parece que Mercurial hace una conexión con el servidor, lleva un tiempo procesar archivos de mayor tamaño y luego solo envía una solicitud. En ese momento IIS ha desconectado al cliente.

0

Ok, ¡su solución lo hizo!
ya tenía una etiqueta requestLimits así:
<requestLimits maxUrl="16384" maxQueryString="65536" />
por lo que añade maxAllowedContentLength = "524 288 000" de esta manera:
<requestLimits maxUrl="16384" maxQueryString="65536" maxAllowedContentLength ="524288000" />
Y que lo hizo!

0

Estoy publicando esto para cualquier otra persona que entra en este hilo desde una búsqueda.

Actualmente existe un problema con la extensión largefiles en el módulo mercurial python cuando se aloja a través de IIS.Consulte this post si tiene problemas al enviar grandes conjuntos de cambios (o archivos grandes) a IIS a través de TortoiseHg.

El problema en última instancia, es un error en el procesamiento de SSL introducido Python 2.7.3 (probablemente explicando por qué hay tantas publicaciones sin resolver de personas que buscan problemas con Mercurial). Volviendo a Python 2.7.2 permítanme ir un poco más adelante (bloqueado con 30Mb de empuje en lugar de 15Mb), pero para resolver el problema tuve que instalar la utilidad IISCrypto para deshabilitar por completo las transferencias a través de SSLv2.

+0

Este fue el problema en mi caso. O al menos yo también tengo un problema relacionado con SSL. En https, la conexión se cerró con fuerza/bruscamente siempre después de la misma cantidad de bytes enviados. El empuje http se completó correctamente (110 MB en total). _python 2.7.12 x64, mercurial 3.9 x64, IIS 7.5 - Win Server 2008 R2_ – bor

+0

Pude solucionar el problema usando IISCrypto, pero tuve que aplicar las 'mejores prácticas', ya que la desactivación de SSLv2 no era suficiente. Ahora presionar sobre https está funcionando bien. – bor

Cuestiones relacionadas