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

設定ファイルの保存をアトミック操作に変更 #2098

Merged
merged 1 commit into from
May 27, 2024

Conversation

RikitoNoto
Copy link
Contributor

@RikitoNoto RikitoNoto commented May 25, 2024

内容

設定ファイルの書き込み失敗時にファイルが消失しないようにしました。
設定ファイル保存は以下の手順で行うようにしています。

  1. <設定ファイル名>.tmpに設定の書き込み
  2. 1で作成したファイル名を<設定ファイル名>に書き換え
    2のタイミングで既存ファイルが存在する場合は上書きするようにしています。

テストは関連しそうなものが見つかりませんでしたので、追加していません。
手動テストとしては、以下の手順を実行しています。

  • 設定変更を行い(メモ機能のON)、config.jsonに反映されていること
  • ElectronConfigManager.savemoveFileの直前に強制終了し、再起動後設定が消失していないこと

Issueの中に記載のあった、以下の記述に関しては現状ElectronConfigManager.saveでしか使用しない処理なのでhelper関数には移動していません。

直接ファイルを書き込んでいるところはいくつかあるので、一度同じディレクトリの.tmpに書き込んだ後moveFileする便利関数を作って使いますと便利そう。

関連 Issue

ref #2082
close #2082

@RikitoNoto RikitoNoto changed the title #2082 設定ファイルの保存をアトミック操作に変更 設定ファイルの保存をアトミック操作に変更 May 25, 2024
@RikitoNoto RikitoNoto marked this pull request as ready for review May 26, 2024 03:42
@RikitoNoto RikitoNoto requested a review from a team as a code owner May 26, 2024 03:42
@RikitoNoto RikitoNoto requested review from Hiroshiba and removed request for a team May 26, 2024 03:42
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!

丁寧な進行ありがとうございます!!

Issueの中に記載のあった、以下の記述に関しては現状ElectronConfigManager.saveでしか使用しない処理なのでhelper関数には移動していません。

こちらhelper関数化して他のところに適応していきたいですね!

例えばソフトウェアのランタイム情報を書き出すRuntimeInfoManager.tsあたりとか、

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

プロジェクトファイルや音声ファイルの保存に使われているWRITE_FILE辺りとか・・・!

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化してみます!!

@Hiroshiba Hiroshiba merged commit 279ab2c into VOICEVOX:main May 27, 2024
9 checks passed
@RikitoNoto RikitoNoto deleted the feature/2082_save_file_atomic branch May 27, 2024 09:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

設定ファイルの保存をアトミック操作にする
2 participants