एनएफएस के साथ घुड़सवार होने पर एक निर्देशिका में एक ही नाम के साथ दो फाइलें कैसे हो सकती हैं?


8

मेरे पास एक C ++ एप्लिकेशन परीक्षण है जो NFS माउंटेड डायरेक्टरी में 10,000 फाइलें बनाता है, लेकिन हाल ही में एक बार एक फाइल के कारण उस निर्देशिका में दो बार एक ही नाम के साथ अन्य सभी 10,000 फाइलों के साथ मेरा परीक्षण विफल हो गया। यह या तो लिनक्स सेंटोस v4 या v5 पर देखा जा सकता है जहां निर्देशिका एनएफएस माउंटेड है, लेकिन मेजबान मशीन पर नहीं जहां डिस्क छुपाती है।

एक ही निर्देशिका में एक ही नाम के साथ दो फाइलें होना भी कैसे संभव है?

[centos4x32 destination] ls -al ./testfile03373
-rwx------  1 user root 3373 Sep  3 03:23 ./testfile03373*
[centos4x32 destination] ls -al ./testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 ./testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 ./testfile03373*
[centos4x32 destination] ls -al *testfile03373
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
[centos4x32 destination] ls -alb test*file03373
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*

नीचे दिए गए किसी एक उत्तर में सुझाए गए पर्ल स्क्रिप्ट को चलाना:

ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'

देता है:

-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*

इनोड (-i) मानों के साथ मुद्रण से पता चलता है कि दो प्रतियों में एक ही इनोड प्रविष्टि (36733444) है:

[h3-centos4x32 destination] ls -alib te*stfile03373
36733444 -rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
36733444 -rwx------  1 user root 3373 Sep  3 03:23 testfile03373*

ऐसा लगता है कि निर्देशिका प्रविष्टि किसी तरह दूषित है।

क्या मेरा एप्लिकेशन वैध रूप से इस स्थिति को बना सकता है या क्या यह ऑपरेटिंग सिस्टम में बग है? फाइल बनाने वाले मेरे कार्यक्रम में इससे बचाव के लिए क्या कुछ है?

मुझे लगता है कि एनएफएस बढ़ते सॉफ्टवेयर में किसी प्रकार की बग है। इसके अलावा 'umount' और फिर NFS ड्राइव का 'माउंट' जो कि समस्या का समाधान नहीं करता है, रिमूव के बाद दोहराया प्रविष्टि बनी हुई है।


अद्यतन 1: मैंने अब इस मुद्दे को दूसरी बार, कुछ घंटों बाद मारा है, और वास्तव में अजीब बात यह है कि यह ठीक उसी फ़ाइल पर हुआ है testfile03373, हालांकि इस बार 213352984, दोहरी फ़ाइलों के लिए एक अलग इनोड मिला है। मैं यह भी जोड़ूंगा कि फाइल सेंटोस 5 मशीन पर बनाई जा रही है जहां डिस्क होस्ट की जा रही है, इसलिए इसे स्थानीय रूप से बनाया जा रहा है, और स्थानीय रूप से सही दिखा रहा है, लेकिन एनएफएस माउंट करने वाली अन्य सभी मशीनों को दोगुनी प्रविष्टि दिखाई दे रही है।


अपडेट 2: मैंने सेंटोस v6 मशीन पर ड्राइव को माउंट किया और /var/log/messagesसूची में डबल प्रविष्टि देखने और देखने के बाद निम्नलिखित पाया :

[root@c6x64 double3373file]# ls -laiB testfile03373* ; tail -3 /var/log/messages
36733444 -rwx------. 1 user root 3373 Sep  3 03:23 testfile03373
36733444 -rwx------. 1 user root 3373 Sep  3 03:23 testfile03373
...
Sep  4 14:59:46 c6x64 kernel: NFS: directory user/double3373file contains a readdir loop.Please contact your server vendor.  The file: testfile03373 has duplicate cookie 7675190874049154909
Sep  4 14:59:46 c6x64 kernel: NFS: directory user/double3373file contains a readdir loop.Please contact your server vendor.  The file: testfile03373 has duplicate cookie 7675190874049154909

