IDB: SQLite - implement a fast path for cursor advance The IndexedDB spec specifies cursor position as the key of the previously returned record and not as an index because the list of records in the range of the cursor can change during the lifetime of the cursor (through interleaved write operations). To account for this, the SQLite cursor implementation reset and re-executed the cursor query every time Continue() or Advance() was called. Continue(), when called with a target key, needs the query to be reset, but in the other cases, including Advance(), the cursor can get away with Step()ing the query if it knows that no record changed in the range since the query was last executed. This CL adds hooks to invalidate the long-lived cursor statements at appropriate points and updates the cursor to step the statement if it was not invalidated. The points are: 1. Object store put 2. Object store delete (range) 3. Clear object store 4. Prefetch reset 5. Reaching the end of the range (if this happens during a prefetch, a subsequent call to Advance() can be made by the renderer, which should return false). Though the prefetch cache maintained by blink is also invalidated in the above cases (and more; see crbug.com/442489276 ), it calls up to the browser side via `PrefetchReset()` only if there were prefetched records, which is not always the case. Hence, we need our own invalidation at the DatabaseConnection level. With this change, the abstraction provided by RecordIterator does not seem to add much value. Hence, it has been refactored away and the implementations in DatabaseConnection derive directly from BackingStoreCursorImpl. This CL results in a 17% improvement in the mail-client-read blink perf test (reduced from 81 ms to 67 ms). The getAll() operations get a bigger performance boost of ~50%, but on an already small baseline (IDBObjectStore::getAll reduced from 4.8 ms to 2.9 ms, for instance). Bug: 436880910 Change-Id: Iafb6a92071e73a21ffb2505bda813756b455bec1 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6905862 Reviewed-by: Evan Stade <evanstade@microsoft.com> Commit-Queue: Abhishek Shanthkumar <abhishek.shanthkumar@microsoft.com> Cr-Commit-Position: refs/heads/main@{#1512977}
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.
The project's web site is https://www.chromium.org.
To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.
Documentation in the source is rooted in docs/README.md.
Learn how to Get Around the Chromium Source Code Directory Structure.
For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.
If you found a bug, please file it at https://crbug.com/new.