diff options
author | dgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-16 19:54:40 +0000 |
---|---|---|
committer | dgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-16 19:54:40 +0000 |
commit | 7b00db0efffcf0ee9c3b92658de9cccc11fdd430 (patch) | |
tree | 9769d391314c5ebaecb025528a0a1ea1a8d0d213 /webkit/browser | |
parent | 31ed00d72dcc98b705ae0de6cc3aefcc98c31e12 (diff) | |
download | chromium_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')
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. |