इसके अतिरिक्त, मैंने पाया कि फ़ाइल का नाम बदलने से दोहरी प्रविष्टि गायब हो जाती है, लेकिन इसका नाम बदलने से यह फिर से प्रकट हो जाती है, या वैकल्पिक रूप से, बस नाम के साथ एक नई फ़ाइल को छूने से testfile03373दोहरी प्रविष्टि दिखाई देती है, लेकिन यह केवल होता है दो निर्देशिकाएं जहां यह दोहरी प्रविष्टि देखी गई है।


AFAIK, किसी भी फाइल सिस्टम में एक ही डायरेक्टरी में एक ही नाम और एक्सटेंशन coexisitng के साथ दो फाइलों के लिए यह असंभव है। आप विफलता को रोकने के लिए अपने कार्यक्रम में कुछ अपवाद तंत्र का उपयोग कर सकते हैं, अन्य कि यह ...
Doktoro Reichard

आप किस फाइलसिस्टम का उपयोग कर रहे हैं?
डॉकटोरो रीचर्ड

क्या वे ठीक उसी तरह हैं? जैसे कोई अग्रणी या अनुगामी व्हाट्सएप? कोई UTF-16 वर्ण, ...
हेन्नेस

पुष्टि करने के लिए मैं कौन से अन्य परीक्षण कर सकता हूं वे बिल्कुल समान हैं?
विलियमके

लगता है कि आपने सीखा कि ओएस ओएस की एक महत्वपूर्ण जाँच के आसपास अंत कैसे किया जाता है।
फियास्को लैब्स

जवाबों:


8

एक दोस्त ने मुझे इसे नीचे ट्रैक करने में मदद की और पाया कि यह बग के रूप में बगज़िला 38572 में लिनक्स कर्नेल के रूप में दर्ज है । बग को कर्नेल के संस्करण 3.0.0 में निश्चित रूप से तय किया गया है, लेकिन कम से कम संस्करण 2.6.38 में मौजूद है।

मुद्दा यह है कि सर्वर का ReadDIR () RPC कॉल गलत परिणाम देता है। यह निम्न के कारण होता है:

जब क्लाइंट एक निर्देशिका पढ़ता है, तो यह अधिकतम बफर आकार निर्दिष्ट करता है और कुकी को शून्य करता है। यदि निर्देशिका बहुत बड़ी है, तो उत्तर इंगित करता है कि उत्तर केवल आंशिक है और कुकी को अपडेट करता है। फिर ग्राहक डेटा के अगले हिस्से को प्राप्त करने के लिए अद्यतन कुकी के साथ आरपीसी को फिर से निष्पादित कर सकता है। (डेटा फ़ाइल हैंडल और नामों का सेट है। ReadDirPlus () के मामले में, वहाँ भी स्टेट / इनोड / vnode डेटा है।) प्रलेखन यह इंगित नहीं करता है कि यह ReadDirPlus () के साथ एक बग है, लेकिन यह संभवतः है। भी।

वास्तविक समस्या यह है कि प्रत्येक चंक (नाम, हैंडल टपल) में अंतिम फ़ाइल कभी-कभी अगले चंक में पहली फ़ाइल के रूप में दी जाती है।

अंतर्निहित फाइल सिस्टम के साथ एक बुरी बातचीत है। एक्सटी 4 इसे प्रदर्शित करता है, एक्सएफएस नहीं करता है।

यही कारण है कि समस्या कुछ स्थितियों में दिखाई देती है लेकिन दूसरों में नहीं और शायद ही कभी छोटी निर्देशिकाओं में होती है। जैसा कि प्रश्न विवरण में देखा गया है, फाइलें समान कोड दिखाती हैं और नाम समान हैं (दूषित नहीं हैं)। चूंकि लिनक्स कर्नेल अंतर्निहित ऑपरेशन जैसे कि ओपन (), आदि के लिए vnode संचालन को कॉल करता है, फ़ाइल सिस्टम के अंतर्निहित रूटीन क्या होते हैं, यह तय करते हैं। इस स्थिति में, NFS3 क्लाइंट केवल vnode कार्रवाई का RPC में अनुवाद करता है यदि आवश्यक जानकारी उसके विशेषता कैश में नहीं है। इससे क्लाइंट को विश्वास है कि सर्वर ऐसा नहीं कर सकता।


