টিএল; ডিআর: লিনাক্স কার্নেল যদি একটি বাফারযুক্ত আই / ও লেখাকে হারিয়ে ফেলে , তবে অ্যাপ্লিকেশনটির কোনও উপায় খুঁজে পাওয়ার কি কোনও উপায় আছে?
আমি জানি fsync()
স্থায়িত্বের জন্য আপনার কাছে ফাইল (এবং এর মূল ডিরেক্টরি) রয়েছে । প্রশ্নটি হ'ল যদি কার্নেল I / O ত্রুটির কারণে লেখার জন্য মুলতুবি থাকা মলিন বাফারগুলি হারায় , অ্যাপ্লিকেশনটি কীভাবে এটি সনাক্ত করতে পারে এবং পুনরুদ্ধার বা গর্ভপাত বন্ধ করতে পারে?
ডাটাবেস অ্যাপ্লিকেশন ইত্যাদির কথা ভাবেন, যেখানে লেখার এবং লেখার স্থায়িত্বের ক্রমটি গুরুত্বপূর্ণ।
হারিয়েছেন? কিভাবে?
লিনাক্স কার্নেলের ব্লক স্তরটি কিছু পরিস্থিতিতে ত্রুটিযুক্ত , ইত্যাদি দ্বারা সফলভাবে জমা দেওয়া বাফার I / O অনুরোধগুলি হারাতে পারে:write()
pwrite()
Buffer I/O error on device dm-0, logical block 12345
lost page write due to I/O error on dm-0
(দেখুন end_buffer_write_sync(...)
এবং end_buffer_async_write(...)
ইনfs/buffer.c
)
নতুন কার্নেলগুলিতে ত্রুটিটির পরিবর্তে "হারিয়ে যাওয়া অ্যাসিঙ্ক পৃষ্ঠা লেখা" থাকবে , যেমন:
Buffer I/O error on dev dm-0, logical block 12345, lost async page write
যেহেতু অ্যাপ্লিকেশনটির write()
ইচ্ছামত ত্রুটি ছাড়াই ইতিমধ্যে ফিরে এসেছে, তাই মনে হয় অ্যাপ্লিকেশনটিতে কোনও ত্রুটি জানানোর কোনও উপায় নেই।
তাদের সনাক্ত করা হচ্ছে?
আমি কার্নেল উত্সগুলির সাথে তেমন পরিচিত নই, তবে আমি মনে করি যে এটি AS_EIO
বাফারের উপর সেট করে যা কোনও অ্যাসিঙ্ক লেখার জন্য লিখিতভাবে ব্যর্থ হয়:
set_bit(AS_EIO, &page->mapping->flags);
set_buffer_write_io_error(bh);
clear_buffer_uptodate(bh);
SetPageError(page);
তবে এটি আমার কাছে স্পষ্ট নয় যে পরে fsync()
বা ফাইলটি ডিস্কে রয়েছে কিনা তা নিশ্চিত করার জন্য অ্যাপ্লিকেশনটি এটি সম্পর্কে জানতে পারে।
এটা দেখে মনে হচ্ছে wait_on_page_writeback_range(...)
এmm/filemap.c
দ্বারা শক্তি do_sync_mapping_range(...)
মধ্যেfs/sync.c
যা ডাকা পালা sys_sync_file_range(...)
। -EIO
এক বা একাধিক বাফার লেখা না পারলে এটি ফিরে আসে ।
যদি, আমি অনুমান হিসাবে, এটি fsync()
ফলাফলের প্রচার করে , তবে যদি অ্যাপ্লিকেশন আতঙ্কিত হয় এবং যদি এটি থেকে কোনও আই / ও ত্রুটি হয় fsync()
এবং যদি পুনরায় আরম্ভ করার সাথে সাথে এর কাজটি পুনরায় কীভাবে করা যায় তবে কী যথেষ্ট সুরক্ষার ব্যবস্থা হওয়া উচিত?
অ্যাপ্লিকেশনটি কোনও ফাইলের কোন বাইট অফসেট হারিয়ে যাওয়া পৃষ্ঠাগুলির সাথে সামঞ্জস্য করে তা জানার সম্ভবত কোনও উপায় নেই তাই এটি কীভাবে জানলে তা সেগুলি আবারও লিখতে পারে তবে fsync()
ফাইলটির শেষ সফল হওয়ার পরে অ্যাপটি যদি তার সমস্ত মুলতুবি কাজ পুনরুদ্ধার করে এবং পুনরায় লেখায় হারানো ফাইলের সাথে সম্পর্কিত কোনও নোংরা কার্নেল বাফারগুলি ফাইলের বিপরীতে লিখেছে, এটি হারিয়ে যাওয়া পৃষ্ঠাগুলিতে কোনও আই / ও ত্রুটিযুক্ত পতাকা সাফ করবে এবং পরবর্তীটি fsync()
সম্পূর্ণ করার অনুমতি দেবে - তাই না?
তখন কি অন্য কোনও, নিরীহ, পরিস্থিতি যেখানে fsync()
ফিরে আসতে পারে -EIO
সেখানে জামিন দেওয়া এবং কাজটি খুব জটিল হওয়া হবে?
কেন?
অবশ্যই এই ধরনের ত্রুটিগুলি হওয়া উচিত নয়। এক্ষেত্রে ত্রুটিটি dm-multipath
চালকের ডিফল্ট এবং সান দ্বারা ব্যবহৃত সংবেদন কোডের মধ্যে একটি দুর্ভাগ্যজনক মিথস্ক্রিয়া থেকে শুরু হয়েছিল পাতলা-বিধানিত স্টোরেজ বরাদ্দ করতে ব্যর্থতার রিপোর্ট করতে। কিন্তু এই মাত্র পরিস্থিতিতে যেখানে তারা নয় পারবেন আমিও, যেমন libvirt দ্বারা, Docker, এবং আরও দ্বারা ব্যবহৃত উদাহরণস্বরূপ পাতলা প্রস্তুত LVM- র থেকে এটা রিপোর্ট দেখা করেছি - ঘটে। ডাটাবেসের মতো সমালোচনামূলক অ্যাপ্লিকেশনটিতে অন্ধভাবে চোখ চালিয়ে যাবার মতো সমস্ত কিছু ঠিকঠাক না হয়ে এ জাতীয় ত্রুটিগুলি মোকাবেলা করার চেষ্টা করা উচিত।
কার্নেল যদি মনে করে যে কার্নেল আতঙ্কের সাথে মারা না গিয়ে লেখাগুলি হারানো ঠিক আছে, অ্যাপ্লিকেশনগুলিকে মোকাবেলার জন্য কোনও উপায় খুঁজে বের করতে হবে।
ব্যবহারিক প্রভাবটি হ'ল আমি এমন একটি মামলা পেয়েছি যেখানে সান দিয়ে একটি মাল্টিপথ সমস্যা হ'ল লেখাগুলি হারিয়েছে যে ডাটাবেস দুর্নীতি ঘটাচ্ছে কারণ ডিবিএমএস জানত না যে তার লেখাগুলি ব্যর্থ হয়েছে। মজা না.