2010-09-30 50 views
5

Tôi đang cố gắng khắc phục lỗi liên tục trong git-svn. Vấn đề chỉ xảy ra trong Windows XP, với cả Cygwin git (perl v5.10.1) và msysGit (perl v5.8.8).quyền sysopen bị từ chối

Với bất kỳ hoạt động có liên quan đến một lấy, tôi có thể nhận được partway qua và sau đó hoạt động chết với một thông điệp tương tự như

Không thể mở .git/svn/refs/điều khiển từ xa/trunk /.rev_map.cc05479a-e8ea-436f-8d71-e07493b7796c.lock: thiết bị hoặc tài nguyên bận rộn

tại/usr/lib/git-core/git-svn dòng 5240

Tuy nhiên, khóa chính xác tệp và số dòng không phải lúc nào cũng giống nhau. Tôi đã theo dõi sự cố thực tế đối với dòng 3679

sysopen(my $fh, $db_lock, O_RDWR | O_CREAT) 

Đây là tệp tạo tệp .lock mới và tôi đã thử tương đương không có kết quả.

open(my $fh, ">", $db_lock) 

Tôi đã kiểm tra quyền của thư mục và đó là drwxr-xr-x, vì vậy sẽ không có bất kỳ vấn đề nào hoặc nếu không, chúng sẽ không nhất quán.

Điều này có thể là do tập lệnh tạo và đổi tên tệp này quá nhiều lần liên tiếp mà XP không thể xử lý? EDIT: nghi ngờ của tôi là đây là trường hợp, bởi vì khi tôi sử dụng trình gỡ rối perl và khởi động việc thực hiện của mỗi sysopen bằng tay, không có vấn đề cho 100 sửa đổi tôi lấy.

EDIT: Một số nhà phát triển Git sẽ tìm hiểu nguyên nhân gốc rễ hơn là đi với một hack xảy ra để làm việc (cách tiếp cận đúng, tôi nghĩ). Vì vậy, bất cứ ai có thể giúp tôi tìm thấy thủ phạm phủ nhận sự cho phép của tôi để mở các tập tin .lock? Tôi có một số công cụ mà về mặt lý thuyết có thể được sử dụng cho mục đích này, nhưng họ hoàn toàn không đi tất cả các cách:

  • Process Explorer - cho thấy tất cả xử lý thuộc sở hữu của một quá trình, và cũng có thể tìm kiếm tất cả các quá trình sở hữu một tay cầm cụ thể. Tuy nhiên, nó không hoạt động tốt cho các quá trình hoặc xử lý ngắn (đó là những gì git svn clone/fetch do)
  • Trình mở khóa - Phát hiện khi hộp thoại 'cho phép từ chối chung' xuất hiện và tìm (các) trình xử lý và phiếu mua hàng vi phạm để đối phó với họ. Tuy nhiên, nó không xuất hiện khi các chương trình không phải thám hiểm gặp lỗi dựa trên tệp

Tóm lại, có cách nào để tôi có thêm thông tin mà không phải là nhân viên của Microsoft không?

CHỈNH SỬA 2: Có thể không phải Symantec, mà là một chương trình khác mà chúng tôi đã chạy trên các máy tính nối mạng. Tôi có một số người nhìn vào nó, và họ sẽ có thể ít nhất là thu hẹp nguyên nhân ở đây.

+0

Điều đó nghe có vẻ hợp lý. – Axeman

+0

Vì vậy, nó sẽ là một sửa chữa tốt để thêm một vòng lặp để thử lại đến một số lần nhất định, hoặc là quá nhiều của một hack? –

+0

Sẽ không tương đương với 'O_RDWR | O_CREAT' là 'mở (my $ fh," + <", $ db_lock)'? – mob

Trả lời

6

Loại hành vi này thường có thể được quy cho một thành phần chống vi-rút giữ cho tệp được mở và trì hoãn việc xóa.

+0

Đó cũng là dự đoán tốt nhất của tôi. Tôi không có bất kỳ sự kiểm soát nào đối với phần mềm diệt virus chạy trên máy, vì vậy giải pháp duy nhất là thay đổi Git, đúng không? Hoặc có thể chỉ là msysGit? –

+0

Thậm chí bạn có thể tắt tạm thời để xem sự cố có bị mất không? Trong câu hỏi của bạn, bạn nói về việc tìm kiếm và sửa chữa nguyên nhân gốc rễ ... nếu vi-rút là lỗi thì mọi thay đổi bạn thực hiện đối với git sẽ không có gì khác ngoài giải pháp thay thế. –

+0

Đó là Symantec, và tôi không thể giết hoặc tạm dừng nó. Tôi có thể cố gắng làm việc với CNTT, nhưng nếu đó là vấn đề, thì tôi có phải dựa vào Symantec để sửa nó không? –

5

Hack hiện tại của tôi về một giải pháp là thay thế sysopen với điều này

my $fh; 
if ($^O eq 'MSWin32' or $^O eq 'cygwin') { 
    for my $try (1..10) { # Retry up to 10 times on problematic systems 
     sysopen($fh, $db_lock, O_RDWR | O_CREAT); 
     last if $fh; 
    } 
} else { 
    sysopen($fh, $db_lock, O_RDWR | O_CREAT); 
} 

croak "Couldnt open $db_lock: $!\n" unless $fh;' 

Và cho đến nay, nó hoạt động khá tốt. Hầu hết thời gian nó không in bất kỳ, và đôi khi nó in một, và tôi đã không nhìn thấy nó in nhiều hơn một liên tiếp. Là giải pháp này quá hacky?

Chỉnh sửa: Mã của tôi được thay thế bằng phiên bản đã dọn sạch của Ævar Arnfjörð Bjarmason.

+0

Điều đó có ý nghĩa. Rất nhiều mã ra có thiếu hành vi mạnh mẽ. – Axeman

+1

Tôi muốn đề xuất Thời gian :: HiRes :: sleep (0,01) trong vòng lặp đó. Ngoài ra, có lẽ 'cuối cùng nếu $ fh || $! ! = Errno :: EBUSY' – ysth

+0

Vẫn chưa đóng đinh nguyên nhân, vì vậy tôi đang tặng tiền thưởng cho bản thân mình –

1

Tôi sẽ sử dụng Process Monitor và để nó chạy cho đến khi lỗi xảy ra lần nữa. Sau đó, trong Process Monitor bạn sẽ thấy một lỗi trong khi chương trình của bạn truy cập tệp (rất có thể là ACCESS_DENIED hoặc SHARING_VIOLATION). Sau đó, bạn có thể lọc theo tên tệp đó và xem các quy trình khác (nếu có) đã mở nó ra sao.

+0

Tôi nghĩ rằng những gì tôi nhận được là "FAST IO DISALLOWED". Tôi nên lọc trên cột 'Đường dẫn', phải không? –

+0

Bạn có thể bỏ qua "FAST IO DISALLOWED"; nó bình thường. Khi xảy ra lỗi, bạn nên lọc cột "Đường dẫn" để chỉ bao gồm tệp gây ra lỗi; điều này sẽ cho bạn thấy những gì các quá trình khác đang truy cập nó. – Luke

1

Nếu chương trình của bạn đang gọi "fork()" hoặc "system()" hoặc "exec()" ở bất kỳ đâu, điều này rất có thể là gốc của sự cố.

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