लिनक्स में एक दोहराए जाने योग्य निर्देशिका को सुनिश्चित करना


16

मैं एक होस्ट निरंतर एकीकरण कंपनी चलाता हूं , और हम लिनक्स पर अपने ग्राहकों का कोड चलाते हैं। हर बार जब हम कोड चलाते हैं, तो हम इसे एक अलग वर्चुअल मशीन में चलाते हैं। एक लगातार समस्या यह उठती है कि वीएम पर चेक किए गए उनके कोड के निर्देशिका ऑर्डर के कारण कभी-कभी एक ग्राहक के परीक्षण विफल हो जाएंगे।

मुझे और विस्तार में जाने दो। OSX पर, HFS + फ़ाइल सिस्टम यह सुनिश्चित करता है कि निर्देशिका हमेशा एक ही क्रम में ट्रैवर्स की गई हो। OSX का उपयोग करने वाले प्रोग्रामर यह मानते हैं कि यदि यह उनके मशीन पर काम करता है, तो इसे हर जगह काम करना चाहिए। लेकिन यह अक्सर लिनक्स पर काम नहीं करता है, क्योंकि लिनक्स फ़ाइल सिस्टम निर्देशिकाओं के ट्रैवर्सिंग के दौरान ऑर्डर की गारंटी नहीं देता है।

एक उदाहरण के रूप में, विचार करें कि 2 फाइलें हैं, a.rb, b.rb। a.rb को परिभाषित करता है MyObject, और b.rb का उपयोग करता है MyObject। यदि a.rb को पहले लोड किया जाता है, तो सब कुछ काम करेगा। यदि b.rb को पहले लोड किया जाता है, तो यह अपरिभाषित चर तक पहुंचने का प्रयास करेगा MyObject, और विफल हो जाएगा।

लेकिन इससे भी बदतर यह है कि यह हमेशा विफल नहीं होता है। क्योंकि लिनक्स पर फ़ाइल सिस्टम ऑर्डर करने का आदेश नहीं दिया गया है, इसलिए यह विभिन्न मशीनों पर एक अलग ऑर्डर होगा। यह बदतर है क्योंकि कभी-कभी परीक्षण पास हो जाते हैं, और कभी-कभी वे असफल हो जाते हैं। यह सबसे खराब संभव परिणाम है।

तो मेरा सवाल यह है कि क्या फाइल सिस्टम को रिपीटेबल बनाने का कोई तरीका है। कुछ ध्वज ext4 के लिए शायद, कहते हैं कि यह हमेशा कुछ क्रम में निर्देशिकाओं को पार करेगा? या शायद एक अलग फ़ाइल सिस्टम है जिसमें यह गारंटी है?



वास्तव में सच्चा जवाब इसके अलावा - क्या है "सही" आदेश? बस अल्फ़ान्यूमेरिक रूप से हल किया गया? या CTIME द्वारा? मनमाने ढंग से जादुई? तैनाती पर ग्राहक इस आदेश को कैसे सुनिश्चित करते हैं? इस जादुई आदेश की जानकारी आपको कैसे हस्तांतरित की जानी चाहिए?
मिचेल्चनिक

@ मिचेलनिक कोई वास्तविक सही क्रम नहीं है, लेकिन कुछ दोहराए जाने का मतलब होगा कि हमें हर बार वही परिणाम मिलेगा, जो कुछ भी नहीं से बेहतर होगा। आदर्श रूप में, हम HFS + ऑर्डरिंग का उपयोग करेंगे, जो मुझे लगता है कि वर्णमाला है।
पॉल बिगगर

@ मिचेलनिक यह समस्या तैनाती की तुलना में बहुत अधिक परीक्षणों को प्रभावित करती है तैनाती ज्यादातर लिनक्स पर होती है, लेकिन अगर कुछ विफल हो जाता है तो वे इसे ठीक कर देंगे। टेस्ट ज्यादातर OSX पर चलते हैं इसलिए अगर कुछ विफल होता है तो यह हमारी गलती होनी चाहिए।
पॉल बिगगर

