मैं कई क्लाइंट्स पर उपयोग की गई फ़ाइलों को लॉक करने के लिए झुंड () / BSD ताले का उपयोग करने की कोशिश कर रहा हूं, लेकिन फाइलें दूषित हो जाती हैं। कैसे? ए। झुंड () / बीएसडी ताले 2.6.12 से पहले केवल लिनक्स एनएफएस ग्राहकों पर स्थानीय रूप से कार्य करते हैं। यह सुनिश्चित करने के लिए fcntl () / POSIX लॉक का उपयोग करें कि फ़ाइल लॉक अन्य क्लाइंट को दिखाई दे।
एनएफएस फ़ाइल तक पहुंच को अनुक्रमित करने के कुछ तरीके यहां दिए गए हैं।
Fcntl () / POSIX लॉकिंग API का उपयोग करें। इस प्रकार का लॉकिंग एनएलएम प्रोटोकॉल के माध्यम से या एनएफएसवी 4 के माध्यम से कई क्लाइंट्स पर बाइट-रेंज लॉकिंग प्रदान करता है। एक अलग लॉकफ़ाइल का उपयोग करें, और इसके लिए हार्ड लिंक बनाएं। प्राणी के O_EXCL अनुभाग (2) मैन पेज में विवरण देखें। यह ध्यान देने योग्य है कि 2.6 kernels तक, O_EXCL बनाता है लिनक्स एनएफएस ग्राहकों पर परमाणु नहीं थे। जब तक आप एक कर्नेल को 2.6.5 से नया नहीं चला रहे हैं, तब तक कई NFS क्लाइंट के बीच O_EXCL क्रिएट और परमाणु व्यवहार की अपेक्षा न करें।
यह एक ज्ञात समस्या है कि पर्ल डिफ़ॉल्ट रूप से झुंड () / बीएसडी लॉकिंग का उपयोग करता है। यह अन्य ऑपरेटिंग सिस्टम जैसे सोलारिस से पोर्ट किए गए प्रोग्राम को तोड़ सकता है, जो उम्मीद करता है कि पीओएस लॉक की तरह काम करने के लिए झुंड / बीएसडी लॉक।
लिनक्स पर, हार्ड लिंक के बजाय फाइल लॉकिंग का उपयोग करने से सर्वर के साथ क्लाइंट के कैश को चेकपॉइंट करने का अतिरिक्त लाभ होता है। जब एक फ़ाइल लॉक का अधिग्रहण किया जाता है, तो क्लाइंट उस फ़ाइल के लिए पेज कैश को फ्लश करेगा ताकि किसी भी बाद में पढ़ने वाले को सर्वर से नया डेटा मिल सके। जब कोई फ़ाइल लॉक रिलीज़ किया जाता है, तो उस क्लाइंट पर फ़ाइल में कोई भी परिवर्तन लॉक जारी होने से पहले सर्वर पर वापस भेज दिया जाता है, ताकि उस फ़ाइल को लॉक करने के लिए इंतजार कर रहे अन्य ग्राहक परिवर्तनों को देख सकें।
2.6.12 में NFS क्लाइंट, POSIX बाइट रेंज लॉक के संदर्भ में BSD- शैली के ताले का अनुकरण करके NFS फाइलों पर झुंड () / BSD ताले के लिए समर्थन प्रदान करता है। अन्य NFS क्लाइंट जो समान इम्यूलेशन मेकेनिज्म का उपयोग करते हैं, या जो fcntl () / POSIX लॉक का उपयोग करते हैं, फिर वही लॉक देखेंगे जो लिनक्स NFS क्लाइंट देखता है।
स्थानीय लिनक्स फाइल सिस्टम पर, POSIX ताले और BSD ताले एक दूसरे के लिए अदृश्य हैं। इस प्रकार, इस अनुकरण के कारण, लिनक्स एनएफएस सर्वर पर चलने वाले एप्लिकेशन अभी भी एनएफएस क्लाइंट द्वारा लॉक की गई फ़ाइलों को एक fcntl () / POSIX लॉक के साथ लॉक होने के रूप में देखेंगे, चाहे क्लाइंट पर एप्लिकेशन बीएसडी-शैली का उपयोग कर रहा हो या पॉसिक्स- शैली का ताला। यदि सर्वर एप्लिकेशन झुंड () बीएसडी ताले का उपयोग करता है, तो यह एनएफएस क्लाइंट के उपयोग के ताले को नहीं देखेगा।