Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ファイル保存全般をアトミック操作にする #2103

Closed
Hiroshiba opened this issue May 27, 2024 · 4 comments · Fixed by #2308
Closed

ファイル保存全般をアトミック操作にする #2103

Hiroshiba opened this issue May 27, 2024 · 4 comments · Fixed by #2308
Labels
初心者歓迎タスク 初心者にも優しい簡単めなタスク 機能向上

Comments

@Hiroshiba
Copy link
Member

Hiroshiba commented May 27, 2024

内容

VOICEVOXでファイル保存する時、大体はファイルに直接書き込む形で実装されています。

ipcMainHandle("WRITE_FILE", (_, { filePath, buffer }) => {
try {
fs.writeFileSync(filePath, new DataView(buffer));
return success(undefined);
} catch (e) {
// throwだと`.code`の情報が消えるのでreturn
const a = e as SystemError;
return failure(a.code, a);
}
});

この操作は割と危なくて、何かしらの原因で途中で書き込みが中断してしまうことがあると、中途半端な値が保存されて設定ファイルが壊れます。
特にプロジェクトファイルは膨大な作業量の賜物なので、慎重に上書きしてあげたいです。

このissueは↑のWRITE_FILEと、あとRuntimeInfoManager.tsにあるwriteFileがアトミック操作になれば完了だと思います。

await fs.promises.writeFile(
this.runtimeInfoPath,
JSON.stringify(runtimeInfoFormatFor3rdParty), // FIXME: zod化する
);

Pros 良くなる点

意図しないデータの削除が発生しにくくなる

Cons 悪くなる点

ないはず

実現方法

同じディレクトリに一時ファイルを書き出し、mvするのが安全だと思います。
アトミック操作にする処理は @RikitoNoto さんが↓で実装してくださいました!

この操作を関数切り出ししていろんなところで使えるようにし、いろんなところで使えば解決かもしれません。

その他

不明な点があれば何でもお聞きください!

@Hiroshiba Hiroshiba added 機能向上 初心者歓迎タスク 初心者にも優しい簡単めなタスク labels May 27, 2024
@tsunekazuomija
Copy link
Contributor

こんにちは!
こちらのタスクに取り組んで見たいのですが、よろしいでしょうか?

また、タスクについて一点質問なのですが、
切り出した関数はsrc/helpersフォルダ下にファイルを作成して保存する
という形で良いでしょうか?

@Hiroshiba
Copy link
Member Author

@tsunekazuomija もちろんです、ぜひぜひ!!

切り出した関数はsrc/helpersフォルダ下にファイルを作成して保存する
という形で良いでしょうか?

とても良いと思います!
今見てみたらすでにfileHelper.tsファイルがあったので、切り出す関数によってはとりあえずここに書いても良いかもですね・・・!
https://github.com/VOICEVOX/voicevox/blob/b0d8c2e8aa843f380c36352fdcc6e6c1b8bfb66f/src/helpers/fileHelper.ts

なにかあればかなり気軽にお聞きいただければ 🙏

@tsunekazuomija
Copy link
Contributor

ありがとうございます!
確かにfileHelper.tsにまとまっていたほうが良さそうです!
その方針で進めてみます!

@Hiroshiba
Copy link
Member Author

ぜひぜひ!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
初心者歓迎タスク 初心者にも優しい簡単めなタスク 機能向上
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants