web-dev-qa-db-ja.com

大きなファイルをサーバーにプッシュしようとしたときのMercurialクライアントエラー255およびHTTPエラー404

問題:

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)がエラーを報告します。

「プッシュ中にエラーが発生しました。Mercurialがエラー番号255を報告しました:中止:HTTPエラー404:見つかりません」

エラーはどういう意味ですか?!このコミットについて(私が知ることができる)唯一のユニークなことは、ファイルのサイズ、タイプ、およびファイル名です。チェンジセット内のどのファイルが失敗しているかを特定するにはどうすればよいですか?破損したチェンジセットをリポジトリから削除するにはどうすればよいですか?別の投稿で、誰かが「mq」拡張機能を使用してリポジトリ内の履歴から誤ったチェンジセットを効果的に削除したと報告しましたが、mqは私が解決しようとしていることに対して非常に複雑に見えます。


バックグラウンド:

MacHGとtoirtoiseHGの両方を使用して、サーバーとの間でソースファイル、ディレクトリ、.classファイル、および.jarファイルをプッシュおよびプルできます。

6つの大きな.exe、.dmgなどのインストーラーファイル(合計約130Mb)を初めてローカルリポジトリに追加することに成功しました。

次のローカルリポジトリへのコミットで、問題の原因となっている6つのファイルを削除(「追跡されていない」/忘れる)しましたが、以前の(失敗した)チェンジセットはサーバーにプッシュされるためにキューに入れられています(つまり、ローカルホストがプッシュしようとしていますリモートサーバーに「追加」してから「削除」し、ソース管理システムの「すべてを履歴に保持する」という哲学に沿った状態を保ちます。

WindowsPCからTortoiseHGを使用して.txt.Javaファイルなどをコミットできます。 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

-vフラグと--trackbackフラグを使用して、Macbook(MercurialとMacHGの両方がインストールされている)からコマンドラインから出力します。

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$ 

同じファイルをサーバーにプッシュしようとしているWindows7ホスト(TortoiseHGのみがインストールされている)からの出力(異なるチェンジセットですが、MacBookからプッシュされているチェンジセットと同じ6つのファイル追加が含まれています)

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に障害がありますか?

30
coderunner

同じ問題点を経験しました...

IISサーバーのデフォルト設定では、IISのデフォルトの最大リクエスト長は、のみであるため、大きなリポジトリをサーバーにプッシュすることはできません。 4 MB、CGIスクリプトのタイムアウトが15分であるため、大きなファイルをアップロードできません。大きなファイルのアップロードを有効にするには(これはWeb上で簡単に見つけることができません…)、次の手順を実行します。
1。 IIS Managerで、Webサイトノードをクリックし、[制限...]リンクをクリックします。
2。次に、接続タイムアウトを十分に大きく指定します(ここでは1時間、つまり3600秒を選択しました)
3。次に、hgを含むノードをクリックし(インストール手順に従って)、CGIをダブルクリックします
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>

これは、6日を少し超えるhttpタイムアウト、および約2GBの最大アップロード制限を指定します。

51
marcslogic

サーバーとしてIIS7を使用しても同じ問題が発生しました。エラー255の問題を解決する上記の解決策を試しましたが、それでも大きなファイルでエラー番号10054が発生しました。次に、IISの接続タイムアウトを増やしました。これは機能しました。

変更するには:[Webサイト]-> [Webサイトの管理]-> [詳細設定]-> [接続制限]-> [接続タイムアウト]。デフォルトは2分です。私のを20分に変更し、それは機能しました。

これが機能する理由はわかりませんが、Mercurialがサーバーに接続し、大きなファイルを処理するのに時間がかかり、リクエストを送信するだけのようです。その時までにIISはクライアントを切断しました。

検索からこのスレッドに入ってくる他の人のためにこれを投稿しています。

現在、IIS経由でホストされている場合、Mercurial pythonモジュールでlargefiles拡張子を使用すると問題が発生します。 TortoiseHgを介して大きなチェンジセット(または大きなファイル)をIISにプッシュする際に問題が発生した場合は、 この投稿 を参照してください。

この問題は、最終的にはPython 2.7.3で導入されたSSL処理のバグであることが判明しました(おそらく、Mercurialの問題を探している人々の未解決の投稿が非常に多い理由を説明しています)。 Python 2.7.2にロールバックすると、もう少し先に進むことができます(15Mbではなく30Mbプッシュでブロックされます)が、問題を適切に解決するには、 IISCrypto ユーティリティをインストールする必要がありました。 SSLv2を介した転送を完全に無効にします。

0
Peter Bernier

わかりました、あなたの解決策はそれをしました!
私はすでに次のようなrequestLimitsタグを持っていました:
<requestLimits maxUrl="16384" maxQueryString="65536" />
そこで、maxAllowedContentLength = "524288000"を次のように追加しました。
<requestLimits maxUrl="16384" maxQueryString="65536" maxAllowedContentLength ="524288000" />
そしてそれはそれでした!

0
Pedro Ferreira