ตรวจสอบให้แน่ใจการสั่งซื้อไดเรกทอรีทำซ้ำในลินุกซ์


16

ฉันเป็นบริษัท ที่รวมโฮสต์อย่างต่อเนื่องและเราเรียกใช้รหัสลูกค้าของเราบน Linux ทุกครั้งที่เราเรียกใช้รหัสเราเรียกใช้ในเครื่องเสมือนแยกต่างหาก ปัญหาที่เกิดขึ้นบ่อยครั้งคือการทดสอบของลูกค้าบางครั้งจะล้มเหลวเนื่องจากการสั่งซื้อไดเรกทอรีของรหัสของพวกเขาเช็คเอาต์บน VM

ขอรายละเอียดเพิ่มเติมหน่อยสิ บน OSX ระบบไฟล์ HFS + ช่วยให้มั่นใจได้ว่าไดเรกทอรีต่างๆจะถูกสำรวจตามลำดับเดียวกันเสมอ โปรแกรมเมอร์ที่ใช้ OSX สมมติว่าถ้ามันทำงานบนเครื่องของพวกเขามันจะต้องทำงานทุกที่ แต่บ่อยครั้งที่มันไม่สามารถใช้งานได้บน Linux เนื่องจากระบบไฟล์ของ linux ไม่รับประกันการสั่งซื้อเมื่อทำการสำรวจไดเรกทอรี

ยกตัวอย่างเช่นพิจารณาว่ามี 2 ไฟล์คือ 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ทำ

คุณพูดถึงไฟล์a.rbและb.rbแต่ถ้าเรากำลังพูดถึงไฟล์ต้นฉบับภาษาโปรแกรมแต่ละไฟล์ไม่ควรรับผิดชอบในการตรวจสอบให้แน่ใจว่ามันนำเข้าอ้างอิงทั้งหมดหรือไม่


ปัญหาคือเราไม่ได้เขียนรหัสที่เราใช้อยู่ เราเรียกใช้รหัสลูกค้าและเราไม่สามารถควบคุมวิธีการเขียนรหัสได้ ดังนั้นปัญหาของเราคือเราถูกกล่าวหาว่าเป็นปัญหาเพราะใช้งานได้บนเครื่องของพวกเขา แต่ไม่ใช่ของเรา ถ้าเราสามารถบังคับให้ทุกคนเขียนรหัสที่ถูกต้องได้ แต่นั่นไม่ใช่สิ่งที่อยู่ในอำนาจของเรา :)
Paul Biggar

10
@PaulBiggar แต่ไม่ได้ "มันจะทำงานที่นี่ แต่ไม่ได้อยู่ในการผลิต" ว่าปัญหาที่ CI ควรจะแก้ไข? กล่าวอีกนัยหนึ่ง: "ทำไมรหัสของฉันถึงแตกในระบบของคุณ" ควรตอบด้วย "เพราะเราทำตามที่คุณขอมา!" ;-)
Joachim Sauer

4
ฉันไม่รู้เกี่ยวกับคนอื่น แต่เมื่อโค้ดทำงานบนเครื่องของฉันและจากนั้นก็ล้มเหลวในการชำระเงิน CI หรือเพื่อนร่วมงานของฉันทันทีฉันคิดว่ามีบางสิ่งบางอย่างขึ้นอยู่กับแพลตฟอร์มหรือสภาพแวดล้อมที่ฉันต้องแก้ไข ...
matt5784

1
การพัฒนาแอพพลิเคชั่นอย่างแน่นอนบนแพลตฟอร์มที่คุณไม่เคยใช้ในการผลิตเป็นความคิดที่ไม่ดีใช่ไหม ให้พวกเขาพัฒนาบนแพลตฟอร์มเดียวกับที่พวกเขาเขียน
Matthew Ife

2
ฉันไม่เห็นด้วย. ฉันคิดว่ามันเป็นความคิดที่ดี มันทำให้ความผิดพลาดมากขึ้นปรากฏขึ้นในระหว่างการย้ายจากการพัฒนาเพื่อทดสอบเซิร์ฟเวอร์ และทำให้รหัสมีความทนทานมากขึ้นก่อนที่จะย้ายไปยังเซิร์ฟเวอร์ที่ใช้งานจริง ดังนั้นในโลกที่ถูกต้องหรือในทางทฤษฎีมันดีกว่ามาก นี่คือโลกเดียวกับที่คุณสามารถบังคับให้ทุกคนเขียนโค้ดที่ถูกต้องซึ่งรู้จักกันในนาม Dreamland
Hennes

5

การเรียก POSIX ใน Linux readdir () ไม่รับประกันการสั่งซื้อที่สอดคล้องกัน หากคุณต้องการผลลัพธ์ที่ได้รับคำสั่งแอพพลิเคชั่นที่จัดการไฟล์จะรับผิดชอบในการสั่งซื้อวิธีการนำเสนอไปยังฟังก์ชั่นการโทร

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

ตอนนี้เนื่องจากคุณบอกว่านี่เป็นรหัสลูกค้าของคุณและคุณไม่สามารถแก้ไขได้คุณอาจแก้ไขไลบรารีที่เชื่อมโยงที่ใช้ในการให้บริการ readdir () ที่สอดคล้องกัน ที่จะใช้งานและมีค่าคำถามของตัวเอง สำหรับการอ้างอิงอย่างรวดเร็วไปที่ดู http://www.ibm.com/developerworks/linux/library/l-glibc/index.html

การเปลี่ยนแปลงสิ่งนี้อาจทำให้เกิดปัญหาอื่น ๆ อีกหลายชุดที่ฉันอาจไม่สามารถคาดการณ์ได้ คุณควรระวังอย่างยิ่ง แต่อาจเป็นวิธีแก้ปัญหาหากลูกค้าของคุณไม่สามารถได้รับการศึกษาอย่างเหมาะสม


1

ให้ความรู้แก่ลูกค้าของคุณว่ามีการพึ่งพาคำสั่งโดยธรรมชาติที่ควรระบุไว้อย่างชัดเจน เสนอเพื่อช่วยให้ลูกค้าแสดงการพึ่งพาในลักษณะที่คอมไพล์ทำงานได้กับทุกระบบและให้ลูกค้าปรับใช้โฟลว์ที่เปลี่ยนแปลงซึ่งจับการพึ่งพาลำดับการรวบรวม

หากลูกค้าต้องการรวบรวมเครื่องอื่น ๆ แล้วพวกเขาจะคิดว่ามันมาฟรี


เราจะทำสิ่งนี้อย่างแน่นอน อย่างไรก็ตามมันจะมีประโยชน์หากพวกเขากลายเป็นลูกค้าของเราจริง ๆ เพื่อให้เราสามารถทำได้
Paul Biggar

0

Modern Linux (ext4) เพิ่มดัชนี B-tree สำหรับรายการไฟล์ หนึ่งในผลกระทบของเขาคือการสั่งซื้อไฟล์เริ่มต้นขึ้นอยู่กับแฮชของชื่อของพวกเขา

หากต้องการปิดใช้งานคุณสมบัตินี้ให้ใช้:

tune2fs -O ^ dir_index

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.