2010-06-18 27 views
30

Sự cố:

19/06/10 Cập nhật: Thêm bằng chứng là phía máy chủ. Nhận lỗi này trên Windows 7 dòng lệnh (xem dưới đây để biết traceback đầy đủ):Lỗi khách hàng Mercurial 255 và lỗi HTTP 404 khi cố gắng đẩy tệp lớn đến máy chủ

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 

Khi cố gắng để đẩy một changeset có chứa 6 tập tin lớn (.exe, .dmg, vv) đến máy chủ từ xa của tôi khách hàng của tôi (MacHG) đang báo cáo lỗi:

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

Lỗi này có nghĩa là gì ?! Điều duy nhất duy nhất (mà tôi có thể nói) về cam kết này là kích thước, loại và tên tệp của các tệp. Làm thế nào tôi có thể xác định tập tin chính xác trong changeset là không? Làm thế nào tôi có thể xóa các changeset bị hỏng từ kho lưu trữ? Trong một bài đăng khác, ai đó đã báo cáo bằng cách sử dụng phần mở rộng "mq" để xóa một changeset có hiệu quả khỏi lịch sử trong một kho lưu trữ, nhưng mq trông quá phức tạp đối với những gì tôi đang cố gắng giải quyết.


Bối cảnh:

tôi có thể đẩy và kéo như sau: file nguồn, thư mục, file .class và một file .jar đến và đi từ máy chủ, sử dụng cả hai MacHG và toirtoise HG.

Tôi đã cam kết thành công với kho lưu trữ cục bộ của mình lần đầu tiên 6 tệp cài đặt lớn .exe, .dmg v.v. (tổng số khoảng 130Mb).

Trong cam kết sau đây với kho lưu trữ cục bộ của mình, tôi đã xóa ("untracked"/forget) 6 tệp gây ra sự cố, tuy nhiên các thay đổi trước đó (không) vẫn được xếp hàng để được đẩy tới máy chủ (tức là máy chủ cục bộ của tôi) đang cố gắng đẩy "thêm" và sau đó "loại bỏ" đến máy chủ từ xa - và giữ liên kết với triết lý "giữ mọi thứ trong lịch sử" của hệ thống kiểm soát nguồn).

Tôi có thể cam kết tệp .txt .java, v.v. sử dụng TortoiseHG từ máy tính Windows. Tôi đã không thực sự thử nghiệm cam kết hoặc đẩy các tập tin lớn bằng cách sử dụng TortoiseHG.

Vui lòng trợ giúp!


Setup:

Khách hàng ứng dụng = MacHG v0.9.7 (SCM 1.5.4), và TortoiseHG v1.0.4 (SCM 1.5.4)

Server = HTTPS, IIS7.5, Mercurial 1.5.4, Python 2.6.5, cài đặt sử dụng những hướng dẫn này:

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

Trong IIS7.5 xử lý CGI được cấu hình để xử lý tất cả các động từ (không chỉ là GET, POST và HEAD).

tập tin hgweb.cgi của tôi trên máy chủ như sau:

#!/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 My.tập tin cấu hình trên máy chủ như sau:

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

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

Output từ dòng lệnh từ macbook của tôi (cả Mercurial và MacHG cài đặt) sử dụng -v và cờ --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$ 

