Đảm bảo một thứ tự thư mục lặp lại trong linux


16

Tôi điều hành một công ty tích hợp liên tục được lưu trữ và chúng tôi chạy mã của khách hàng trên Linux. Mỗi lần chúng tôi chạy mã, chúng tôi chạy nó trong một máy ảo riêng. Một vấn đề thường xuyên phát sinh là các thử nghiệm của khách hàng đôi khi sẽ thất bại do thứ tự thư mục mã của họ được kiểm tra trên VM.

Hãy để tôi đi vào chi tiết hơn. Trên OSX, hệ thống tệp HFS + đảm bảo rằng các thư mục luôn được duyệt theo cùng một thứ tự. Các lập trình viên sử dụng OSX cho rằng nếu nó hoạt động trên máy của họ, thì nó phải hoạt động ở mọi nơi. Nhưng nó thường không hoạt động trên Linux, vì các hệ thống tệp linux không cung cấp bảo đảm đặt hàng khi duyệt qua các thư mục.

Ví dụ, xem xét có 2 tệp, a.rb, b.rb. a.rb định nghĩa MyObjectvà b.rb sử dụng MyObject. Nếu a.rb được tải trước, mọi thứ sẽ hoạt động. Nếu b.rb được tải trước, nó sẽ cố truy cập vào một biến không xác định MyObjectvà không thành công.

Nhưng tệ hơn thế, là nó không phải lúc nào cũng thất bại. Bởi vì hệ thống tập tin đặt hàng trên Linux không được đặt hàng, nó sẽ là một thứ tự khác nhau trên các máy khác nhau. Điều này tồi tệ hơn bởi vì đôi khi các bài kiểm tra vượt qua, và đôi khi chúng thất bại. Đây là kết quả tồi tệ nhất có thể.

Vì vậy, câu hỏi của tôi là, có cách nào để làm cho trật tự hệ thống tập tin lặp lại. Một số cờ cho ext4 có lẽ, điều đó nói rằng nó sẽ luôn đi qua các thư mục theo thứ tự nào đó? Hoặc có thể một hệ thống tập tin khác có đảm bảo này?



Bên cạnh những câu trả lời thực sự đúng - những gì "đúng" trật tự? Chỉ cần sắp xếp chữ và số? Hay bằng CTIME? Tự ý kỳ diệu? Làm thế nào để khách hàng đảm bảo đơn hàng này khi triển khai? Làm thế nào thông tin đặt hàng ma thuật này nên được chuyển cho bạn?
Michuelnik

@Michuelnik Không có thứ tự đúng thực sự, nhưng một cái gì đó lặp lại có nghĩa là chúng tôi nhận được kết quả tương tự mọi lúc, sẽ tốt hơn không có gì. Lý tưởng nhất là chúng ta sử dụng thứ tự HFS + mà tôi nghĩ là theo thứ tự abc.
Paul Biggar

@Michuelnik Vấn đề này ảnh hưởng đến các thử nghiệm nhiều hơn so với triển khai Triển khai chủ yếu xảy ra trên Linux, nhưng nếu có lỗi, họ sẽ khắc phục nó. Các thử nghiệm chủ yếu chạy trên OSX vì vậy nếu có lỗi, đó phải là lỗi của chúng tôi.
Paul Biggar

1
@PaulBiggar: Tôi hiểu vấn đề của bạn và tôi không thể đưa ra giải pháp tốt (trừ khi bạn có thể tìm cách phát hiện xem thứ tự tệp có phải là nguyên nhân của sự cố không). Nhưng tôi không đồng ý rằng "thành công lặp lại tốt hơn thất bại không nhất quán": Nếu môi trường phát triển (và CI) của tôi có thành công lặp lại nhưng nền tảng triển khai của tôi có "thất bại không đáng tin cậy" thì tôi thực sự đang ở một điểm xấu. Tôi muốn thay thấy sự thất bại không đáng tin cậy càng sớm càng tốt (lý tưởng trên hệ thống phát triển của tôi nhưng ít nhất trên hệ thống CI của tôi).
Joachim Sauer

Câu trả lời:


16

Tôi biết đó không phải là câu trả lời mà bạn đang tìm kiếm, nhưng tôi tin rằng giải pháp chính xác là tránh phụ thuộc vào thứ tự của các tệp trong một thư mục. Có thể nó luôn nhất quán trên tất cả các hệ thống tệp HFS + và có thể bạn cũng có thể tìm cách làm cho nó nhất quán trong ext4 hoặc một số hệ thống tệp khác, nhưng về lâu dài sẽ khiến bạn gặp nhiều rắc rối hơn là tiết kiệm. Một số người khác sử dụng ứng dụng của bạn sẽ gặp phải một bất ngờ khó chịu khi họ không nhận ra rằng nó chỉ tương thích với một số loại hệ thống tệp chứ không phải các loại khác. Thứ tự có thể thay đổi nếu một hệ thống tập tin được khôi phục từ bản sao lưu. Bạn có thể gặp phải các vấn đề tương thích vì thứ tự nhất quán HFS + và thứ tự nhất quán ext4 có thể không giống nhau.

