summaryrefslogtreecommitdiffstats
path: root/webkit/browser
diff options
context:
space:
mode:
authordgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-16 19:54:40 +0000
committerdgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-16 19:54:40 +0000
commit7b00db0efffcf0ee9c3b92658de9cccc11fdd430 (patch)
tree9769d391314c5ebaecb025528a0a1ea1a8d0d213 /webkit/browser
parent31ed00d72dcc98b705ae0de6cc3aefcc98c31e12 (diff)
downloadchromium_src-7b00db0efffcf0ee9c3b92658de9cccc11fdd430.zip
chromium_src-7b00db0efffcf0ee9c3b92658de9cccc11fdd430.tar.gz
chromium_src-7b00db0efffcf0ee9c3b92658de9cccc11fdd430.tar.bz2
Only allow leveldb to use the minimum amount of file descriptors.
By default, leveldb will use up to 1000 file descriptors at a time. The per-process limit on CrOS is 1024. This can cause file descriptor exhaustion and, as issue 14137 points out, chrome doesn't handle that situation gracefully. This change will make leveldb only keep 64 files open in its cache. The target size for each file is 2mb, so databases under ~128mb will not be affected. Larger databases that perform many random reads might see a negligible performance decrease. BUG=251385 R=derat@chromium.org, hashimoto@chromium.org, jsbell@chromium.org, marja@chromium.org, mpcomplete@chromium.org, nhiroki@chromium.org, rdevlin.cronin@chromium.org, tzik@chromium.org Review URL: https://codereview.chromium.org/19092006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211829 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/browser')
-rw-r--r--webkit/browser/dom_storage/session_storage_database.cc1
-rw-r--r--webkit/browser/fileapi/sandbox_directory_database.cc5
-rw-r--r--webkit/browser/fileapi/sandbox_origin_database.cc5
-rw-r--r--webkit/browser/fileapi/syncable/local_file_change_tracker.cc5
4 files changed, 13 insertions, 3 deletions
diff --git a/webkit/browser/dom_storage/session_storage_database.cc b/webkit/browser/dom_storage/session_storage_database.cc
index 5a9056a..8352a9c 100644
--- a/webkit/browser/dom_storage/session_storage_database.cc
+++ b/webkit/browser/dom_storage/session_storage_database.cc
@@ -325,6 +325,7 @@ leveldb::Status SessionStorageDatabase::TryToOpen(leveldb::DB** db) {
// The directory exists but a valid leveldb database might not exist inside it
// (e.g., a subset of the needed files might be missing). Handle this
// situation gracefully by creating the database now.
+ options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
#if defined(OS_WIN)
return leveldb::DB::Open(options, WideToUTF8(file_path_.value()), db);
diff --git a/webkit/browser/fileapi/sandbox_directory_database.cc b/webkit/browser/fileapi/sandbox_directory_database.cc
index 19e9c25..24790b1 100644
--- a/webkit/browser/fileapi/sandbox_directory_database.cc
+++ b/webkit/browser/fileapi/sandbox_directory_database.cc
@@ -715,6 +715,7 @@ bool SandboxDirectoryDatabase::Init(RecoveryOption recovery_option) {
FilePathToString(filesystem_data_directory_.Append(
kDirectoryDatabaseName));
leveldb::Options options;
+ options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
leveldb::DB* db;
leveldb::Status status = leveldb::DB::Open(options, path, &db);
@@ -761,7 +762,9 @@ bool SandboxDirectoryDatabase::Init(RecoveryOption recovery_option) {
bool SandboxDirectoryDatabase::RepairDatabase(const std::string& db_path) {
DCHECK(!db_.get());
- if (!leveldb::RepairDB(db_path, leveldb::Options()).ok())
+ leveldb::Options options;
+ options.max_open_files = 0; // Use minimum.
+ if (!leveldb::RepairDB(db_path, options).ok())
return false;
if (!Init(FAIL_ON_CORRUPTION))
return false;
diff --git a/webkit/browser/fileapi/sandbox_origin_database.cc b/webkit/browser/fileapi/sandbox_origin_database.cc
index e1ebc91..4ce8301 100644
--- a/webkit/browser/fileapi/sandbox_origin_database.cc
+++ b/webkit/browser/fileapi/sandbox_origin_database.cc
@@ -76,6 +76,7 @@ bool SandboxOriginDatabase::Init(InitOption init_option,
std::string path = FilePathToString(db_path);
leveldb::Options options;
+ options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
leveldb::DB* db;
leveldb::Status status = leveldb::DB::Open(options, path, &db);
@@ -120,7 +121,9 @@ bool SandboxOriginDatabase::Init(InitOption init_option,
bool SandboxOriginDatabase::RepairDatabase(const std::string& db_path) {
DCHECK(!db_.get());
- if (!leveldb::RepairDB(db_path, leveldb::Options()).ok() ||
+ leveldb::Options options;
+ options.max_open_files = 0; // Use minimum.
+ if (!leveldb::RepairDB(db_path, options).ok() ||
!Init(FAIL_IF_NONEXISTENT, FAIL_ON_CORRUPTION)) {
LOG(WARNING) << "Failed to repair SandboxOriginDatabase.";
return false;
diff --git a/webkit/browser/fileapi/syncable/local_file_change_tracker.cc b/webkit/browser/fileapi/syncable/local_file_change_tracker.cc
index 01d99c0..9e0a725 100644
--- a/webkit/browser/fileapi/syncable/local_file_change_tracker.cc
+++ b/webkit/browser/fileapi/syncable/local_file_change_tracker.cc
@@ -306,6 +306,7 @@ SyncStatusCode LocalFileChangeTracker::TrackerDB::Init(
std::string path = fileapi::FilePathToString(
base_path_.Append(kDatabaseName));
leveldb::Options options;
+ options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
leveldb::DB* db;
leveldb::Status status = leveldb::DB::Open(options, path, &db);
@@ -334,7 +335,9 @@ SyncStatusCode LocalFileChangeTracker::TrackerDB::Repair(
DCHECK(!db_.get());
LOG(WARNING) << "Attempting to repair TrackerDB.";
- if (leveldb::RepairDB(db_path, leveldb::Options()).ok() &&
+ leveldb::Options options;
+ options.max_open_files = 0; // Use minimum.
+ if (leveldb::RepairDB(db_path, options).ok() &&
Init(FAIL_ON_CORRUPTION) == SYNC_STATUS_OK) {
// TODO(nhiroki): perform some consistency checks between TrackerDB and
// syncable file system.