有一组 Markdown 文档,用户请求、渲染、输出 HTML。
request /a => load /path/a.md => render => HTML => user
request /enoent => load /path/enoent.md => 404 => user
我希望实现一个可以动态更新的功能,
1. buffer => tmpfile
2. mv /path/foo => /history/bar
3. mv tmpfile => /path/foo
如果在 2、3 之间加载 /path/foo,那么可能会导致一个 404 错误。如果我同步而不是异步重命名,能解决这个问题吗?
fs.renameSync('/path/foo', '/history/bar');
fs.renameSync('tmpfile', '/path/foo');
我担心的问题是,如果之前已经有请求异步的读取 /path/foo,然后因为操作系统的调度原因,拖到 2、3 之间执行。这种情况可能发生吗?
1. fs.readFile('/path/foo', cb);
2. fs.renameSync('/path/foo', '/history/bar');
3. OS reads file /path/foo => not found => ENOENT
4. call cb of step 1.
5. fs.renameSync('tmpfile', '/path/foo');
以及,有没有异步更新该文件的方法?我想到的是建立一个 fs layer,当更新操作到达之后,block 所有对该文件的访问,直至更新结束后。但是似乎太复杂了啊…………
request /a => load /path/a.md => render => HTML => user
request /enoent => load /path/enoent.md => 404 => user
我希望实现一个可以动态更新的功能,
1. buffer => tmpfile
2. mv /path/foo => /history/bar
3. mv tmpfile => /path/foo
如果在 2、3 之间加载 /path/foo,那么可能会导致一个 404 错误。如果我同步而不是异步重命名,能解决这个问题吗?
fs.renameSync('/path/foo', '/history/bar');
fs.renameSync('tmpfile', '/path/foo');
我担心的问题是,如果之前已经有请求异步的读取 /path/foo,然后因为操作系统的调度原因,拖到 2、3 之间执行。这种情况可能发生吗?
1. fs.readFile('/path/foo', cb);
2. fs.renameSync('/path/foo', '/history/bar');
3. OS reads file /path/foo => not found => ENOENT
4. call cb of step 1.
5. fs.renameSync('tmpfile', '/path/foo');
以及,有没有异步更新该文件的方法?我想到的是建立一个 fs layer,当更新操作到达之后,block 所有对该文件的访问,直至更新结束后。但是似乎太复杂了啊…………