1
@PaulBiggar: मैं आपकी समस्या को समझता हूं और मैं एक अच्छा समाधान पेश नहीं कर सकता (जब तक कि आपको पता लगाने का कोई तरीका नहीं मिल सकता है कि फाइल ऑर्डर समस्या का कारण है)। लेकिन मैं इस बात से सहमत नहीं हूं कि "असंगत असफलता की तुलना में दोहराव वाली सफलता बेहतर है": यदि मेरे विकास (और सीआई) के वातावरण में लगातार सफलता मिलती है, लेकिन मेरे तैनाती मंच में "अविश्वसनीय विफलता" सिंड्रोम है, तो मैं बुरी तरह से परेशान हूं। मैं चाहता हूँ बल्कि संभव के रूप में (आदर्श मेरे विकास सिस्टम पर लेकिन जैसे ही अविश्वसनीय विफलता को देखने के लिए कम से कम मेरी सीआई सिस्टम पर)।
जोआचिम सॉर

जवाबों:


16

मुझे पता है कि यह वह उत्तर नहीं है जिसकी आप तलाश कर रहे हैं, लेकिन मेरा मानना ​​है कि एक निर्देशिका में फ़ाइलों के आदेश के आधार पर सही समाधान से बचना है । हो सकता है कि यह हमेशा सभी HFS + फाइलसिस्टमों के अनुरूप हो, और हो सकता है कि आप इसे ext4 या किसी अन्य फाइलसिस्टम के अनुरूप बनाने का कोई तरीका ढूंढ सकें, लेकिन यह आपको लंबे समय तक बचाने में ज्यादा परेशानी देगा। आपके आवेदन का उपयोग करने वाला कोई और व्यक्ति आश्चर्यचकित हो जाएगा, जब उन्हें यह महसूस नहीं होगा कि यह केवल कुछ प्रकार के फाइल सिस्टम के साथ ही संगत है और दूसरों के लिए नहीं। यदि कोई सिस्टम बैकअप से पुनर्स्थापित किया जाता है, तो क्रम बदल सकता है। आप संभवतः संगतता समस्याओं में भाग लेंगे क्योंकि HFS + सुसंगत क्रम और ext4 सुसंगत क्रम समान नहीं हो सकते हैं।

बस निर्देशिका प्रविष्टियों के सभी पढ़ें और सूची का उपयोग करने से पहले इसे क्रमबद्ध करें। जैसा lsकरता है।

आप फ़ाइलों का उल्लेख करते हैं a.rbऔर b.rb, लेकिन अगर हम प्रोग्रामिंग भाषा स्रोत फ़ाइलों के बारे में बात कर रहे हैं, तो क्या प्रत्येक फ़ाइल को यह सुनिश्चित करने के लिए पहले से ज़िम्मेदार नहीं होना चाहिए कि वह अपनी सभी निर्भरताओं को आयात करती है?


समस्या यह है कि हमने वह कोड नहीं लिखा है जो हम चला रहे हैं। हम ग्राहक कोड चलाते हैं, और कोड कैसे लिखा जाता है, इस पर हमारा कोई नियंत्रण नहीं है। इसलिए हमारी समस्या वास्तव में यह है कि हमें समस्या के लिए दोषी ठहराया जा रहा है, क्योंकि यह उनकी मशीन पर काम करती है लेकिन हमारी नहीं। यदि हम सभी को सही कोड लिखने के लिए मजबूर कर सकते हैं, तो हम करेंगे, लेकिन यह हमारी शक्ति के भीतर नहीं है :)
पॉल बिगगर

10
@PaBBiggar: लेकिन यह "यहाँ नहीं बल्कि उत्पादन में चलता है" वास्तव में सीआई को ठीक करने वाली समस्या है? दूसरे शब्दों में: "मेरा कोड आपके सिस्टम में क्यों टूटता है?" के साथ उत्तर दिया जाना चाहिए "क्योंकि हम वही कर रहे हैं जो आप हमसे पूछ रहे हैं!" ;-)
जोआचिम सॉर

