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}
7 files changed
tree: 5d06e932e44ce0a9c1b55c63384ec0edb94488d7
  1. .gemini/
  2. .github/
  3. agents/
  4. android_webview/
  5. apps/
  6. ash/
  7. base/
  8. build/
  9. build_overrides/
  10. buildtools/
  11. cc/
  12. chrome/
  13. chromecast/
  14. chromeos/
  15. codelabs/
  16. components/
  17. content/
  18. crypto/
  19. dbus/
  20. device/
  21. docs/
  22. extensions/
  23. fuchsia_web/
  24. gin/
  25. google_apis/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. media/
  32. mojo/
  33. net/
  34. pdf/
  35. printing/
  36. remoting/
  37. rlz/
  38. sandbox/
  39. services/
  40. skia/
  41. sql/
  42. storage/
  43. styleguide/
  44. testing/
  45. third_party/
  46. tools/
  47. ui/
  48. url/
  49. webkit/
  50. .clang-format
  51. .clang-tidy
  52. .clangd
  53. .cursorignore
  54. .geminiignore
  55. .git-blame-ignore-revs
  56. .gitallowed
  57. .gitattributes
  58. .gitignore
  59. .gitmodules
  60. .gn
  61. .mailmap
  62. .rustfmt.toml
  63. .vpython3
  64. .yapfignore
  65. ATL_OWNERS
  66. AUTHORS
  67. BUILD.gn
  68. CODE_OF_CONDUCT.md
  69. codereview.settings
  70. CPPLINT.cfg
  71. CRYPTO_OWNERS
  72. DEPS
  73. DIR_METADATA
  74. LICENSE
  75. LICENSE.chromium_os
  76. OWNERS
  77. PRESUBMIT.py
  78. PRESUBMIT_test.py
  79. PRESUBMIT_test_mocks.py
  80. README.md
  81. SECURITY_OWNERS
  82. WATCHLISTS
README.md

Logo Chromium

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.