2010-06-18 4 views
30

Problem:

19/06/10 Update: Weitere Beweise Problem ist Server-Seite. Beim Empfang dieser Fehler auf Windows 7 Befehlszeilen (siehe unten für die vollständige Rückverfolgung):Mercurial-Clientfehler 255 und HTTP-Fehler 404 beim Versuch, große Dateien an den Server zu senden

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 

Beim Versuch, eine changeset zu schieben, die 6 große Dateien (.exe, .dmg, usw.) zu meinem Remote-Server meines Klienten (MacHG) meldet den Fehler:

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

Was bedeutet der Fehler überhaupt ?! Das Einzige, was ich an diesem Commit erkennen kann, ist die Größe, der Typ und der Dateiname der Dateien. Wie kann ich feststellen, welche Datei innerhalb des Änderungssatzes fehlerhaft ist? Wie kann ich das beschädigte Änderungsset aus dem Repository löschen? In einem anderen Beitrag berichtete jemand, dass er "mq" -Erweiterungen verwendet, um ein fehlerhaftes Changeset effektiv aus dem Verlauf in einem Repository zu löschen, aber mq sieht zu kompliziert aus für das, was ich zu lösen versuche.


Hintergrund:

ich drücken kann und ziehen Sie die folgenden Schritte aus: Quelldateien, Verzeichnisse, Dateien und .class- eine .jar-Datei zu und von dem Server, die beide MacHG und toirtoise HG verwenden.

Ich habe erfolgreich zu meinem lokalen Repository die Ergänzung zum ersten Mal die 6 großen .exe, .dmg etc Installer-Dateien (ca. 130 MB insgesamt) verpflichtet.

Im folgenden Commit zu meinem lokalen Repository habe ich die 6 Dateien, die das Problem verursacht haben, entfernt ("untracked"/vergessen), aber das vorherige (fehlerhafte) Changeset ist immer noch in der Warteschlange zum Server (dh meinem lokalen Host) versucht, das "Hinzufügen" und dann das "Entfernen" auf den Remote-Server zu schieben - und mit der Philosophie "Behalte alles in der Geschichte" des Quellcodeverwaltungssystems übereinzustimmen.

Ich kann .txt .java Dateien usw. mit TortoiseHG von Windows-PCs committen. Ich habe nicht wirklich getestet, die gleichen großen Dateien mit TortoiseHG zu committen oder zu schieben.

Bitte helfen!


Setup:

Client-Anwendungen = MacHG v0.9.7 (SCM 1.5.4) und TortoiseHG v1.0.4 (SCM 1.5.4)

Server = HTTPS, IIS7.5, Mercurial 1.5.4, Python 2.6.5, Setup diese Anweisungen mit:

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

In IIS7.5 die CGI-Handler alle Verben zu handhaben ist so konfiguriert, (nicht nur GET, POST und HEAD).

Meine hgweb.cgi Datei auf dem Server ist wie folgt:

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

Mein hgweb.config-Datei auf dem Server ist wie folgt:

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

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

Ausgabe von der Kommandozeile aus meinem macbook (beide Mercurial und MacHG installiert) mit -v und --trackback Fahnen:

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$ 

Ausgabe von Windows- 7 Host (hat nur TortoiseHG installiert ist) versucht die gleichen Dateien zu dem Server zu schieben (unterschiedliche changset, aber enthält die gleichen 6 Datei Additionen als changeset vom macbook geschoben)

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 ist ein Keep-Alive-Problem? Ist IIS7.5 fehlerhaft? Python 2.6.5 bei Fehler?

+3

Eine weitere Quelle von Informationen ist, von der Kommandozeile aus zu laufen und die Flags -v und --traceback zu übergeben: hg -v - traceback push –

Antwort

50

Went den gleichen Schmerz Punkte durch ...

Mit den Standardeinstellungen auf dem IIS-Server, werden Sie nicht große Repositories an den Server schieben können, wie IIS eine maximale Standardanforderungslänge von nur 4 hat MB, und ein Timeout für CGI-Skripte von 15 Minuten, so dass es unmöglich ist, große Dateien hochzuladen. Um das Hochladen von großen Dateien zu ermöglichen (und dies ist im Web nicht einfach zu finden ...), gehen Sie folgendermaßen vor: 1. Klicken Sie im IIS-Manager auf den Website-Knoten und dann auf den Link Begrenzungen.
2. Dann eine Verbindung Time-out ausreichend groß (ich wählte 1 Stunde hier, oder 3600 Sekunden)
3. Klicken Sie anschließend auf den Knoten enthält, hg (nach der Installation), dann doppelklicken Sie auf CGI
angeben 4. Geben sie eine ausreichend lange Zeit für CGI-Skripte (zB 10 Stunden)

