- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在关注关于EXT4上“错误”的讨论,如果使用“创建临时文件,写入临时文件,将临时文件重命名为目标文件”过程,该文件将导致崩溃时文件归零。 POSIX说除非调用fsync(),否则不能确保数据已刷新到硬盘。
显然在做:
0) get the file contents (read it or make it somehow)
1) open original file and truncate it
2) write new contents
3) close file
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) close temp file
4) rename temp file to original file
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) fsync()
4) close temp file
5) rename temp file to original file
最佳答案
简短的答案是:在应用程序层中解决此问题是错误的。 EXT4必须确保在关闭文件后,应及时写入数据。现在,EXT4“优化”了此编写,以能够收集更多的写请求并将它们一次性爆发。
问题很明显:无论您做什么,都无法确保数据在磁盘上结束。手动调用fdisk()只会使情况变得更糟:您基本上会妨碍EXT4的优化,从而降低了整个系统的速度。
OTOH,EXT4具有所有必要的信息,可以在需要将数据写到磁盘时进行有根据的猜测。在这种情况下,我将临时文件重命名为现有文件的名称。对于EXT4,这意味着它必须推迟重命名(以便崩溃后原始文件的数据保持不变)或必须立即刷新。由于它不能推迟重命名(下一个过程可能要查看新数据),因此隐式重命名意味着刷新,并且刷新必须在FS层而不是应用程序层上进行。
EXT4可能会创建文件系统的虚拟副本,其中包含尚未更改磁盘的更改(尚未)。但这并不影响最终目标:应用程序无法确定FS会进行哪些优化,因此FS必须确保其能够正常工作。
在这种情况下,无情的优化已经走得太远,破坏了结果。黄金法则:优化绝不能改变最终结果。如果您无法保持这一点,那么就不能进行优化。
只要Tso认为拥有一个快速的FS而不是运行正常的FS更重要,我建议不要升级到EXT4并关闭所有关于此错误的报告是“Tso设计的”。
[编辑]对此有更多的想法。您可以使用数据库而不是文件。让我们暂时忽略资源浪费。谁能保证数据库使用的文件不会因崩溃而损坏?大概。数据库可以写数据并每分钟左右调用fsync()。但是然后,您可以执行以下操作:
while True; do sync ; sleep 60 ; done
关于filesystems - 安全有效的方式来修改POSIX系统上的多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/665898/
有没有办法确定我是否可以使用标准 (在所有支持 C++17 的现代 C++ 编译器上可用)或 由较旧的编译器使用。 (例如 g++ 6.3,这是 Debian Stretch 上的当前标准版本) 知
因此,boost::filesystem 允许您在文件所有者拥有的权限、组拥有的权限以及所有用户拥有的权限的意义上访问文件的权限。这很好,但我不想开始检查我是谁,我的组是什么等等——我只想检查我是否可
我不小心使用 rm -rf 删除了错误的文件夹,我尝试过的每个工具都告诉我我没有硬盘或找不到文件系统。 当我输入 df 时,我得到: 已使用的文件系统大小 Avail Use% Mounted on
我是 Java 的新手,正在尝试学习 IO 的概念。我遇到过两个非常相似的 Java 类,FileSystem 和 FileSystems。它们之间有什么区别?什么时候使用一个而不是另一个? 最佳答案
我查了很多关于c++17下文件系统链接的问题,还是无法链接成功。我的main.cpp文件如下。 #include int main(int argc, char** argv) { std:
Boost 库有一个类来处理文件路径:boost::filesystem::path。Boos 也有这个类 boost::filesystem::wpath 每个类都有方法string(), wstr
我正在编写一个利用 std::filesystem 的库(仅供学习)。它在 MSVC 上运行良好,但是默认情况下,Linux 的 LTS 版本就像 Ubuntu 一样附带 GCC 6.x,官方存储库中
请查找随附的代码片段。我正在使用此代码将文件从 hdfs 下载到我的本地文件系统 - Configuration conf = new Configuration(); FileSys
这段代码中std::filesystem::copy()和std::filesystem::copy_file()有什么区别? #include void testing() { const
以下代码旨在去除路径的第一部分,以防它存在: #include std::filesystem::path strip_prefix(std::filesystem::path p) {
在以下两种情况下,是否有理由调用lexically_normal: std::filesystem::path filepath = someFuntionThatGetsAPath(); filep
函数 boost::filesystem::canonical() ( doc of 1.66 , doc of current release ) 提供两个参数(忽略错误代码重载)base。第一个是
boost::filesystem::path使用 &转义路径字符串中的引号,see demo : std::cout 标题。 最佳答案 Boost::Filesystem 相当古老,早于 C++14
考虑以下关于路径分解的断言,其中每个局部变量,例如stem 具有明显的初始化,例如auto stem = path.stem() — assert(root_path == root_name / r
给定以下代码: fs::path p{ "a/b/" }; fs::path q{ "a/b/." }; assert(p == q); [注意定义 q 的字符串末尾的额
由于 C++17 std::filesystem 与 boost::filesystem 非常相似,所以我尝试做与这个问题相同的事情: Escaping some Directories in ite
我找到了这个页面,描述了 c++14 和 c++17 之间的变化: https://isocpp.org/files/papers/p0636r0.html ... 它链接到此页面,该页面描述了建议的
我有一些代码,当我编译它时,出现以下错误,我不知道如何解决。我尝试添加 -L/usr/lib/x86_64-linux-gnu、-lboost_system 和 -lboost_filesystem,
尝试使用 Asset.loadAsync 将 .txt Assets 作为字符串加载到 Expo 中 Asset.loadAsync(module) 解析并提供一个 localUri 但是,FileS
我在 中编码C++ 在 Visual Studio (Windows 10)并收到此错误: #error The header providing std::experimental::filesy
我是一名优秀的程序员,十分优秀!