Commit d4ced263 authored by lijunsong's avatar lijunsong Committed by Commit Bot

[SessionStorage] Simplify database open callback graph

This changeset simplifies database callback graph in open with GetMany provided
by leveldb service.

Previously OnDatabaseOpened called OnGotDatabaseVersion, and before calling
OnConnectionFinished it was block waiting on a barrier of OnGotNamespaces and
OnGotNextMapId. This changeset gets values of database version, namespaces and
next map id in one call, and processes the result sequentially.

Bug: 965723

Test: autoninja -C out/Default content/test:content_unittests. Passed all content_unittests
Change-Id: I968d92d93414cc6918e48d870fea27dc1d74b3d2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1714487
Commit-Queue: Daniel Murphy <dmurph@chromium.org>
Reviewed-by: default avatarDaniel Murphy <dmurph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#684106}
parent 16109dae
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <map> #include <map>
#include <memory> #include <memory>
#include <string> #include <string>
#include <tuple>
#include <vector> #include <vector>
#include "base/callback_forward.h" #include "base/callback_forward.h"
...@@ -149,6 +150,18 @@ class CONTENT_EXPORT SessionStorageContextMojo ...@@ -149,6 +150,18 @@ class CONTENT_EXPORT SessionStorageContextMojo
FRIEND_TEST_ALL_PREFIXES(SessionStorageContextMojoTest, FRIEND_TEST_ALL_PREFIXES(SessionStorageContextMojoTest,
PurgeMemoryDoesNotCrashOrHang); PurgeMemoryDoesNotCrashOrHang);
// These values are written to logs. New enum values can be added, but
// existing enums must never be renumbered or deleted and reused.
enum class OpenResult {
kDirectoryOpenFailed = 0,
kDatabaseOpenFailed = 1,
kInvalidVersion = 2,
kVersionReadError = 3,
kNamespacesReadError = 4,
kSuccess = 6,
kMaxValue = kSuccess
};
// Object deletion is done through |ShutdownAndDelete()|. // Object deletion is done through |ShutdownAndDelete()|.
~SessionStorageContextMojo() override; ~SessionStorageContextMojo() override;
...@@ -187,16 +200,20 @@ class CONTENT_EXPORT SessionStorageContextMojo ...@@ -187,16 +200,20 @@ class CONTENT_EXPORT SessionStorageContextMojo
void InitiateConnection(bool in_memory_only = false); void InitiateConnection(bool in_memory_only = false);
void OnDirectoryOpened(base::File::Error err); void OnDirectoryOpened(base::File::Error err);
void OnDatabaseOpened(bool in_memory, leveldb::mojom::DatabaseError status); void OnDatabaseOpened(bool in_memory, leveldb::mojom::DatabaseError status);
void OnGotDatabaseVersion(leveldb::mojom::DatabaseError status,
const std::vector<uint8_t>& value); void OnGotDatabaseMetadata(
void OnGotNamespaces( std::vector<leveldb::mojom::GetManyResultPtr> results);
base::OnceClosure done,
std::vector<leveldb::mojom::BatchedOperationPtr> migration_operations, using OpenResultAndHistogramName = std::tuple<OpenResult, const char*>;
leveldb::mojom::DatabaseError status, OpenResultAndHistogramName ParseDatabaseVersion(
std::vector<leveldb::mojom::KeyValuePtr> values); const leveldb::mojom::GetManyResultPtr& result,
void OnGotNextMapId(base::OnceClosure done, std::vector<leveldb::mojom::BatchedOperationPtr>* migration_operations);
leveldb::mojom::DatabaseError status, OpenResultAndHistogramName ParseNamespaces(
const std::vector<uint8_t>& map_id); const leveldb::mojom::GetManyResultPtr& result,
std::vector<leveldb::mojom::BatchedOperationPtr> migration_operations);
OpenResultAndHistogramName ParseNextMapId(
const leveldb::mojom::GetManyResultPtr& result);
void OnConnectionFinished(); void OnConnectionFinished();
void DeleteAndRecreateDatabase(const char* histogram_name); void DeleteAndRecreateDatabase(const char* histogram_name);
void OnDBDestroyed(bool recreate_in_memory, void OnDBDestroyed(bool recreate_in_memory,
...@@ -211,17 +228,6 @@ class CONTENT_EXPORT SessionStorageContextMojo ...@@ -211,17 +228,6 @@ class CONTENT_EXPORT SessionStorageContextMojo
void GetStatistics(size_t* total_cache_size, size_t* unused_areas_count); void GetStatistics(size_t* total_cache_size, size_t* unused_areas_count);
// These values are written to logs. New enum values can be added, but
// existing enums must never be renumbered or deleted and reused.
enum class OpenResult {
kDirectoryOpenFailed = 0,
kDatabaseOpenFailed = 1,
kInvalidVersion = 2,
kVersionReadError = 3,
kNamespacesReadError = 4,
kSuccess = 6,
kMaxValue = kSuccess
};
void LogDatabaseOpenResult(OpenResult result); void LogDatabaseOpenResult(OpenResult result);
......
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