리눅스에서 반복 가능한 디렉토리 순서 보장


16

나는 실행 호스팅 지속적인 통합 회사, 우리는 리눅스에 대한 고객의 코드를 실행합니다. 코드를 실행할 때마다 별도의 가상 머신에서 코드를 실행합니다. 자주 발생하는 문제는 VM에서 코드를 체크 아웃 한 디렉토리 순서로 인해 고객의 테스트가 실패하는 경우가 있습니다.

좀 더 자세히 살펴 보겠습니다. OSX에서 HFS + 파일 시스템은 디렉토리가 항상 동일한 순서로 순회되도록합니다. OSX를 사용하는 프로그래머는 자신의 컴퓨터에서 작동하면 어디에서나 작동해야한다고 가정합니다. 그러나 리눅스 파일 시스템은 디렉토리를 탐색 할 때 순서 보장을 제공하지 않기 때문에 Linux에서는 종종 작동하지 않습니다.

예를 들어, a.rb, b.rb라는 두 개의 파일이 있다고 가정하십시오. a.rb는 정의 MyObject하고 b.rb는 사용합니다 MyObject. a.rb가 먼저로드되면 모든 것이 작동합니다. b.rb가 먼저로드되면 정의되지 않은 변수에 액세스하려고 시도 MyObject하고 실패합니다.

그러나 이것보다 더 나쁜 것은 항상 실패하지는 않는다는 것입니다. Linux에서 파일 시스템 순서는 순서가 없으므로 다른 시스템에서는 순서가 다릅니다. 때로는 테스트가 통과하고 때로는 실패하기 때문에 더 나쁩니다. 이것이 최악의 결과입니다.

그래서 제 질문은 파일 시스템 순서를 반복 가능하게 만드는 방법이 있습니까? 아마도 ext4에 대한 일부 플래그는 항상 어떤 순서로 디렉토리를 통과한다고 말합니다. 아니면이 보증이있는 다른 파일 시스템입니까?



정말 진정한 대답 외에 - 무엇 은 "올바른"순서는? 알파벳순으로 정렬? 아니면 CTIME? 임의로 마 법적으로? 고객은 배포시이 주문을 어떻게 보장합니까? 이 마법 주문 정보는 어떻게 당신에게 전달되어야합니까?
Michuelnik

@Michuelnik 정확한 순서는 없지만 반복 가능한 것은 매번 동일한 결과를 얻음을 의미하며, 이는 아무것도 아닌 것보다 낫습니다. 이상적으로는 알파벳 순서 인 HFS + 순서를 사용합니다.
Paul Biggar

@Michuelnik이 문제는 배포보다 대부분 테스트에 영향을 미칩니다. 배포는 대부분 Linux에서 발생하지만 문제가 발생하면 문제를 해결합니다. 테스트는 대부분 OSX에서 실행되므로 문제가 발생하면 우리의 잘못이어야합니다.
Paul Biggar

1
@PaulBiggar : 문제를 이해하고 좋은 해결책을 제시 할 수 없습니다 ( 파일 순서가 문제의 원인인지 여부 를 감지 하는 방법을 찾을 없다면). 그러나 "반복 가능한 성공이 일관성없는 실패자보다 낫다"는 것에 동의 하지 않습니다 . 개발 (및 CI) 환경에서 반복 가능한 성공을 거두었지만 배포 플랫폼에 "신뢰할 수없는 실패"라는 신드롬이있는 경우에는 실제로 잘못된 위치에 있습니다. 차라리 개발 시스템에서는 이상적이지만 CI 시스템 에서는 이상적으로 가능한 한 빨리 신뢰할 수없는 장애를보고 싶습니다 .
Joachim Sauer

답변:


16

나는 그것이 당신이 찾고있는 대답이 아니라는 것을 알고 있지만 올바른 해결책은 디렉토리의 파일 순서에 따라 피하는 것 입니다. 어쩌면 모든 HFS + 파일 시스템에서 항상 일관성이있을 수도 있고, ext4 또는 다른 파일 시스템에서도 일관성을 유지하는 방법을 찾을 수도 있지만 장기적으로 저장하는 것보다 더 많은 문제가 발생할 수 있습니다. 응용 프로그램을 사용하는 다른 사람은 일부 유형의 파일 시스템과 만 호환되고 다른 파일 시스템과는 호환되지 않는다는 것을 깨닫지 못할 때 놀라움을 금치 못할 것입니다. 파일 시스템이 백업에서 복원되면 순서가 변경 될 수 있습니다. HFS + 일관된 순서와 ext4 일관된 순서가 같지 않기 때문에 호환성 문제가 발생할 수 있습니다.