यह मेरे साथ भी हो रहा है, कर्नेल के साथ 3.18.17-13.el6.x86_64 (CentOS 6)। मुझे पूरा यकीन है कि यह QNAP TS-212 NAS के अंतर्निहित एनएफएस सिस्टम का एक बग है, जिस पर निर्देशिका को आरोहित किया जा सकता है। किसी ने पुष्टि की?
Godzillante

6

डिस्क एक एनएफएस माउंटेड डिस्क है। जब मैं ड्राइव को प्रकाशित करने वाले होस्ट कंप्यूटर पर जाता हूं, तो फ़ाइल केवल एक बार सूचीबद्ध होती है।

संभवतः NFS के साथ बग, समस्या या दौड़ की स्थिति।

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

डुप्लिकेट फ़ाइल के नाम कुछ हैं जो fsckसंभवतः पकड़ लेंगे और ठीक करने की कोशिश करेंगे।

सुनिश्चित करें कि किसी भी फाइल में अलग-अलग अनुगामी स्थान नहीं हैं।


मैं यह सुझाव देने जा रहा था कि फाइलसिस्टम पर लिखने की मात्रा ने अंततः कुछ तोड़ दिया और दो समान फ़ाइलों के अस्तित्व की अनुमति दी।
डॉकटोरो रीचर्ड

रनिंग को fsckकोई समस्या नहीं मिली। होस्ट और क्लाइंट मशीन दोनों को रिबूट किया गया, इश्यू अभी भी दिखाता है।
विलियमके सिप 3'13

मुझे अधिक स्पष्ट होना चाहिए था - fsckशायद केवल स्थानीय फ़ाइल सिस्टम पर काम करने जा रहा है, न कि एक एनएफएस घुड़सवार। आपको संभवतः अपने nfs संकुल को अपग्रेड / पैच करना होगा और संभवतः आपका कर्नेल। जैसा कि @somequixotic उल्लेख है, आपका CentOS पुराना है और आपके पास जो समस्याएँ हैं वे भविष्य के अपडेट में हल हो सकती हैं।
लॉरेंस सी।

4

एक मौका है कि आपके पास किसी एक फ़ाइलनाम में एक छिपा हुआ गैर-मुद्रण योग्य चरित्र या व्हाट्सएप है। आप उदाहरण के लिए -bविकल्प प्रदान करके देख सकते हैं ls:

user@server:~/test$ ls -lab
total 8
drwxr-xr-x 2 user user 4096 Sep  3 12:20 .
drwx------ 8 user user 4096 Sep  3 12:20 ..
-rw-r--r-- 1 user user    0 Sep  3 12:19 hello
-rw-r--r-- 1 user user    0 Sep  3 12:19 hello\

\उस फ़ाइल नाम के अंत में स्थान को सूचित करने पर ध्यान दें ।

   -b, --escape
          print C-style escapes for nongraphic characters

एक विकल्प के रूप में (हालांकि ऊपर काम करना चाहिए), आप इस पर्ल स्क्रिप्ट के माध्यम से आउटपुट को कुछ भी बदलने के लिए पाइप कर सकते हैं जो कि अपने हेक्स कोड के साथ एक मुद्रण योग्य ASCII वर्ण नहीं है। उदाहरण के लिए, एक स्थान बन जाता है \x20

while (<>) {
    chomp();
    while (/(.)/g) {
        $c = $1;
        if ($c=~/[!-~]/) {
            print("$c");
        } else {
            printf("\\x%.2x", ord($c));
        }
    }
    print("\n");
}

उपयोग:

ls -la | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.