Commit 4050991e authored by cmumford's avatar cmumford Committed by Commit bot

leveldb: Reuse manifest (AKA logs) during open.

All leveldb uses now set the reuse_logs option to trigger a new fast open path.
For db's with prior changes (i.e. non-empty logs) this avoids three fsync calls
(on average) for every open as well as the need to compact (rewrite) the db.

More info at:

https://github.com/google/leveldb/commit/251ebf5dc70129ad3c38193fe6c99a5b0ec6b9fa

BUG=468810

Review URL: https://codereview.chromium.org/1025433003

Cr-Commit-Position: refs/heads/master@{#322433}
parent 69593286
......@@ -267,6 +267,7 @@ bool ResourceMetadataStorage::UpgradeOldDB(
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = false;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
if (!leveldb::DB::Open(options, resource_map_path.AsUTF8Unsafe(), &db).ok())
return false;
scoped_ptr<leveldb::DB> resource_map(db);
......@@ -549,6 +550,7 @@ bool ResourceMetadataStorage::Initialize() {
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = false;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
DBInitStatus open_existing_result = DB_INIT_NOT_FOUND;
leveldb::Status status;
......@@ -600,6 +602,7 @@ bool ResourceMetadataStorage::Initialize() {
options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
options.error_if_exists = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
status = leveldb::DB::Open(options, resource_map_path.AsUTF8Unsafe(), &db);
if (status.ok()) {
......@@ -638,6 +641,7 @@ void ResourceMetadataStorage::RecoverCacheInfoFromTrashedResourceMap(
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = false;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
// Trashed DB may be broken, repair it first.
leveldb::Status status;
......
......@@ -15,6 +15,7 @@
#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
#include "base/values.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
......@@ -106,6 +107,7 @@ void LevelDBPrefStore::OpenDB(const base::FilePath& path,
DCHECK_EQ(0, reading_results->error);
leveldb::Options options;
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
leveldb::DB* db;
while (1) {
leveldb::Status status =
......
......@@ -34,6 +34,7 @@
#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
#include "google_apis/drive/drive_api_parser.h"
#include "storage/common/fileapi/file_system_util.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/env.h"
#include "third_party/leveldatabase/src/include/leveldb/status.h"
......@@ -214,6 +215,7 @@ SyncStatusCode OpenDatabase(const base::FilePath& path,
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
if (env_override)
options.env = env_override;
leveldb::DB* db = nullptr;
......
......@@ -16,6 +16,7 @@
#include "storage/browser/fileapi/file_system_file_util.h"
#include "storage/browser/fileapi/file_system_operation_context.h"
#include "storage/common/fileapi/file_system_util.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/env.h"
......@@ -480,6 +481,7 @@ SyncStatusCode LocalFileChangeTracker::TrackerDB::Init(
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
if (env_override_)
options.env = env_override_;
leveldb::DB* db;
......
include_rules = [
"+third_party/leveldatabase/src/include",
"+third_party/leveldatabase",
]
......@@ -12,6 +12,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_split.h"
#include "base/threading/thread_checker.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/iterator.h"
#include "third_party/leveldatabase/src/include/leveldb/options.h"
......@@ -55,6 +56,7 @@ bool LevelDB::Init(const base::FilePath& database_dir) {
leveldb::Options options;
options.create_if_missing = true;
options.max_open_files = 0; // Use minimum.
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
return InitWithOptions(database_dir, options);
}
......
......@@ -10,6 +10,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/iterator.h"
#include "third_party/leveldatabase/src/include/leveldb/options.h"
......@@ -381,6 +382,7 @@ leveldb::Status SessionStorageDatabase::TryToOpen(leveldb::DB** db) {
// situation gracefully by creating the database now.
options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
#if defined(OS_WIN)
return leveldb::DB::Open(options, base::WideToUTF8(file_path_.value()), db);
#elif defined(OS_POSIX)
......
......@@ -103,7 +103,7 @@ static leveldb::Status OpenDB(
options.create_if_missing = true;
options.paranoid_checks = true;
options.filter_policy = filter_policy->get();
options.reuse_logs = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
options.compression = leveldb::kSnappyCompression;
// For info about the troubles we've run into with this parameter, see:
......
......@@ -14,6 +14,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_database_data.h"
#include "storage/common/database/database_identifier.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/env.h"
......@@ -114,6 +115,7 @@ NotificationDatabase::Status NotificationDatabase::Open(
leveldb::Options options;
options.create_if_missing = create_if_missing;
options.paranoid_checks = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
if (IsInMemoryDatabase()) {
env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
options.env = env_.get();
......
......@@ -16,6 +16,7 @@
#include "content/browser/service_worker/service_worker_database.pb.h"
#include "content/browser/service_worker/service_worker_metrics.h"
#include "content/common/service_worker/service_worker_types.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/env.h"
......@@ -999,6 +1000,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::LazyOpen(
leveldb::Options options;
options.create_if_missing = create_if_missing;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
if (use_in_memory_db) {
env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
options.env = env_.get();
......
......@@ -13,6 +13,7 @@
#include "base/strings/sys_string_conversions.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/value_store/value_store_util.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/iterator.h"
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
......@@ -328,6 +329,7 @@ scoped_ptr<ValueStore::Error> LeveldbValueStore::EnsureDbIsOpen() {
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
leveldb::DB* db = NULL;
leveldb::Status status =
......
......@@ -23,6 +23,7 @@
#include "google_apis/gcm/base/mcs_message.h"
#include "google_apis/gcm/base/mcs_util.h"
#include "google_apis/gcm/protocol/mcs.pb.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
......@@ -239,6 +240,7 @@ LoadStatus GCMStoreImpl::Backend::OpenStoreAndLoadData(LoadResult* result) {
leveldb::Options options;
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
leveldb::DB* db;
leveldb::Status status =
leveldb::DB::Open(options, path_.AsUTF8Unsafe(), &db);
......
......@@ -18,6 +18,7 @@
#include "base/strings/string_util.h"
#include "storage/browser/fileapi/file_system_usage_cache.h"
#include "storage/common/fileapi/file_system_util.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
......@@ -727,6 +728,7 @@ bool SandboxDirectoryDatabase::Init(RecoveryOption recovery_option) {
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
if (env_override_)
options.env = env_override_;
leveldb::DB* db;
......
......@@ -17,6 +17,7 @@
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "storage/common/fileapi/file_system_util.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
......@@ -80,6 +81,7 @@ bool SandboxOriginDatabase::Init(InitOption init_option,
leveldb::Options options;
options.max_open_files = 0; // Use minimum.
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
if (env_override_)
options.env = env_override_;
leveldb::DB* db;
......
......@@ -13,6 +13,7 @@
#include "sync/internal_api/attachments/proto/attachment_store.pb.h"
#include "sync/internal_api/public/attachments/attachment_util.h"
#include "sync/protocol/attachments.pb.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/options.h"
#include "third_party/leveldatabase/src/include/leveldb/slice.h"
......@@ -274,6 +275,7 @@ AttachmentStore::Result OnDiskAttachmentStore::OpenOrCreate(
scoped_ptr<leveldb::DB> db;
leveldb::Options options;
options.create_if_missing = true;
options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
// TODO(pavely): crbug/424287 Consider adding info_log, block_cache and
// filter_policy to options.
leveldb::Status status =
......
......@@ -47,6 +47,11 @@ enum MethodID {
kNumEntries
};
// The default value for leveldb::Options::reuse_logs. Currently log reuse is an
// experimental feature in leveldb. More info at:
// https://github.com/google/leveldb/commit/251ebf5dc70129ad3
const bool kDefaultLogReuseOptionValue = true;
const char* MethodIDToString(MethodID method);
leveldb::Status MakeIOError(leveldb::Slice filename,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment