net/disk_cache/sql: Add feature parameters for SQLite configuration

This CL adds two new feature parameters to kDiskCacheBackendExperiment
to allow fine-tuning the SQLite database configuration for the SQL-based
disk cache:

1. SqlDiskCacheReleaseMemoryAfterWrites: Controls whether SQLite
   aggressively releases cached memory after writes. This uses the
   release_memory_after_writes option in sql::DatabaseOptions.
2. SqlDiskCacheCacheSize: Allows overriding the SQLite cache size.

These parameters are passed to sql::DatabaseOptions in the
SqlPersistentStore::Backend constructor.

Bug: 443174708
Change-Id: Ie3ca7ce9e0434d8f0b7988bffaa8fd5c2f080b93
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7604294
Reviewed-by: Greg Thompson <grt@chromium.org>
Commit-Queue: Tsuyoshi Horo <horo@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1590508}
NOKEYCHECK=True
GitOrigin-RevId: f8128f49d5c6b35e03212cd4f6c8d9eeeb016d7d
diff --git a/base/features.cc b/base/features.cc
index 02e2bf9..7e2fe7d 100644
--- a/base/features.cc
+++ b/base/features.cc
@@ -505,6 +505,16 @@
                    &kDiskCacheBackendExperiment,
                    "SqlDiskCacheSizeAndPriorityAwareEviction",
                    true);
+BASE_FEATURE_PARAM(bool,
+                   kSqlDiskCacheReleaseMemoryAfterWrites,
+                   &kDiskCacheBackendExperiment,
+                   "SqlDiskCacheReleaseMemoryAfterWrites",
+                   true);
+BASE_FEATURE_PARAM(int,
+                   kSqlDiskCacheCacheSize,
+                   &kDiskCacheBackendExperiment,
+                   "SqlDiskCacheCacheSize",
+                   0);
 #endif  // ENABLE_DISK_CACHE_SQL_BACKEND
 
 BASE_FEATURE(kIgnoreHSTSForLocalhost, base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/base/features.h b/base/features.h
index f61240d..9399adb 100644
--- a/base/features.h
+++ b/base/features.h
@@ -566,6 +566,12 @@
 NET_EXPORT BASE_DECLARE_FEATURE_PARAM(
     bool,
     kSqlDiskCacheSizeAndPriorityAwareEviction);
+// Whether to aggressively release SQLite's cached memory after writes.
+NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool,
+                                      kSqlDiskCacheReleaseMemoryAfterWrites);
+// The size of in-memory cache of SQLite database. 0 invokes SQLite's default.
+// See https://sqlite.org/pragma.html#pragma_cache_size for more details.
+NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kSqlDiskCacheCacheSize);
 #endif  // ENABLE_DISK_CACHE_SQL_BACKEND
 
 // If enabled, ignore Strict-Transport-Security for [*.]localhost hosts.
diff --git a/disk_cache/sql/sql_persistent_store_backend.cc b/disk_cache/sql/sql_persistent_store_backend.cc
index defd9d2..b30bedb 100644
--- a/disk_cache/sql/sql_persistent_store_backend.cc
+++ b/disk_cache/sql/sql_persistent_store_backend.cc
@@ -301,7 +301,10 @@
                   // This callback is only called while the `db_` instance
                   // is alive, and never during destructor, so it's safe
                   // to use base::Unretained.
-                  base::Unretained(this))),
+                  base::Unretained(this)))
+              .set_release_memory_after_writes(
+                  net::features::kSqlDiskCacheReleaseMemoryAfterWrites.Get())
+              .set_cache_size(net::features::kSqlDiskCacheCacheSize.Get()),
           // Tag for metrics collection.
           sql::Database::Tag("HttpCacheDiskCache")) {
 }