Chỉ cần đọc tất cả các mục trong thư mục và sắp xếp danh sách theo từ vựng trước khi sử dụng nó. Cũng giống như lsvậy.

Bạn đề cập đến các tệp a.rbb.rb, nhưng nếu chúng ta đang nói về các tệp nguồn ngôn ngữ lập trình, thì mỗi tệp có phải chịu trách nhiệm đảm bảo rằng nó nhập tất cả các phụ thuộc của nó không?


Vấn đề là chúng tôi đã không viết mã chúng tôi đang chạy. Chúng tôi chạy mã khách hàng và chúng tôi không kiểm soát cách viết mã. Vì vậy, vấn đề của chúng tôi thực sự là chúng tôi đang bị đổ lỗi cho vấn đề này, bởi vì nó hoạt động trên máy của họ chứ không phải của chúng tôi. Nếu chúng tôi có thể buộc mọi người viết mã chính xác, chúng tôi sẽ làm, nhưng điều đó không nằm trong khả năng của chúng tôi :)
Paul Biggar

10
@PaulBiggar: nhưng không phải "nó chạy ở đây nhưng không sản xuất" chính xác là vấn đề mà CI phải sửa? Nói cách khác: "Tại sao mã của tôi bị hỏng trong hệ thống của bạn?" nên được trả lời với "Bởi vì chúng tôi đang làm chính xác những gì bạn yêu cầu chúng tôi!" ;-)
Joachim Sauer

4
Tôi không biết về bất kỳ ai khác, nhưng khi mã hoạt động trên máy của tôi và sau đó thất bại trong kiểm tra của CI hoặc đồng nghiệp, tôi ngay lập tức cho rằng có một cái gì đó phụ thuộc vào nền tảng hoặc môi trường mà tôi cần khắc phục ...
matt5784

1
Chắc chắn phát triển ứng dụng trên nền tảng mà bạn không sử dụng trong sản xuất là một ý tưởng tồi? Để họ phát triển trên cùng một nền tảng mà họ đang viết.
Matthew Ife

2
Tôi không đồng ý. Tôi nghĩ đó là một ý tưởng tuyệt vời. Nó làm cho nhiều lỗi hơn xuất hiện trong quá trình chuyển từ phát triển sang máy chủ thử nghiệm. Và do đó, mã này mạnh mẽ hơn nhiều trước khi nó chuyển đến các máy chủ sản xuất. Vì vậy, trong một thế giới chính xác hoặc lý thuyết, nó là tốt hơn nhiều. Đây là cùng một thế giới nơi bạn có thể buộc mọi người viết mã chính xác, còn được gọi là vùng đất mơ.
Hennes

5

Cuộc gọi POSIX trong Linux readdir () không đảm bảo bất kỳ thứ tự nhất quán nào. Nếu bạn muốn kết quả được đặt hàng, ứng dụng xử lý tệp có trách nhiệm sắp xếp cách chúng được trình bày cho các chức năng gọi.

/programming/8977441/does-readdir-guarantee-an-order

Bây giờ, vì bạn nói đây là mã của khách hàng của bạn và bạn không thể sửa nó, bạn có thể thay đổi các thư viện được liên kết được sử dụng để cung cấp một cuộc gọi readdir () nhất quán. Điều đó sẽ mất một số công việc và có giá trị câu hỏi riêng của mình. Để tham khảo nhanh về điều đó, hãy xem http://www.ibm.com/developerworks/linux/l Library / l-glibc / index.html .

Việc thay đổi điều này có thể sinh ra một số vấn đề khác mà tôi không thể lường trước được. Bạn nên hết sức thận trọng, nhưng nó có thể là một giải pháp nếu khách hàng của bạn không thể được giáo dục đúng cách.


1

Giáo dục khách hàng của bạn rằng có một sự phụ thuộc đơn hàng vốn có cần được nêu rõ ràng. Đề nghị giúp khách hàng thể hiện sự phụ thuộc theo cách mà một trình biên dịch hoạt động trên tất cả các hệ thống và để khách hàng chấp nhận luồng thay đổi nắm bắt được sự phụ thuộc của trình biên dịch.

Nếu khách hàng muốn có thể biên dịch trên các máy khác thì họ sẽ nghĩ rằng nó miễn phí.


Chúng tôi chắc chắn sẽ làm điều này. Tuy nhiên, sẽ rất hữu ích nếu họ thực sự trở thành khách hàng của chúng tôi để chúng tôi có thể làm điều này.
Paul Biggar

0

Linux hiện đại (ext4) thêm chỉ mục cây B cho danh sách tệp. Một trong những hiệu ứng của anh ta là thứ tự tập tin mặc định phụ thuộc vào hàm băm tên của họ.

Để tắt tính năng này, hãy sử dụng:

Tune2fs -O ^ dir_index

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.