| # disk_cache API |
| |
| The disk_cache API provides for caches that can store multiple random-access |
| byte streams of data associated with a key on disk (or in memory). |
| |
| There are two kinds of entries that can be stored: regular and sparse. |
| |
| Regular entries contain up to 3 separate data streams. Usually stream 0 |
| would be used for some kind of primary small metadata (e.g. HTTP headers); |
| stream 1 would contain the main payload (e.g. HTTP body); and stream 2 would |
| optionally contain some auxiliary metadata that's needed only some of the time |
| (e.g. V8 compilation cache). There is no requirement that these streams be used |
| in this way, but implementations may expect similar size and usage |
| characteristics. |
| |
| Sparse entries have a stream 0 and a separate sparse stream that's accessed with |
| special methods that have `Sparse` in their names. It's an API misuse to try to |
| access streams 1 or 2 of sparse entries or to call `WriteSparseData` on entries |
| that have contents in those streams. Calling `SparseReadData` or |
| `GetAvailableRange` to check whether entries are sparse is, however, permitted. |
| An added entry becomes a regular entry once index 1 or 2 is written to, or it |
| becomes a sparse entry once the sparse stream is written to. Once that is done, |
| it cannot change type and the access/modification restrictions relevant to the |
| type apply. Type of an entry can always be determined using `SparseReadData` or |
| `GetAvailableRange`. |
| |
| The sparse streams are named as such because they are permitted to have holes in |
| the byte ranges of contents they represent (and implementations may also drop |
| some pieces independently). For example, in the case of a regular entry, |
| starting with an empty entry, and performing `WriteData` on some stream at |
| offset = 1024, length = 1024, then another `WriteData` at offset = 3072, |
| length = 1024, results in the stream having length = 4096, and the areas not |
| written to filled in with zeroes. |
| |
| In contrast, after the same sequence of `WriteSparseData` operations, the entry |
| will actually keep track that [1024, 2048) and [3072, 4096) are valid, and will |
| permit queries with `GetAvailableRange`, and only allow reads of the defined |
| ranges. |
| |
| [`net/disk_cache/disk_cache.h`](/net/disk_cache/disk_cache.h) is the only |
| include you need if you just want to use this API. |
| `disk_cache::CreateCacheBackend()` is the first method you'll need to call. |
| |
| [TOC] |
| |
| ## The implementations |
| |
| ### [disk_cache/blockfile directory](/net/disk_cache/blockfile/) |
| |
| This implementation backs the HTTP cache on Windows and OS X. It tries to pack |
| many small entries caches typically have into "block" files, which can help |
| performance but introduces a lot of complexity and makes recovery from |
| corruption very tricky. |
| |
| ### [disk_cache/memory directory](/net/disk_cache/memory/) |
| |
| This contains the in-memory-only implementation. It's used for incognito |
| mode. |
| |
| ### [disk_cache/simple directory](/net/disk_cache/simple/) |
| |
| This implementation backs the HTTP cache on Android, ChromeOS, and Linux, and |
| is used to implement some features like CacheStorage on all platforms. The |
| design is centered around roughly having a single file per cache entry (more |
| precisely for streams 0 and 1), with a compact and simple in-memory index for |
| membership tests, which makes it very robust against failures, but also highly |
| sensitive to OS file system performance. |