Nun bearbeiten C: \ inetpub \ wwwroot \ hg \ web.config, so dass es einen neuen <security> Abschnitt unter <system.webserver> hat, und eine <httpRuntime> Spezifikation unter <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> 

Dies gibt ein http-Zeitlimit von etwas mehr als 6 Tagen und ein maximales Upload-Limit von ca. 2 GB an.

+2

Das funktionierte perfekt für mich. Danke für deinen Beitrag! –

+0

Vielen Dank für Ihre Lösung. Ich habe es bisher nur teilweise getestet. So weit, so gut, dass das Problem nicht ganz so stark auftritt - aber es tritt immer noch auf. Ich werde die nächsten Tage testen und meine Ergebnisse bald veröffentlichen. – coderunner

+0

Ihre Lösung hat zwar etwas geholfen, aber nicht vollständig. Ich kann jetzt ca. 300Mb erfolgreich pushen, allerdings nur über die Kommandozeile unter Mac OS 10.6.4 und Win7. Der 300 MB-Push schlägt sowohl unter MacHG als auch unter TortoiseHG fehl. Ich testete einen 1.3GB-Push von 5000 Dateien, in der Größe von 1kB bis 600MB. Es schlug fehl, mit IIS7.5, das "Fehler 502 - schlechtes Gateway" zurückgibt. Laut der IIS-Dokumentation bedeutet dies, dass das CGI-Skript eine falsche HTTP-Antwort zurückgegeben hat. – coderunner

6

Hatte das gleiche Problem mit IIS 7 als Server. Versuchte die obige Lösung, die das Problem 255 Fehler behoben, aber immer noch Errorno 10054 mit größeren Dateien. Ich habe dann das Verbindungstimeout in IIS erhöht, das funktioniert hat.

Ändern: Website -> Website verwalten -> Erweiterte Einstellungen -> Verbindungslimits -> Verbindungstimeout. Der Standardwert ist 2 Minuten. Habe meine 20 Minuten geändert und es hat geklappt.

Nicht sicher, warum dies funktioniert, aber scheint, dass Mercurial eine Verbindung zum Server herstellt, dauert eine Weile, um größere Dateien zu verarbeiten, sendet nur eine Anforderung. Zu diesem Zeitpunkt hat IIS den Client getrennt.

0

Ok, Ihre Lösung hat es geschafft!
Ich hatte schon ein Request Tag wie folgt:
<requestLimits maxUrl="16384" maxQueryString="65536" />
so habe ich maxAllowedContentLength = "524288000", um es wie folgt aus:
<requestLimits maxUrl="16384" maxQueryString="65536" maxAllowedContentLength ="524288000" />
Und das tat es!

0

Ich poste dies nur für jeden, der in diesen Thread von einer Suche kommt.

Es gibt derzeit ein Problem bei der Verwendung der largefiles-Erweiterung im mercurial-Python-Modul, wenn es über IIS gehostet wird.Siehe this post, wenn Probleme auftreten, die große Änderungsmengen (oder große Dateien) über TortoiseHg an IIS weiterleiten.

Das Problem stellt sich schließlich als Fehler in der SSL-Verarbeitung heraus, der Python 2.7.3 eingeführt wurde (wahrscheinlich, warum es so viele ungelöste Beiträge von Leuten gibt, die nach Problemen mit Mercurial suchen). Rollback zurück zu Python 2.7.2 lassen Sie mich etwas weiter vorne (blockiert bei 30 MB Push statt 15 MB), aber um das Problem richtig zu lösen, musste ich das IISCrypto Dienstprogramm installieren, um Übertragungen über SSLv2 vollständig zu deaktivieren.

+0

Das war das Problem in meinem Fall. Oder zumindest habe ich auch ein Problem mit SSL. Über HTTPS wurde die Verbindung immer nach der gleichen Anzahl gesendeter Bytes gewaltsam/abrupt geschlossen. Über HTTP-Push erfolgreich abgeschlossen (insgesamt 110 MB). _python 2.7.12 x64, mercurial 3.9 x64, IIS 7.5 - Win Server 2008 R2_ – bor

+0

Ich konnte das Problem mit dem IISCrypto beheben, musste aber die 'Best Practices' anwenden, da das Deaktivieren von nur SSLv2 nicht ausreichte. Jetzt push über https funktioniert gut. – bor

Verwandte Themen