4
मैं किसी और के बारे में नहीं जानता, लेकिन जब कोड मेरी मशीन पर काम करता है और फिर एक CI या सहकर्मी के चेकआउट पर विफल हो जाता है तो मैं तुरंत मान
लेता

1
निश्चित रूप से उत्पादन में उपयोग न करने वाले प्लेटफॉर्म पर एप्लिकेशन विकसित करना एक बुरा विचार है? उन्हें उसी मंच पर विकसित करने के लिए प्राप्त करें, जिसके लिए वे लिख रहे हैं।
मैथ्यू इफ

2
मैं असहमत हूं। मुझे लगता है कि यह एक महान विचार है। यह विकास से परीक्षण सर्वरों की ओर बढ़ने के दौरान बहुत अधिक दोष दिखाता है। और इस प्रकार उत्पादन सर्वर पर जाने से पहले कोड बहुत अधिक मजबूत होता है। तो एक सही या सैद्धांतिक दुनिया में यह बहुत बेहतर है। यह वही दुनिया है जहाँ आप सभी को सही कोड लिखने के लिए मजबूर कर सकते हैं, जिसे स्वप्नदोष भी कहा जाता है।
हेन्नेस

5

लिनक्स रीडडिर () में POSIX कॉल किसी भी सुसंगत आदेश की गारंटी नहीं देता है। यदि आप ऑर्डर किए गए परिणाम चाहते हैं, तो फ़ाइलों को संभालने वाला एप्लिकेशन ऑर्डर करने के लिए ज़िम्मेदार है कि उन्हें कॉलिंग फ़ंक्शन के लिए कैसे प्रस्तुत किया जाए।

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

अब, चूंकि आपने कहा था कि यह आपके ग्राहक का कोड था और आप इसे ठीक नहीं कर सकते हैं, आप संभवतः लिंक किए गए पुस्तकालयों को बदल सकते हैं जो एक संगत रीडिर () कॉल प्रदान करने के लिए उपयोग किए जाते हैं। वह कुछ काम लेगा और अपने सवाल के लायक होगा। उस के त्वरित संदर्भ के लिए, http://www.ibm.com/developerworks/linux/library/l-glibc/index.html देखें ।

इसे बदलने से कुछ अन्य मुद्दों की पूरी श्रृंखला बन सकती है, जिन्हें मैं समझ नहीं सकता। आप दृढ़ता से सावधान हैं, लेकिन यह एक समाधान हो सकता है यदि आपका ग्राहक ठीक से शिक्षित नहीं हो सकता है।


1

अपने ग्राहक को शिक्षित करें कि एक अंतर्निहित आदेश निर्भरता है जिसे स्पष्ट रूप से कहा जाना चाहिए। ग्राहक को निर्भरता को इस तरह व्यक्त करने में मदद करने की पेशकश करें कि सभी प्रणालियों पर एक संकलन काम करता है और ग्राहक ने बदले हुए प्रवाह को अपनाया है जो संकलन आदेश निर्भरता को पकड़ता है।

यदि ग्राहक अन्य मशीनों पर संकलन करने में सक्षम होना चाहता है, तो यह सोचना उनके लिए अच्छा होगा कि यह मुफ्त में आता है।


हम निश्चित रूप से ऐसा करने जा रहे हैं। हालांकि, यह उपयोगी होगा यदि वे वास्तव में हमारे ग्राहक बन गए ताकि हम ऐसा कर सकें।
पॉल बिगगर

0

आधुनिक लिनक्स (ext4) फ़ाइल सूचियों के लिए एक बी-ट्री इंडेक्स जोड़ता है। उनका एक प्रभाव डिफॉल्ट फाइल ऑर्डर उनके नामों के हैश पर निर्भर करता है।

इस सुविधा का उपयोग अक्षम करने के लिए:

tune2fs -O ^ dir_index

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.