मैं JSON फ़ाइलें लिख रहा हूँ। इसका अर्थ है कि प्रत्येक '{' वर्ण के लिए, एक संगत '}' है और फ़ाइल में अंतिम बाइट '}' है। लेखन क्रमिक रूप से होता है। कोई fseeks नहीं हैं। इस प्रकार यदि फ़ाइल को लिखना किसी तरह बाधित होता है, तो मुझे एक अमान्य JSON फ़ाइल होने की उम्मीद है।

अब एक काल्पनिक फाइल सिस्टम मेरे बाइट्स को क्रम से बाहर फ्लश करने का निर्णय ले सकता है। इसका मतलब यह होगा कि अगर लेखन के दौरान बिजली की कमी होती है, तो सब कुछ फ्लश होने से पहले, मुझे एक वैध JSON मिल सकता है जिसमें मेरा इच्छित डेटा नहीं होता है। मेरे पास "yyy" के बजाय स्ट्रिंग "xxx" हो सकती है, या संख्याओं के अंत से अंक गायब हो सकते हैं।

क्या ऐसी फाइल सिस्टम मौजूद है? क्या मैं इस तथ्य पर भरोसा कर सकता हूं कि यदि कोई फ़ाइल वैध है, तो उसके पूर्ण होने की गारंटी है?

संपादित करें: यह प्रश्न उस मामले के लिए है जहां डेटा मान्य नहीं हो सकता है यदि इसमें अंतिम बाइट गुम है। JSON यहाँ उदाहरण है। Techincally 42342 एक मान्य JSON है, जिसे अपूर्ण होने पर सत्यापित नहीं किया जा सकता है।

1
Borislav Stanimirov 18 जून 2020, 18:05

1 उत्तर

सबसे बढ़िया उत्तर

फाइल सिस्टम के आपके पृष्ठों को क्रम से बाहर करने के कई कारण हो सकते हैं:

  • पृष्ठ में 2 फ़ाइलों का डेटा है, और दूसरी फ़ाइल को डिस्क पर फ़्लश किया जा रहा है।
  • पृष्ठ प्रक्रिया के कार्य सेट से बाहर है (और इसलिए कैशिंग के लायक नहीं है) और ओएस को अन्य उद्देश्यों के लिए स्मृति की आवश्यकता है।
  • फाइल सिस्टम वितरित किया जाता है उदा। ऑरेंजएफएस या एंड्रयू फाइलसिस्टम, और बहुत अलग कार्यान्वयन नियमों द्वारा खेलता है।
  • फाइल सिस्टम एनएफएस एक अधिक जटिल वितरित, उपकरणों के विषम सेट को सामने रखता है जहां कुछ लिखते हैं पूरी तरह से सिंक्रोनस होते हैं और एप्लिकेशन कोई भी समझदार नहीं होता है।

और यह सिर्फ फाइल सिस्टम ही नहीं है, बल्कि अंतर्निहित डिवाइस भी है।

  • ब्लॉक डिवाइस तब तक बफरिंग कर सकता है जब तक कि फाइल सिस्टम को वास्तव में पूर्ण फ्लश की आवश्यकता नहीं होती है, और इसे उचित क्रम में फ्लश करता है (क्योंकि यह फाइलों की अवधारणा से अनजान है)।
  • ब्लॉक डिवाइस को स्ट्राइप किया जा सकता है (RAID0), ताकि एक डिवाइस दूसरे के सामने फ्लश हो सके।

उस ने कहा, दुर्घटना के बाद xxx जैसे 3 बाइट्स के नुकसान का अनुभव करने की बहुत संभावना नहीं है। यह ब्लॉक के नुकसान का अनुभव करने की अधिक संभावना है, उदा। 4096 बाइट्स के गुणकों का।

सच्चाई यह है कि अधिकांश फाइल सिस्टम क्रैश के दौरान लिखे गए डेटा की अखंडता के बारे में कोई गारंटी नहीं देते हैं (मेटाडेटा के विपरीत)।

जब परमाणुता की आवश्यकता होती है, तो लीवरेज rename(2) या इसके समकक्ष:

  1. एक अस्थायी फ़ाइल को लिखें उदा। POSIX write(2) के साथ।
  2. फ़ाइल फ्लश करें उदा। POSIX fsync(2) के साथ और इसे बंद करें।
  3. फ़ाइल को लक्ष्य नाम में बदलें, उदा। POSIX rename(2) के साथ।

मुझे पता है कि सभी पॉज़िक्स फाइल सिस्टम सक्रिय उपयोग में हैं, पॉज़िक्स नाम को क्रैश-सुरक्षित तरीके से लागू करते हैं, मुझे लगता है कि एनटीएफएस भी करता है।

लेकिन यह स्पष्ट रूप से POSIX द्वारा कड़ाई से जरूरी नहीं है। चूंकि आप नई फाइलें लिख रहे हैं, यह कोई समस्या नहीं है, लेकिन यदि आप अतिरिक्त पागल होना चाहते हैं, तो आप एक और कदम जोड़ सकते हैं:

  1. अस्थायी फ़ाइल हटाएं (त्रुटि को अनदेखा करें यदि वह मौजूद नहीं है)।
1
root 20 जून 2020, 23:58