এনএফএসের সাথে মাউন্ট করা হলে একটি ডিরেক্টরিতে একই নামের দুটি ফাইল থাকতে পারি?


8

আমার কাছে একটি সি ++ অ্যাপ্লিকেশন পরীক্ষা রয়েছে যা একটি এনএফএস মাউন্টড ডিরেক্টরিতে 10,000 টি ফাইল তৈরি করে, তবে অন্য 10,000 ফাইলের সাথে সেই ডিরেক্টরিতে একই নামে দু'বার উপস্থিত হওয়ার কারণে আমার পরীক্ষাটি একবার ব্যর্থ হয়েছিল। ডিরেক্টরিটি এনএফএস মাউন্ট করা লিনাক্স সেন্টোস ভি 4 বা ভি 5 এ দেখা যায় তবে ডিস্কটি যে হোস্ট মেশিনে থাকে সেখানে নয়।

একই ডিরেক্টরিতে একই নামের দুটি ফাইল থাকা কীভাবে সম্ভব?

[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*

মনে হচ্ছে ডিরেক্টরি এন্ট্রিটি কোনওভাবে দূষিত।

আমার অ্যাপ্লিকেশন বৈধভাবে এই পরিস্থিতি তৈরি করতে পারে বা এটি অপারেটিং সিস্টেমের কোনও বাগ? আমার প্রোগ্রামটিতে ফাইলগুলি তৈরি করে এর থেকে রক্ষা করার জন্য আমি কী করতে পারি?

আমি ভাবছি এনএফএস মাউন্টিং সফ্টওয়্যারটিতে কোনও ধরণের বাগ রয়েছে। এছাড়াও 'অমাউন্ট' এবং তারপরে সমস্যা রয়েছে এমন এনএফএস ড্রাইভের 'মাউন্ট' এটি সমাধান করে না, পুনরাবৃত্তির পরে পুনরাবৃত্তি এন্ট্রি থেকে যায়।


আপডেট 1: আমি এখন কয়েক ঘন্টা পরে এই সমস্যাটি দ্বিতীয়বার হিট করেছি এবং সত্যিই আশ্চর্যের বিষয় হ'ল ঠিক একই ফাইলটিতে এটি ঘটেছে testfile03373, যদিও দ্বিগুণ ফাইলগুলির জন্য এটি এখন 213352984 পেয়েছে। আমি আরও যুক্ত করব যে ফাইলটি সেন্টোস 5 মেশিনে তৈরি করা হচ্ছে যেখানে ডিস্কটি হোস্ট করা হচ্ছে, তাই এটি স্থানীয়ভাবে তৈরি করা হচ্ছে এবং স্থানীয়ভাবে সঠিক প্রদর্শিত হচ্ছে, তবে এনএফএস মাউন্ট করা অন্যান্য সমস্ত মেশিন দ্বিগুণ এন্ট্রি দেখছে।


আপডেট 2: আমি একটি সেন্টোস ভি 6 মেশিনে ড্রাইভটি চাপিয়েছি এবং /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ডাবল এন্ট্রি প্রদর্শিত হয়, তবে এটি কেবল এর মধ্যেই ঘটে দুটি ডিরেক্টরি যেখানে এই ডাবল এন্ট্রি দেখা গেছে।


আফাইক, কোনও ফাইল সিস্টেমে একই ডিরেক্টরিতে একই নাম এবং এক্সটেনশান কোএক্সিসিটং সহ দুটি ফাইলের পক্ষে এটি অসম্ভব। ব্যর্থতা রোধ করতে আপনি আপনার প্রোগ্রামে কিছু ব্যতিক্রম প্রক্রিয়া ব্যবহার করতে পারেন, অন্যটি এটি ...
ডক্টোরো রিচার্ড

আপনি কোন ফাইল সিস্টেম ব্যবহার করছেন?
ডোক্টোরো রিচার্ড

তারা কি ঠিক একই রকম? উদাহরণস্বরূপ কোনও শীর্ষস্থানীয় বা পূর্ববর্তী সাদা অংশ নেই? কোনও ইউটিএফ -16 চর নেই, ...
হেনেস

সেগুলি হুবহু তা নিশ্চিত করার জন্য আমি আর কি পরীক্ষা চালাতে পারি?
উইলিয়াম কেএফ

আপনার মতো মনে হচ্ছে কীভাবে একটি অত্যাবশ্যক ওএস স্যানিটি চেকের চারপাশে একটি শেষ রান করতে হয়।
ফায়াসকো ল্যাবগুলি

উত্তর:


8

একটি বন্ধু আমাকে এটি সন্ধান করতে সহায়তা করেছিল এবং এটি লিনাক্স কার্নেলের জন্য বাগজিলা 38572 তে রেকর্ড করা একটি বাগ হিসাবে পাওয়া গেছে । ত্রুটিটি কার্নেলের 3.0.0.0 সংস্করণে ঠিক করা হয়েছে, তবে কমপক্ষে 2.6.38 সংস্করণে উপস্থিত রয়েছে।

সমস্যাটি হ'ল সার্ভারের রিডডিআইআর () আরপিসি কল ভুল ফলাফল দেয়। এটি নিম্নলিখিত কারণে ঘটে:

ক্লায়েন্ট যখন কোনও ডিরেক্টরি পড়ে, তখন এটি সর্বাধিক বাফার আকার নির্দিষ্ট করে এবং একটি কুকিকে জিরো করে। ডিরেক্টরিটি যদি খুব বড় হয় তবে উত্তরটি নির্দেশ করে যে উত্তরটি কেবলমাত্র আংশিক এবং কুকি আপডেট করে। তারপরে ক্লায়েন্টটি আপডেট কুকির সাথে আরপিসি পুনরায় সম্পাদন করতে পারে এবং পরবর্তী খণ্ড তথ্য পেতে পারে। (ডেটা ফাইল হ্যান্ডলগুলি এবং নামের সেট is রিডডিরপ্লাস () এর ক্ষেত্রে স্ট্যাট / ইনোড / ভনোড ডেটাও রয়েছে)) ডকুমেন্টেশনটি ইঙ্গিত দেয় না যে এটি রিডডিরপ্লাস () সহ একটি বাগ ছিল, তবে সম্ভবত এটি সেখানে রয়েছে যেমন.