사용하기 전에 모든 디렉토리 항목을 읽고 사전 사전 순으로 정렬하십시오. 그냥 같이 ls한다.

files a.rb및에 대해 언급 하고 b.rb있지만 프로그래밍 언어 소스 파일에 대해 이야기하는 경우 각 파일이 모든 종속성을 가져와야하는지에 대해 책임을지지 않아야합니까?


문제는 우리가 실행중인 코드를 작성하지 않았다는 것입니다. 우리는 고객 코드를 실행하고 코드 작성 방법을 제어 할 수 없습니다. 따라서 우리의 문제는 실제로 우리의 컴퓨터에서는 작동하지만 우리의 컴퓨터에서는 작동하지 않기 때문에 문제에 대한 비난을 받고 있다는 것입니다. 모든 사람이 올바른 코드를 작성하도록 강요 할 수는 있지만 그렇게 할 수는 없습니다.)
Paul Biggar

10
@PaulBiggar : CI가 고쳐야하는 문제가 정확히 "여기서 실행되고 있지는 않지만"그렇지 않습니까? 다시 말해 : "왜 내 코드가 시스템에서 중단됩니까?" "우리 가 요청한 것을 정확하게 수행하고 있기 때문 입니다!" ;-)
Joachim Sauer

4
나는 다른 사람에 대해 모른다. 그러나 코드가 내 컴퓨터에서 작동하고 CI 또는 동료의 체크 아웃에 실패하면 즉시 수정해야 할 플랫폼 또는 환경에 따라 무언가가 있다고 가정합니다 ...
matt5784

1
프로덕션 환경에서 사용하지 않을 플랫폼에서 애플리케이션을 개발하는 것은 나쁜 생각입니까? 그들이 작성한 것과 동일한 플랫폼에서 개발하도록하십시오.
Matthew Ife

2
동의하지 않습니다. 좋은 생각이라고 생각합니다. 개발에서 테스트 서버로 이동하는 동안 훨씬 더 많은 오류가 표시됩니다. 따라서 코드는 프로덕션 서버로 이동하기 전에 훨씬 더 튼튼합니다. 따라서 정확하거나 이론적 인 세상에서는 훨씬 좋습니다. 이것은 모두가 dreamland라고도하는 올바른 코드를 작성하도록 강요 할 수있는 동일한 세상입니다.
Hennes

5

Linux readdir ()의 POSIX 호출은 일관된 순서를 보장하지 않습니다. 정렬 된 결과를 원하는 경우 파일을 처리하는 응용 프로그램은 호출 함수에 표시되는 방법을 순서대로 책임집니다.

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

이 코드가 고객의 코드라고 말하면 고칠 수 없으므로 일관된 readdir () 호출을 제공하는 데 사용되는 연결된 라이브러리를 변경할 수 있습니다. 그것은 약간의 작업이 필요하고 자체 질문의 가치가 있습니다. 이에 대한 빠른 참조는 http://www.ibm.com/developerworks/linux/library/l-glibc/index.html을 참조 하십시오 .

이를 변경하면 예측할 수없는 다른 일련의 문제가 발생할 수 있습니다. 주의를 기울여야하지만 고객 교육을 제대로받지 못하면 해결 방법이 될 수 있습니다.


1

명시 적으로 명시해야하는 고유 한 주문 종속성이 있음을 고객에게 교육하십시오. 컴파일이 모든 시스템에서 작동하는 방식으로 고객이 종속성을 표현하고 컴파일 순서 종속성을 캡처하는 변경된 플로우를 채택하도록 고객을 지원하십시오.

고객이 다른 컴퓨터에서 컴파일 할 수 있기를 원한다면 무료로 제공된다고 생각하는 것이 당황 스러울 것입니다.


우리는 확실히 이것을 할 것입니다. 그러나 고객이 실제로 고객이 된 경우 유용 할 수 있습니다.
Paul Biggar

0

최신 Linux (ext4)는 파일 목록에 대한 B- 트리 색인을 추가합니다. 그의 효과 중 하나는 기본 파일 순서가 이름의 해시에 달려 있다는 것입니다.

이 기능을 비활성화하려면 다음을 사용하십시오.

tune2fs -O ^ dir_index

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.