मैं EXT4 पर "बग" पर चर्चा का पालन कर रहा हूं जो फ़ाइलों को क्रैश में शून्य करने का कारण बनता है यदि कोई "temp फ़ाइल बनाएं, temp फ़ाइल लिखें, फ़ाइल को लक्षित करने के लिए temp का नाम बदलें" प्रक्रिया का उपयोग करता है। POSIX का कहना है कि जब तक fsync() कहा जाता है, तो आप यह सुनिश्चित नहीं कर सकते कि डेटा हार्डडिस्क पर पहुंचा दिया गया है।POSIX सिस्टम पर एकाधिक फ़ाइलों को संशोधित करने के लिए सुरक्षित और कुशल तरीका?
जाहिर कर रही है:
0) get the file contents (read it or make it somehow)
1) open original file and truncate it
2) write new contents
3) close file
भी fsync() के रूप में कंप्यूटर 2 के दौरान दुर्घटना कर सकते हैं) या fsync() के साथ अच्छा नहीं है और आप आंशिक रूप से लिखा फ़ाइल के साथ खत्म।
आमतौर पर यह सोचा गया है कि यह बहुत सुरक्षित है:
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) close temp file
4) rename temp file to original file
दुर्भाग्य से ऐसा नहीं है। यह EXT4 पर सुरक्षित बनाने के लिए आपको बस इतना करना होगा:
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) fsync()
4) close temp file
5) rename temp file to original file
यह सुरक्षित होगा और दुर्घटना पर आप या तो नई फ़ाइल सामग्री या पुराने, कभी नहीं ध्यान केंद्रित किया सामग्री या आंशिक सामग्री होनी चाहिए। लेकिन अगर एप्लिकेशन बहुत सारी फाइलों का उपयोग करता है, तो प्रत्येक लिखने के बाद fsync() धीमा हो जाएगा।
तो मेरा सवाल यह है कि, एक सिस्टम पर कुशलतापूर्वक एकाधिक फ़ाइलों को कैसे संशोधित करें जहां fsync() को यह सुनिश्चित करने की आवश्यकता है कि परिवर्तन डिस्क में सहेजे गए हैं? और मैं वास्तव में हजारों फाइलों में, कई फ़ाइलों को संशोधित करने का मतलब है। प्रत्येक फाइल को संशोधित करना और fsync() करना प्रत्येक के बाद बहुत खराब नहीं होगा, लेकिन fsync() कई फ़ाइलों को संशोधित करते समय धीमी चीजें करता है।
संपादित करें: fsync() बंद temp फ़ाइल को कोरेंट ऑर्डर में बदल दिया है, कई कई फाइलें लिखने पर जोर दिया गया है।
नाम बदलने के साथ कोई fsync() के बिना 100,000 कॉन्फ़िगरेशन फ़ाइलों को लिख सकता है, और 100.000 fsync() धीमा हो जाएगा। – Raynet
"आप चाहते हैं कि डिस्क को डिस्क पर लिखा गया हो() वैसे भी" आप किस बारे में बात कर रहे हैं? बंद केवल POSIX के अनुसार फ़ाइल विवरण को रद्द करना है। बफर फ्लश करने की कोई आवश्यकता नहीं है। http://pubs.opengroup.org/onlinepubs/9699919799/functions/close।एचटीएमएल – ArekBulski