আসল সমস্যাটি হ'ল প্রতিটি অংশের শেষ ফাইলটি (নাম, হ্যান্ডেল টিপল) মাঝে মাঝে পরবর্তী ফাইলটিতে প্রথম ফাইল হিসাবে ফিরে আসে।

অন্তর্নিহিত ফাইল সিস্টেমগুলির সাথে একটি খারাপ মিথস্ক্রিয়া রয়েছে। এক্সট 4 এটি প্রদর্শন করে, এক্সএফএস দেয় না।

এ কারণেই সমস্যাটি কিছু পরিস্থিতিতে উপস্থিত হয় তবে অন্যদের মধ্যে হয় না এবং ছোট ডিরেক্টরিতে খুব কমই ঘটে। প্রশ্নের বর্ণনায় যেমন দেখা যায়, ফাইলগুলি একই ইনোড নম্বরটি দেখায় এবং নামগুলি অভিন্ন (দূষিত নয়)। যেহেতু লিনাক্স কার্নেল vnode অপারেশনগুলিকে অন্তর্নিহিত ক্রিয়াকলাপ যেমন ওপেন () ইত্যাদির জন্য কল করে তাই ফাইল সিস্টেমের অন্তর্নিহিত রুটিনগুলি কী ঘটে তা স্থির করে। এই ক্ষেত্রে, যদি প্রয়োজনীয় তথ্য তার অ্যাট্রিবিউট ক্যাশে না থাকে তবে এনএফএস 3 ক্লায়েন্ট কেবলমাত্র একটি এনপিসিতে ভিএনড অপারেশনটিকে অনুবাদ করে। এটি বিভ্রান্তির দিকে নিয়ে যায় কারণ ক্লায়েন্ট বিশ্বাস করে যে সার্ভার এটি করতে পারে না।


এটি আমার কাছেও ঘটছে, কার্নেলটি 3.18.17-13.el6.x86_64 (CentOS 6) দিয়ে I কেউ নিশ্চিত?
Godzillante

6

ডিস্কটি একটি এনএফএস মাউন্ট করা ডিস্ক। আমি যখন ড্রাইভটি প্রকাশ করে এমন হোস্ট কম্পিউটারে যাই, তখন ফাইলটি কেবল একবার তালিকাভুক্ত হয়।

সম্ভবত এনএফএসের সাথে একটি বাগ, ইস্যু, বা রেসের শর্ত।

আপনি যদি হেক্স সম্পাদক ব্যবহার করে সরাসরি ফাইল সিস্টেম কাঠামো সম্পাদনা করেন তবে একই নামের দুটি ফাইল থাকা সম্ভব। তবে আমি নিশ্চিত না যে আপনি ফাইলগুলি মুছতে বা খোলার চেষ্টা করলে কী হবে happen ইনোড নম্বর দ্বারা কোন ফাইল অ্যাক্সেস করতে লিনাক্সে কী কী সরঞ্জাম রয়েছে সে সম্পর্কে আমি নিশ্চিত নই (যা সদৃশ করা যায় না) তবে এটি কার্যকর হতে পারে।

সদৃশ ফাইলের নামগুলি এমন কিছু fsckযা সম্ভবত ধরা ও ঠিক করার চেষ্টা করবে।

নিশ্চিত করুন যে কোনও ফাইলেরই যদিও পিছনের স্থানগুলি পৃথক নয়।


আমি পরামর্শ দিতে যাচ্ছিলাম যে ফাইল সিস্টেমে লেখার পরিমাণ শেষ পর্যন্ত কিছু ভেঙে ফেলেছে এবং দুটি অভিন্ন ফাইলের অস্তিত্বের অনুমতি দিয়েছে।
ডক্টোরো রিচার্ড

চলমান fsckকোন সমস্যা খুঁজে পাওয়া যায় নি। হোস্ট এবং ক্লায়েন্ট উভয়ই মেশিন পুনরায় বুট করেছেন, ইস্যুটি এখনও দেখায়।
উইলিয়াম কেএফ

আমার আরও পরিষ্কার হওয়া উচিত ছিল - fsckসম্ভবত কেবলমাত্র স্থানীয় ফাইল সিস্টেমে কাজ করতে চলেছে, কোনও এনএফএস মাউন্ট করা নেই। আপনাকে সম্ভবত আপনার এনএফএস প্যাকেজগুলি এবং সম্ভবত আপনার কার্নেলটি আপগ্রেড / প্যাচ করতে হবে। @ সোমেকুইক্সোটিক যেমন উল্লেখ করেছেন, আপনার সেন্টস পুরানো এবং আপনার যে সমস্যাগুলি হচ্ছে তা ভবিষ্যতের আপডেটগুলিতে সমাধান হয়ে যেতে পারে।
LawrenceC

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

বিকল্প হিসাবে (যদিও উপরের কাজ করা উচিত), আপনি এই পার্ল স্ক্রিপ্টের মাধ্যমে আউটপুটটি হেক্স কোড সহ মুদ্রণযোগ্য এএসসিআইআই অক্ষর নয় এমন কোনও স্থানে প্রতিস্থাপন করতে পারেন। উদাহরণস্বরূপ, একটি স্থান হয়ে যায় \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");}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.