IndexedDB Connection Recovery After Network Process Crash
Source/WebCore/Modules/indexeddb/IDBFactory.cpp
Source/WebKit/WebProcess/WebProcess.cpp
WebKit의 IndexedDB는 WebContent process와 Network process에 걸쳐 동작합니다. WebContent process는 IDBConnectionProxy를 보유하는데, 이는 Network process의 IDB 구현에 접근하기 위한 handle입니다. 이 handle은 Page, Document, WorkerGlobalScope, IDBFactory 등 여러 계층에 캐시됩니다. Network process가 crash하면 이 캐시된 proxy들은 dangling handle 상태가 됩니다. 기존에는 이를 해소하려면 페이지를 새로고침해야 했습니다.
이 commit은 "clear and lazily recreate" 신호를 전체 object graph에 걸쳐 전달합니다. Network process crash 시 각 Document의 캐시된 proxy가 null로 초기화됩니다. 이후 indexedDB.open()이 호출되면 IDBFactory::ensureConnectionProxy()가 stale proxy를 감지합니다. 감지 방식은 m_connectionProxy의 raw pointer와 Document의 현재 proxy를 비교하는 것으로, 불일치 시 새 proxy로 교체합니다. Worker proxy 갱신은 불필요한 process 생성을 방지하기 위해, 다른 이유로 Network process가 재시작될 때까지 지연됩니다.
NetworkProcess crash
│
├──► Page::clearIDBConnectionOnAllDocuments()
│ └──► Document::clearIDBConnectionProxy() ← nulls m_idbConnectionProxy
└──► WebProcess::m_needsIDBConnectionRefreshForWorkers = true
Next indexedDB.open() (document)
└──► IDBFactory::ensureConnectionProxy() ← lazily recreates from new Page connection
Network process relaunches (any reason)
└──► drains m_needsIDBConnectionRefreshForWorkers
└──► WorkerGlobalScope::replaceIDBConnectionProxyOnAllWorkers()
Significance
Network process crash 이후 IndexedDB 사용을 위해 페이지를 새로고침해야 했던 요구사항이 제거되었습니다. 이로써 web app의 복원력이 향상됩니다. 이 변경은 Page, Document, Worker, IDBFactory 등 모든 캐싱 계층에서 proxy lifecycle을 다루고 있으며, 각 계층에서 올바른 순서와 lifetime 관리가 요구됩니다.