خداحافظی با یک باگ ۱۵ ساله در لینوکس؛ حل مشکل کپی فایل روی فلش مموری

تا حالا برات پیش اومده که وقتی داری یه فایل حجیم رو توی لینوکس روی فلش مموری یا همون USB Drive کپی میکنی، سیستم زودتر از موقع بهت پیام بده «کپی تموم شد!»، اما چراغ فلش هنوز مثل دستگاه جوشکاری داره چشمک میزنه؟ همون لحظه فلش رو میکشی بیرون و متوجه میشی فایلت نصفهنیمه کپی شده یا کلاً خراب شده؟ خب، بالاخره قراره بعد از ۱۵ سال این دردسر بزرگ توی دنیای KDE حل بشه!
ماجرا از این قراره که این مشکل قدیمی و اعصابخردکن، بالاخره توی نسخه جدید KDE Frameworks 6.32 که ماه آینده منتشر میشه، بهطور کامل رفع میشه. این باگ تاریخی که از سال ۲۰۱۱ توی سیستم ثبت شده بود، باعث میشد دسکتاپ KDE وقتی فایلی رو کپی میکنید، فقط نوشتن اطلاعات توی حافظه موقت (Cache) سیستم رو مبنا قرار بده و خیالش راحت بشه؛ در حالی که دادهها هنوز عملاً روی خود سختافزار فلش مموری نوشته نشده بودن.
Méven Car، یکی از توسعهدهندگان خوشذوق KDE، تازه یه پست بلاگ جالب درباره این باگ ۱۵ ساله نوشته که توی این مدت کلی کامنت و گزارش تکراری به خودش دیده بود. حتی توی نسخههای پایدار و فعلی KDE Plasma هم هنوز این مشکل گزارش وضعیت کپی وجود داره.
پیدا کردن یه راهحل دقیق برای اینکه سیستم بفهمه کی کپی کردن روی USB Storage واقعاً تموم شده، اصلاً کار سادهای نبود و یه مسیر طولانی و پرپیچوخم رو برای تیم KDE رقم زد:
“ابزار درست خیلی زود پیدا شد. دو روز بعد از ثبت گزارش، Christoph Feck پرسید آیا راهی هست که بفهمیم دادهها واقعاً روی Disk نشستهاند یا نه، اونم بدون اینکه افت سرعت شدیدی ایجاد کنیم. دو هفته بعد، گزارشگر پاسخ Alan Stern یعنی تابع sync_file_range() رو پیشنهاد داد و Christoph گفت این دقیقاً همون چیزیه که نیاز داریم. این ماجرا برمیگرده به سپتامبر ۲۰۱۱ و حالا همون تابعی است که KIO ازش استفاده میکنه.
بعد از اون سالها اتفاق خاصی نیافتاد، فقط کاربرا این مشکل رو تایید میکردن. سال ۲۰۲۱، Nate Graham این باگ رو گذاشت توی بالاترین اولویت، چون وقتی فایلها رو Move میکردید، فایلهای اصلی پاک میشدن در حالی که کپیها هنوز توی مموری سرگردون بودن. سال ۲۰۲۲ او اپلت Disks & Devices رو عوض کرد تا وقتی دستگاه رو Eject میکنید حداقل بگه که داره اطلاعات رو مینویسه. سال ۲۰۲۴ هم Christoph حافظه موقت رو با تابع cachestat() توزیع لینوکس نسخه 6.5 تست کرد.
این باگ برای من حکم نهنگ سفید رو داشت! من از سال ۲۰۱۸ دارم روی KIO کار میکنم و هنوز دارم یاد میگیرم استک ذخیرهسازی لینوکس چطور کار میکنه. سال ۲۰۲۴ دو بار تلاش کردم اما نتونستم sync_file_range() رو درست پیادهسازی کنم. کدهایی نوشتم که درست کار نکردن چون منتظر چانکی میموندن که هنوز نوشته نشده بود. متأسفانه نه خودم متوجه شدم و نه هیچکدام از Reviewerها! بعد از اون هم یکی دیگه از توسعهدهندهها پیشنهاد داد کلاً Cache رو برای کپیها خاموش کنیم که اونم رد شد.”
حالا با اومدن KDE Frameworks 6.32، پنجره پیشرفت کپی (Progress Bar) بالاخره به لطف استفاده درست از تابع sync_file_range() راست میگه و دقیقاً همون لحظهای که دادهها روی USB Storage ذخیره میشن، اتمام کار رو اعلام میکنه.
اگر دوست داری بدونی این سفر ۱۵ ساله برای رفع یک باگ چطور پیش رفته، میتونی تمام جزئیات فنی رو توی بلاگ رسمی KDE.org بخونی.



