
توسعهدهندگان KDE پس از سالها پیگیری، باگ قدیمی و آزاردهندهای را رفع کردهاند که باعث میشد اعلانهای تکمیل کپی فایل روی درایو USB دقیق نباشد. این باگ نخستین بار در سال ۲۰۱۱ گزارش شده بود و قرار است با انتشار KDE Frameworks 6.32 در ماه آینده برطرف شود.
مشکل چه بود؟
در نسخههای فعلی میزکار KDE Plasma، هنگام کپی فایل به حافظه فلش USB، نوار پیشرفت و اعلان تکمیل فقط نشان میدادند که داده به حافظه پنهان (Cache) محلی منتقل شده است، نه اینکه واقعاً روی حافظه خارجی نوشته شده باشد. در نتیجه کاربر ممکن بود تصور کند فایلها کاملاً کپی شدهاند، در حالی که هنوز نوشتن نهایی روی درایو USB انجام نشده بود.
این گزارش با بیش از ۷۷ комментарий و بیش از ۱۷ گزارش تکراری همراه شد و حتی در نسخههای پایدار کنونی KDE Plasma نیز اعلانها از دقت کامل برخوردار نبودند.
راهحل فنی پس از ۱۵ سال
مِوِن کار (Méven Car)، توسعهدهنده KDE، در نوشتاری وبلاگی جزئیات این مسیر طولانی را شرح داده است. دو روز پس از ثبت گزارش، کریستوف فک (Christoph Feck) پرسید آیا راهی برای فهمیدن زمان واقعی نوشتهشدن داده روی دیسک وجود دارد، بدون آنکه فراخوانیهای همگامسازی (Sync) باعث کندی شدید شوند. دو هفته بعد، پاسخ آلن استرن (Alan Stern) با معرفی sync_file_range() به گزارشدهنده منتقل شد و کریستوف آن را «دقیقاً همان چیزی» دانست که نیاز داشتند. این همان فراخوانی سیستمی (System Call) است که اکنون KIO از آن استفاده میکند.
با این حال، حل کامل ماجرا ساده نبود. سالها اتفاق چندانی نیفتاد، جز تأیید کاربران و ثبت گزارشهای تکراری. در سال ۲۰۲۱، نیت گراهام (Nate Graham) اولویت این باگ را به بالاترین سطح رساند، زیرا در عملیات جابهجایی (Move)، فایلهای مبدأ حذف میشوند در حالی که نسخهها هنوز در حافظه قرار دارند. در سال ۲۰۲۲ نیز اپلت Disks & Devices تغییر کرد تا هنگام خارجکردن دستگاه توضیح دهد که هنوز نوشتن داده در جریان است.
تلاشهای نیمهتمام و نقشه نهایی
در سال ۲۰۲۴، کریستوف فراخوانی cachestat() در هسته لینوکس (Linux Kernel) 6.5 را آزمایش کرد؛ این فراخوانی میزان دادهای را که هنوز در حافظه اصلاحنشده (Dirty) باقی مانده گزارش میدهد، اما فقط برای یک فایل در هر زمان. مِوِن کار میگوید این باگ برای او مانند «نهنگ سفید» بوده است؛ او از سال ۲۰۱۸ در KIO مشارکت دارد و هنوز در حال یادگیری رفتار لایه ذخیرهسازی لینوکس است. او دو بار در سال ۲۰۲۴ تلاش کرد sync_file_range() را درست پیادهسازی کند، اما موفق نشد. در درخواست ادغام (Merge Request) شماره ۱۷۱۸ مسیر sync_file_range() همچنان غیرفعال ماند. در KIO MR 1764 و Dolphin MR 862 نیز کارگر (Worker) منتظر نوشتن معوق (Writeback) همان قطعهای بود که تازه نوشته شده بود و هنوز آغاز نشده بود؛ بنابراین عملاً هیچ انتظاری رخ نمیداد. راهحل درست، انتظار برای پنجره پیش از قطعه تازهنوشتهشده است.
در نهایت، با انتشار KDE Frameworks 6.32، پنجره تکمیل کپی فایل با استفاده از sync_file_range() بهدرستی نشان میدهد که دادهها چه زمانی واقعاً روی حافظه USB نوشته شدهاند. جزئیات کامل فنی این ماجرا در وبلاگ KDE.org منتشر شده است.