开发者梅文·卡尔在 KDE 官方博客里把这件事讲清楚了:一个活了 15 年、被他视作 KIO 最大毛病的 bug 修好了,补丁跟着 11 月 13 日发布的 KDE Frameworks 6.32 一起到。问题最早在 2011 年 9 月提交,编号 281270。现象是:往 U 盘拷文件时,进度条和完成提示统计的只是数据冲进本地缓存的速度,而不是真正写进可移动存储的时刻。
报告者当年就发现了破绽——往极限 12Mbit/s 的 USB 1.1 设备里拷东西,通知上写的速度却是 50MB/s 上下。数字对不上,说明它统计的根本不是设备写入。

后果比数字错误严重得多。拿一块写入只有 2.3MB/s 左右的 USB 2.0 盘拷 128MiB 文件,Dolphin 会早一分多钟就宣布搞定;用户若在这个窗口里拔掉 U 盘,数据就没了。根子在 KIO 的文件 worker:它用 write 调用把数据交出去;数据一进页缓存 write 就返回,内核之后再找机会落盘。在本地固态盘上这点延迟根本感觉不到,可换到慢速 U 盘或网络文件系统,进度条会远远跑在真实写入前面。这个洞补得很慢。2011 年 9 月就有人提出想靠 sync_file_range 拿到真实落盘时刻,可实现一次次出岔子。2021 年这个 bug 的优先级被提到最高,2024 年两次尝试仍然没有调对。最后由四个 KIO 合并请求收尾,加入自适应回写窗口,完成对话框才终于说出实情。这个案例的价值不只是一个补丁。它说明“缓存加速”与“如实反馈”之间存在天然张力:操作系统为了让写入看起来更快,把确认提前了;用户以为文件已经在盘里,实际还在内存里排队。修复的思路不是放慢写入,而是让界面知道数据到底走到哪一步。
对普通用户来说,升级到 6.32 之后,最直观的变化是:进度条跑完并且弹出完成提示时,U 盘可以放心拔了。
文章与图片内容转载网络,如有侵权请联系平台删除

发表评论 取消回复