Output từ Windows 7 máy chủ (chỉ cài đặt TortoiseHG) cố gắng đẩy các tệp tương tự vào máy chủ (thay đổi khác nhau, nhưng chứa cùng 6 tệp bổ sung khi thay đổi được đẩy từ 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> 

Đây là vấn đề tồn tại? IIS7.5 có lỗi không? Python 2.6.5 có lỗi?

+3

Một nguồn thông tin khác là chạy từ dòng lệnh và chuyển vào cờ v và --traceback: hg -v --traceback push –

Trả lời

50

Đã đi qua các điểm đau cùng ...

Với các thiết lập mặc định trên máy chủ IIS, bạn sẽ không thể để đẩy kho lớn đến máy chủ, như IIS có chiều dài yêu cầu tối đa mặc định chỉ có 4 MB, và một thời gian chờ cho các kịch bản CGI trong 15 phút, làm cho nó không thể tải lên các tập tin lớn. Để cho phép tải lên các tệp lớn (và điều này không dễ tìm trên web…), hãy làm như sau:
1. Trong Trình quản lý IIS, nhấp vào nút trang web và nhấp vào liên kết Limits….
2. Sau đó chỉ định thời gian chờ kết nối đủ lớn (tôi chọn 1 giờ ở đây hoặc 3600 giây)
3. Tiếp theo, nhấp vào nút chứa hg (theo quy trình cài đặt), sau đó nhấp đúp vào CGI
4. Chỉ định thời gian đủ dài cho các tập lệnh CGI (ví dụ: 10 giờ)

Bây giờ, hãy chỉnh sửa C: \ inetpub \ wwwroot \ hg \ web.config, để nó có phần <security> mới dưới <system.webserver> và thông số <httpRuntime> dưới <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> 

Điều này chỉ định thời gian chờ http hơn một chút so với 6 ngày và giới hạn tải lên tối đa khoảng 2 GB.

+2

Điều này làm việc hoàn hảo cho tôi. Cảm ơn vì đầu vào của bạn! –

+0

Cảm ơn bạn đã đăng giải pháp của mình. Tôi đã chỉ thử nghiệm một phần cho đến nay. Cho đến nay rất tốt, trong đó vấn đề không xảy ra khá nhiều - nhưng nó vẫn còn xảy ra. Tôi sẽ kiểm tra trong vài ngày tới và đăng kết quả của tôi sớm. – coderunner

+0

Giải pháp của bạn đã giúp phần nào, nhưng không hoàn toàn. Bây giờ tôi có thể đẩy khoảng 300Mb thành công, tuy nhiên chỉ qua dòng lệnh trên cả Mac OS 10.6.4 và Win7. Việc đẩy 300Mb không thành công dưới cả MacHG và TortoiseHG. Tôi đã thử nghiệm một tệp nén có dung lượng lên tới 1,4 GB, có kích thước từ 1kB đến 600MB. Nó thất bại, với IIS7.5 trở về "Error 502 - bad gateway". Theo tài liệu IIS, điều này có nghĩa rằng kịch bản CGI trả về một phản hồi HTTP không đúng. – coderunner

6

Có cùng vấn đề khi sử dụng IIS 7 làm máy chủ. Đã thử giải pháp trên đã giải quyết vấn đề lỗi 255, nhưng vẫn có Errorno 10054 với các tệp lớn hơn. Sau đó tôi tăng thời gian chờ kết nối trong IIS mà làm việc.

Để thay đổi: Trang web -> Quản lý trang web -> Cài đặt nâng cao -> Giới hạn kết nối -> Hết thời gian kết nối. Mặc định là 2 phút. Đã thay đổi mỏ của tôi thành 20 phút và nó hoạt động.

Không chắc chắn lý do tại sao nó hoạt động nhưng dường như Mercurial tạo kết nối tới máy chủ, mất một lúc để xử lý tệp lớn hơn, sau đó chỉ gửi yêu cầu. Vào thời điểm đó IIS đã ngắt kết nối máy khách.

0

Ok, giải pháp của bạn đã làm được!
Tôi đã có một thẻ requestLimits như thế này:
<requestLimits maxUrl="16384" maxQueryString="65536" />
vì vậy tôi thêm maxAllowedContentLength = "524.288.000" với nó như thế này:
<requestLimits maxUrl="16384" maxQueryString="65536" maxAllowedContentLength ="524288000" />
Và đó đã làm nó!

0

Tôi chỉ đăng bài này cho bất kỳ ai khác tham gia vào chuỗi này từ tìm kiếm.

Hiện tại có sự cố khi sử dụng phần mở rộng tệp mở rộng trong mô-đun python thủy ngân khi được lưu trữ thông qua IIS.Xem this post nếu bạn gặp phải sự cố khi đẩy các thay đổi lớn (hoặc tệp lớn) sang IIS thông qua TortoiseHg.

Vấn đề cực kỳ hóa ra là lỗi trong quá trình xử lý SSL được giới thiệu Python 2.7.3 (có thể giải thích tại sao có quá nhiều bài đăng chưa được giải quyết của những người đang tìm kiếm vấn đề với Mercurial). Quay trở lại với Python 2.7.2 cho phép tôi tiến xa hơn một chút (bị chặn ở mức 30Mb thay vì 15Mb), nhưng để giải quyết vấn đề đúng cách, tôi phải cài đặt tiện ích IISCrypto để vô hiệu hóa hoàn toàn việc truyền tải qua SSLv2.

+0

Đây là vấn đề trong trường hợp của tôi. Hoặc ít nhất tôi cũng có một vấn đề liên quan đến SSL. Hơn https, kết nối bị đóng/ngắt đột ngột luôn sau khi đã gửi cùng một lượng byte. Đã hoàn thành quá trình đẩy http thành công (tổng cộng 110MB). _python 2.7.12 x64, mercurial 3.9 x64, IIS 7.5 - Win Server 2008 R2_ – bor

+0

Tôi có thể khắc phục sự cố bằng IISCrypto nhưng phải áp dụng 'thực hành tốt nhất' là vô hiệu hóa chỉ SSLv2 là không đủ. Bây giờ đẩy qua https đang hoạt động tốt. – bor

Các vấn đề liên quan