-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
現状
migration.test.ts の実行時に、データベース削除処理がデッドロックに陥り、タイムアウトする問題が頻繁に発生しました。
原因
これは、IndexedDBの deleteDatabase リクエストが発行された際に、まだ対象データベースへのアクティブな接続が残っている場合に発生する onblocked イベントが、アプリケーションコード (src/cache-v1/migration.ts) でハンドリングされていなかったためです。このイベントをハンドルしないと、リクエストは無期限に待機し続け、タイムアウトを引き起こします。これはテスト環境特有の問題ではなく、実際のユーザー環境でも発生しうる潜在的
な不具合です。
提案
データベースの削除を行うすべての非同期処理において、必ず onblocked イベントハンドラを実装することを強く推奨します。これにより、予期せぬデッドロックを防ぎ、アプリケーションの安定性を大幅に向上させることができま
す。
実装イメージ
// src/cache-v1/migration.ts 内の修正案
private async deleteMapDatabase(mapId: string): Promise<void> {
const dbName = `Weiwudi_${mapId}`;
return new Promise((resolve, reject) => {
const request = indexedDB.deleteDatabase(dbName);
request.onsuccess = () => resolve();
request.onerror = (event) => reject(request.error);
// ★★★ タイムアウトを防ぐための必須処理 ★★★
request.onblocked = (event) => {
console.warn(`Deletion of database ${dbName} is blocked.`, event);
// ブロックされても処理を継続させるため、resolve()を呼び出す。
// これにより、アプリケーションのフリーズを防ぐ。
resolve();
};
});
}Metadata
Metadata
Assignees
Labels
No labels