Skip to content

Commit

Permalink
[leveldb] tracking memory used by in-memory Env's.
Browse files Browse the repository at this point in the history
leveldb::InMemoryEnv is not exposed with no official support for
calculating memory usage. However, this is a pretty decent estimate
and will be helpful for tracking in-memory Env RAM use.

Bug: 750803
Change-Id: I4e07327bf4480bdb786290c82d8f66412868f36a
Reviewed-on: https://chromium-review.googlesource.com/601207
Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
Reviewed-by: Jochen Eisinger <jochen@chromium.org>
Reviewed-by: Siddhartha S <ssid@chromium.org>
Cr-Commit-Position: refs/heads/master@{#552361}
  • Loading branch information
cmumford committed Apr 20, 2018
1 parent 35a0f3b commit 8d26d10
Show file tree
Hide file tree
Showing 43 changed files with 338 additions and 67 deletions.
3 changes: 2 additions & 1 deletion PRESUBMIT.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,8 @@
'leveldb::NewMemEnv',
(
'Instead of leveldb::NewMemEnv() use leveldb_chrome::NewMemEnv() from',
'third_party/leveldatabase/leveldb_chrome.h.',
'third_party/leveldatabase/leveldb_chrome.h. It exposes environments',
"to Chrome's tracing, making their memory usage visible.",
),
True,
(
Expand Down
4 changes: 3 additions & 1 deletion base/trace_event/memory_infra_background_whitelist.cc
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ const char* const kAllocatorDumpNameWhitelist[] = {
"leveldatabase/block_cache/web",
"leveldatabase/db_0x?",
"leveldatabase/db_0x?/block_cache",
"leveldatabase/memenv_0x?",
"malloc",
"malloc/allocated_objects",
"malloc/metadata_fragmentation_caches",
Expand Down Expand Up @@ -259,7 +260,8 @@ const char* const kAllocatorDumpNameWhitelist[] = {
"v8/isolate_0x?/malloc",
"v8/isolate_0x?/zapped_for_debug",
"site_storage/blob_storage/0x?",
"site_storage/index_db/0x?",
"site_storage/index_db/db_0x?",
"site_storage/index_db/memenv_0x?",
"site_storage/localstorage/0x?/cache_size",
"site_storage/localstorage/0x?/leveldb",
"site_storage/session_storage/0x?",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class SyncFileSystemTest : public extensions::PlatformAppBrowserTest,
}

void SetUpOnMainThread() override {
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("SyncFileSystemTest");
extensions::PlatformAppBrowserTest::SetUpOnMainThread();
ASSERT_TRUE(base_dir_.CreateUniqueTempDir());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class ConflictResolverTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("ConflictResolverTest");

std::unique_ptr<FakeDriveServiceWrapper> fake_drive_service(
new FakeDriveServiceWrapper);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class DriveBackendSyncTest : public testing::Test,

void SetUp() override {
ASSERT_TRUE(base_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("DriveBackendSyncTest");

io_task_runner_ = content::BrowserThread::GetTaskRunnerForThread(
content::BrowserThread::IO);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class LevelDBWrapperTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("LevelDBWrapperTest");
InitializeLevelDB();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class ListChangesTaskTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("ListChangesTaskTest");

std::unique_ptr<drive::FakeDriveService> fake_drive_service(
new drive::FakeDriveService);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class LocalToRemoteSyncerTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("LocalToRemoteSyncerTest");

std::unique_ptr<FakeDriveServiceWrapper> fake_drive_service(
new FakeDriveServiceWrapper);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ class MetadataDatabaseIndexOnDiskTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ =
leveldb_chrome::NewMemEnv("MetadataDatabaseIndexOnDiskTest");
db_ = InitializeLevelDB();
index_ = MetadataDatabaseIndexOnDisk::Create(db_.get());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ std::unique_ptr<DatabaseContents> CreateTestDatabaseContents() {
class MetadataDatabaseIndexTest : public testing::Test {
public:
void SetUp() override {
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("MetadataDatabaseIndexTest");
InitializeLevelDB();

contents_ = CreateTestDatabaseContents();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ class MetadataDatabaseTest : public testing::TestWithParam<bool> {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("MetadataDatabaseTest");
}

void TearDown() override { DropDatabase(); }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class RegisterAppTaskTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("RegisterAppTaskTest");

std::unique_ptr<drive::FakeDriveService> fake_drive_service(
new drive::FakeDriveService);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class RemoteToLocalSyncerTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("RemoteToLocalSyncerTest");

std::unique_ptr<drive::FakeDriveService> fake_drive_service(
new drive::FakeDriveService);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class SyncEngineInitializerTest : public testing::Test {

void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("SyncEngineInitializerTest");

std::unique_ptr<drive::FakeDriveService> fake_drive_service(
new drive::FakeDriveService);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class SyncWorkerTest : public testing::Test,

void SetUp() override {
ASSERT_TRUE(profile_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("SyncWorkerTest");

extension_service_.reset(new MockExtensionService);
std::unique_ptr<drive::DriveServiceInterface> fake_drive_service(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class LocalFileChangeTrackerTest : public testing::Test {
public:
LocalFileChangeTrackerTest()
: thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
in_memory_env_(leveldb_chrome::NewMemEnv(leveldb::Env::Default())),
in_memory_env_(leveldb_chrome::NewMemEnv("LocalFileChangeTrackerTest")),
file_system_(GURL("http://example.com"),
in_memory_env_.get(),
base::ThreadTaskRunnerHandle::Get().get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class LocalFileSyncContextTest : public testing::Test {
void SetUp() override {
RegisterSyncableFileSystem();
ASSERT_TRUE(dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("LocalFileSyncContextTest");

ui_task_runner_ = base::ThreadTaskRunnerHandle::Get();
io_task_runner_ = BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ class LocalFileSyncServiceTest

void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("LocalFileSyncServiceTest");

file_system_.reset(new CannedSyncableFileSystem(
GURL(kOrigin), in_memory_env_.get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ class SyncableFileOperationRunnerTest : public testing::Test {
// operations in the tests.
SyncableFileOperationRunnerTest()
: thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
in_memory_env_(leveldb_chrome::NewMemEnv(leveldb::Env::Default())),
in_memory_env_(
leveldb_chrome::NewMemEnv("SyncableFileOperationRunnerTest")),
file_system_(GURL("http://example.com"),
in_memory_env_.get(),
base::ThreadTaskRunnerHandle::Get().get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace sync_file_system {
class SyncableFileSystemTest : public testing::Test {
public:
SyncableFileSystemTest()
: in_memory_env_(leveldb_chrome::NewMemEnv(leveldb::Env::Default())),
: in_memory_env_(leveldb_chrome::NewMemEnv("SyncableFileSystemTest")),
file_system_(GURL("http://example.com/"),
in_memory_env_.get(),
base::ThreadTaskRunnerHandle::Get().get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ class SyncFileSystemServiceTest : public testing::Test {
: thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) {}

void SetUp() override {
in_memory_env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
in_memory_env_ = leveldb_chrome::NewMemEnv("SyncFileSystemServiceTest");
file_system_.reset(new CannedSyncableFileSystem(
GURL(kOrigin), in_memory_env_.get(),
BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
Expand Down
2 changes: 1 addition & 1 deletion components/leveldb_proto/leveldb_database.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ bool LevelDB::Init(const base::FilePath& database_dir,
open_options_ = options;

if (database_dir.empty()) {
env_.reset(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
env_ = leveldb_chrome::NewMemEnv("LevelDB");
open_options_.env = env_.get();
}

Expand Down
25 changes: 18 additions & 7 deletions components/leveldb_proto/proto_database_impl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -346,9 +346,20 @@ TEST_F(ProtoDatabaseImplTest, TestDBGetSuccess) {
base::RunLoop().RunUntilIdle();
}

TEST(ProtoDatabaseImplLevelDBTest, TestDBSaveAndLoadKeys) {
base::MessageLoop main_loop;
class ProtoDatabaseImplLevelDBTest : public testing::Test {
public:
void SetUp() override { main_loop_.reset(new MessageLoop()); }

void TearDown() override {
base::RunLoop().RunUntilIdle();
main_loop_.reset();
}

private:
std::unique_ptr<MessageLoop> main_loop_;
};

TEST_F(ProtoDatabaseImplLevelDBTest, TestDBSaveAndLoadKeys) {
ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
base::Thread db_thread("dbthread");
Expand Down Expand Up @@ -677,15 +688,15 @@ void TestLevelDBSaveAndLoad(bool close_after_save) {
ExpectEntryPointersEquals(model, loaded_protos);
}

TEST(ProtoDatabaseImplLevelDBTest, TestDBSaveAndLoad) {
TEST_F(ProtoDatabaseImplLevelDBTest, TestDBSaveAndLoad) {
TestLevelDBSaveAndLoad(false);
}

TEST(ProtoDatabaseImplLevelDBTest, TestDBCloseAndReopen) {
TEST_F(ProtoDatabaseImplLevelDBTest, TestDBCloseAndReopen) {
TestLevelDBSaveAndLoad(true);
}

TEST(ProtoDatabaseImplLevelDBTest, TestDBInitFail) {
TEST_F(ProtoDatabaseImplLevelDBTest, TestDBInitFail) {
ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());

Expand All @@ -702,7 +713,7 @@ TEST(ProtoDatabaseImplLevelDBTest, TestDBInitFail) {
EXPECT_FALSE(db->Save(save_entries, remove_keys));
}

TEST(ProtoDatabaseImplLevelDBTest, TestMemoryDatabase) {
TEST_F(ProtoDatabaseImplLevelDBTest, TestMemoryDatabase) {
std::unique_ptr<LevelDB> db(new LevelDB(kTestLevelDBClientName));

std::vector<std::string> load_entries;
Expand All @@ -723,7 +734,7 @@ TEST(ProtoDatabaseImplLevelDBTest, TestMemoryDatabase) {
EXPECT_EQ(1u, second_load_entries.size());
}

TEST(ProtoDatabaseImplLevelDBTest, TestCorruptDBReset) {
TEST_F(ProtoDatabaseImplLevelDBTest, TestCorruptDBReset) {
ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());

Expand Down
4 changes: 2 additions & 2 deletions components/services/leveldb/leveldb_service_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,14 @@ void LevelDBServiceImpl::OpenWithOptions(
void LevelDBServiceImpl::OpenInMemory(
const base::Optional<base::trace_event::MemoryAllocatorDumpGuid>&
memory_dump_id,
const std::string& tracking_name,
leveldb::mojom::LevelDBDatabaseAssociatedRequest database,
OpenCallback callback) {
leveldb_env::Options options;
options.create_if_missing = true;
options.max_open_files = 0; // Use minimum.

std::unique_ptr<leveldb::Env> env(
leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
auto env = leveldb_chrome::NewMemEnv(tracking_name);
options.env = env.get();

std::unique_ptr<leveldb::DB> db;
Expand Down
1 change: 1 addition & 0 deletions components/services/leveldb/leveldb_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class LevelDBServiceImpl : public mojom::LevelDBService {
void OpenInMemory(
const base::Optional<base::trace_event::MemoryAllocatorDumpGuid>&
memory_dump_id,
const std::string& tracking_name,
leveldb::mojom::LevelDBDatabaseAssociatedRequest database,
OpenInMemoryCallback callback) override;
void Destroy(filesystem::mojom::DirectoryPtr directory,
Expand Down
2 changes: 1 addition & 1 deletion components/services/leveldb/leveldb_service_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void LevelDBSyncOpenInMemory(mojom::LevelDBService* leveldb,
mojom::LevelDBDatabaseAssociatedRequest database,
mojom::DatabaseError* out_error) {
base::RunLoop run_loop;
leveldb->OpenInMemory(base::nullopt, std::move(database),
leveldb->OpenInMemory(base::nullopt, "LevelDBSync", std::move(database),
Capture(out_error, run_loop.QuitClosure()));
run_loop.Run();
}
Expand Down
4 changes: 3 additions & 1 deletion components/services/leveldb/public/interfaces/leveldb.mojom
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,10 @@ interface LevelDBService {
associated LevelDBDatabase& database) => (DatabaseError status);

// Opens a database stored purely in memory.
// "tracking_name" will be used for memory-infra reporting to associate memory
// use with its origin.
OpenInMemory(mojo_base.mojom.MemoryAllocatorDumpCrossProcessUid?
memory_dump_id,
memory_dump_id, string tracking_name,
associated LevelDBDatabase& database) => (DatabaseError status);

// Destroys the contents of the specified database. Returns OK if the database
Expand Down
3 changes: 2 additions & 1 deletion components/services/leveldb/remote_iterator_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ class RemoteIteratorTest : public service_manager::test::ServiceTest {

mojom::DatabaseError error;
base::RunLoop run_loop;
leveldb()->OpenInMemory(base::nullopt, MakeRequest(&database_),
leveldb()->OpenInMemory(base::nullopt, "RemoteIteratorTest",
MakeRequest(&database_),
Capture(&error, run_loop.QuitClosure()));
run_loop.Run();
EXPECT_EQ(mojom::DatabaseError::OK, error);
Expand Down
2 changes: 1 addition & 1 deletion components/sync/model_impl/model_type_store_backend.cc
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ ModelTypeStoreBackend::~ModelTypeStoreBackend() {
}

std::unique_ptr<leveldb::Env> ModelTypeStoreBackend::CreateInMemoryEnv() {
return base::WrapUnique(leveldb_chrome::NewMemEnv(leveldb::Env::Default()));
return leveldb_chrome::NewMemEnv("ModelTypeStore");
}

// static
Expand Down
2 changes: 1 addition & 1 deletion content/browser/dom_storage/local_storage_context_mojo.cc
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,7 @@ void LocalStorageContextMojo::InitiateConnection(bool in_memory_only) {
// We were not given a subdirectory. Use a memory backed database.
connector_->BindInterface(file::mojom::kServiceName, &leveldb_service_);
leveldb_service_->OpenInMemory(
memory_dump_id_, MakeRequest(&database_),
memory_dump_id_, "local-storage", MakeRequest(&database_),
base::BindOnce(&LocalStorageContextMojo::OnDatabaseOpened,
weak_ptr_factory_.GetWeakPtr(), true));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1126,7 +1126,7 @@ class FakeLevelDBService : public leveldb::mojom::LevelDBService {
leveldb::mojom::LevelDBDatabaseAssociatedRequest request,
OpenCallback callback) override {
open_requests_.push_back(
{false, dbname, std::move(request), std::move(callback)});
{false, dbname, "", std::move(request), std::move(callback)});
if (on_open_callback_)
on_open_callback_.Run();
}
Expand All @@ -1140,18 +1140,19 @@ class FakeLevelDBService : public leveldb::mojom::LevelDBService {
leveldb::mojom::LevelDBDatabaseAssociatedRequest request,
OpenCallback callback) override {
open_requests_.push_back(
{false, dbname, std::move(request), std::move(callback)});
{false, dbname, "", std::move(request), std::move(callback)});
if (on_open_callback_)
on_open_callback_.Run();
}

void OpenInMemory(
const base::Optional<base::trace_event::MemoryAllocatorDumpGuid>&
memory_dump_id,
const std::string& tracking_name,
leveldb::mojom::LevelDBDatabaseAssociatedRequest request,
OpenCallback callback) override {
open_requests_.push_back(
{true, "", std::move(request), std::move(callback)});
{true, "", tracking_name, std::move(request), std::move(callback)});
if (on_open_callback_)
on_open_callback_.Run();
}
Expand All @@ -1166,6 +1167,7 @@ class FakeLevelDBService : public leveldb::mojom::LevelDBService {
struct OpenRequest {
bool in_memory;
std::string dbname;
std::string memenv_tracking_name;
leveldb::mojom::LevelDBDatabaseAssociatedRequest request;
OpenCallback callback;
};
Expand Down
7 changes: 4 additions & 3 deletions content/browser/fileapi/browser_file_system_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,12 @@ FileSystemOptions CreateBrowserFileSystemOptions(bool is_incognito) {
switches::kAllowFileAccessFromFiles)) {
additional_allowed_schemes.push_back(url::kFileScheme);
}
leveldb::Env* env_override = nullptr;
std::unique_ptr<leveldb::Env> env_override;
if (is_incognito)
env_override = leveldb_chrome::NewMemEnv(leveldb::Env::Default());
env_override = leveldb_chrome::NewMemEnv("filesystem");
// TODO(crbug.com/823854) Fix leaking override MemEnv.
return FileSystemOptions(profile_mode, additional_allowed_schemes,
env_override);
env_override.release());
}

} // namespace
Expand Down
Loading

0 comments on commit 8d26d10

Please sign in to comment.