Skip to content

Commit

Permalink
Add investigation notes for browser storage
Browse files Browse the repository at this point in the history
This collects my notes from investigating the state of browser storage as part
of element-hq/element-web#9109.
  • Loading branch information
jryans committed Mar 20, 2019
1 parent d5c6dcf commit 13dcb8f
Showing 1 changed file with 82 additions and 0 deletions.
82 changes: 82 additions & 0 deletions docs/storage-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Browser Storage Notes

## Overview

Browsers examined: Firefox 67, Chrome 75

The examination below applies to the default, non-persistent storage policy.

## Quota Measurement

Browsers appear to enforce and measure the quota in terms of space on disk, not
data stored, so you may be able to store more data than the simple sum of all
input data depending on how compressible your data is.

## Quota Limit

Specs and documentation suggest we should consistently receive
`QuotaExceededError` when we're near space limits, but the reality is a bit
blurrier.

When we are low on disk space overall or near the group limit / origin quota:

* Chrome
* Log database may fail to start with AbortError
* Can we use something in memory instead?
* IndexedDB fails to start for crypto: AbortError in connect from
indexeddb-store-worker
* When near the quota, QuotaExceededError is used more consistently
* Firefox
* The first error will be QuotaExceededError
* Future write attempts will fail with various errors when space is low,
including nonsense like "InvalidStateError: A mutation operation was
attempted on a database that did not allow mutations."
* Once you start getting errors, the DB is effectively wedged in read-only
mode
* Can revive access if you reopen the DB

## Cache Eviction

While the Storage Standard says all storage for an origin group should be
limited by a single quota, in practice, browsers appear to handle `localStorage`
separately from the others, so it has a separate quota limit and isn't evicted
when low on space.

* Chrome, Firefox
* IndexedDB for origin deleted
* Local Storage remains in place

## Persistent Storage

Storage Standard offers a `navigator.storage.persist` API that can be used to
request persistent storage that won't be deleted by the browser because of low
space.

* Chrome
* Chrome 75 seems to grant this without any prompt based on [interaction
criteria](https://developers.google.com/web/updates/2016/06/persistent-storage)
* Firefox
* Firefox 67 shows a prompt to grant
* Reverting persistent seems to require revoking permission _and_ clearing
site data

## Storage Estimation

Storage Standard offers a `navigator.storage.estimate` API to get some clue of
how much space remains.

* Chrome, Firefox
* Can run this at any time to request an estimate of space remaining
* Firefox
* Returns `0` for `usage` if a site is persisted

## Actions

* Add console logging to record storage state
* Add debug panel in Settings to investigate storage state
* Catch case of IndexedDB being deleted and alert user to sign out
* Consider storage estimation to predict issue coming up
* Consider switching to persistent storage to avoid this issue
* Investigate persistent storage for Electron where we'd like it to default on
* Move user's own Olm keys to localStorage, so that they can recover when
IndexedDB disappears [notes](https://matrix.to/#/!RbKRuLTvHIhArQcvjr:matrix.org/$1553091062267114tiefP:matrix.org?via=matrix.org&via=lant.uk&via=t2l.io)

0 comments on commit 13dcb8f

Please sign in to comment.