Commit 7647648f authored by Alexander Bolodurin's avatar Alexander Bolodurin Committed by Commit Bot

arc: Use directory cache when getting ExtraFileMetadata for an entry

The cache was introduced in https://crrev.com/c/616409 but was only used
to get File::Info for an entry, and the calls to get ExtraFileMetadata
made a mojo call each time, even though both functions draw data from
the same source (ARC Document objects). It did not impact read-only
providers, as the extra metadata returned for them is currently static,
but this will change when dynamic metadata is added (DocumentsProvider
thumbnail flag).

Also, ArcDocumentsProviderRoot::GetMetadata is renamed to
GetExtraFileMetadata to disambiguate it from a file system operation
with the same name.

Bug: 1049966
Change-Id: I94e0dc50e8a646a68b8c7b76e398c7777f4da121
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2464518
Commit-Queue: Alexander Bolodurin <alexbn@google.com>
Reviewed-by: default avatarNaoki Fukino <fukino@chromium.org>
Reviewed-by: default avatarRyo Hashimoto <hashimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#816542}
parent a97c57e7
...@@ -117,16 +117,9 @@ void ArcDocumentsProviderRoot::GetFileInfo(const base::FilePath& path, ...@@ -117,16 +117,9 @@ void ArcDocumentsProviderRoot::GetFileInfo(const base::FilePath& path,
return; return;
} }
base::FilePath basename = path.BaseName(); GetDocument(path, base::BindOnce(
base::FilePath parent = path.DirName(); &ArcDocumentsProviderRoot::GetFileInfoFromDocument,
if (parent.value() == base::FilePath::kCurrentDirectory) weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
parent = base::FilePath();
ResolveToDocumentId(
parent,
base::BindOnce(&ArcDocumentsProviderRoot::GetFileInfoWithParentDocumentId,
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
basename));
} }
void ArcDocumentsProviderRoot::ReadDirectory(const base::FilePath& path, void ArcDocumentsProviderRoot::ReadDirectory(const base::FilePath& path,
...@@ -269,8 +262,9 @@ void ArcDocumentsProviderRoot::ResolveToContentUrl( ...@@ -269,8 +262,9 @@ void ArcDocumentsProviderRoot::ResolveToContentUrl(
weak_ptr_factory_.GetWeakPtr(), std::move(callback))); weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
} }
void ArcDocumentsProviderRoot::GetMetadata(const base::FilePath& path, void ArcDocumentsProviderRoot::GetExtraFileMetadata(
GetMetadataCallback callback) { const base::FilePath& path,
GetExtraMetadataCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (path.IsAbsolute()) { if (path.IsAbsolute()) {
...@@ -283,10 +277,10 @@ void ArcDocumentsProviderRoot::GetMetadata(const base::FilePath& path, ...@@ -283,10 +277,10 @@ void ArcDocumentsProviderRoot::GetMetadata(const base::FilePath& path,
std::move(callback).Run(base::File::FILE_OK, {}); std::move(callback).Run(base::File::FILE_OK, {});
return; return;
} }
ResolveToDocumentId(
path, GetDocument(path, base::BindOnce(
base::BindOnce(&ArcDocumentsProviderRoot::GetMetadataWithDocumentId, &ArcDocumentsProviderRoot::GetExtraMetadataFromDocument,
weak_ptr_factory_.GetWeakPtr(), std::move(callback))); weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
} }
void ArcDocumentsProviderRoot::SetDirectoryCacheExpireSoonForTesting() { void ArcDocumentsProviderRoot::SetDirectoryCacheExpireSoonForTesting() {
...@@ -301,44 +295,16 @@ void ArcDocumentsProviderRoot::OnWatchersCleared() { ...@@ -301,44 +295,16 @@ void ArcDocumentsProviderRoot::OnWatchersCleared() {
entry.second = kInvalidWatcherData; entry.second = kInvalidWatcherData;
} }
void ArcDocumentsProviderRoot::GetFileInfoWithParentDocumentId( void ArcDocumentsProviderRoot::GetFileInfoFromDocument(
GetFileInfoCallback callback, GetFileInfoCallback callback,
const base::FilePath& basename,
const std::string& parent_document_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (parent_document_id.empty()) {
std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND,
base::File::Info());
return;
}
ReadDirectoryInternal(
parent_document_id, false /* force_refresh */,
base::BindOnce(
&ArcDocumentsProviderRoot::GetFileInfoWithNameToDocumentMap,
weak_ptr_factory_.GetWeakPtr(), std::move(callback), basename));
}
void ArcDocumentsProviderRoot::GetFileInfoWithNameToDocumentMap(
GetFileInfoCallback callback,
const base::FilePath& basename,
base::File::Error error, base::File::Error error,
const NameToDocumentMap& mapping) { const mojom::DocumentPtr& document) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (document.is_null()) {
if (error != base::File::FILE_OK) { std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND, {});
std::move(callback).Run(error, base::File::Info());
return;
}
auto iter = mapping.find(basename.value());
if (iter == mapping.end()) {
std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND,
base::File::Info());
return; return;
} }
const auto& document = iter->second;
base::File::Info info; base::File::Info info;
info.size = document->size; info.size = document->size;
info.is_directory = document->mime_type == kAndroidDirectoryMimeType; info.is_directory = document->mime_type == kAndroidDirectoryMimeType;
...@@ -748,22 +714,10 @@ void ArcDocumentsProviderRoot::ResolveToContentUrlWithDocumentId( ...@@ -748,22 +714,10 @@ void ArcDocumentsProviderRoot::ResolveToContentUrlWithDocumentId(
std::move(callback).Run(BuildDocumentUrl(authority_, document_id)); std::move(callback).Run(BuildDocumentUrl(authority_, document_id));
} }
void ArcDocumentsProviderRoot::GetMetadataWithDocumentId( void ArcDocumentsProviderRoot::GetExtraMetadataFromDocument(
GetMetadataCallback callback, GetExtraMetadataCallback callback,
const std::string& document_id) { base::File::Error error,
DCHECK_CURRENTLY_ON(BrowserThread::UI); const mojom::DocumentPtr& document) {
if (document_id.empty()) {
std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND, {});
return;
}
runner_->GetDocument(
authority_, document_id,
base::BindOnce(&ArcDocumentsProviderRoot::OnMetadataGotten,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}
void ArcDocumentsProviderRoot::OnMetadataGotten(GetMetadataCallback callback,
mojom::DocumentPtr document) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (document.is_null()) { if (document.is_null()) {
std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND, {}); std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND, {});
...@@ -776,6 +730,61 @@ void ArcDocumentsProviderRoot::OnMetadataGotten(GetMetadataCallback callback, ...@@ -776,6 +730,61 @@ void ArcDocumentsProviderRoot::OnMetadataGotten(GetMetadataCallback callback,
std::move(callback).Run(base::File::FILE_OK, metadata); std::move(callback).Run(base::File::FILE_OK, metadata);
} }
void ArcDocumentsProviderRoot::GetDocument(const base::FilePath& path,
GetDocumentCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::FilePath basename = path.BaseName();
base::FilePath parent = path.DirName();
if (parent.value() == base::FilePath::kCurrentDirectory)
parent = base::FilePath();
ResolveToDocumentId(
parent,
base::BindOnce(&ArcDocumentsProviderRoot::GetDocumentWithParentDocumentId,
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
basename));
}
void ArcDocumentsProviderRoot::GetDocumentWithParentDocumentId(
GetDocumentCallback callback,
const base::FilePath& basename,
const std::string& parent_document_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (parent_document_id.empty()) {
std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND,
mojom::DocumentPtr());
return;
}
ReadDirectoryInternal(
parent_document_id, false /* force_refresh */,
base::BindOnce(
&ArcDocumentsProviderRoot::GetDocumentWithNameToDocumentMap,
weak_ptr_factory_.GetWeakPtr(), std::move(callback), basename));
}
void ArcDocumentsProviderRoot::GetDocumentWithNameToDocumentMap(
GetDocumentCallback callback,
const base::FilePath& basename,
base::File::Error error,
const NameToDocumentMap& mapping) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (error != base::File::FILE_OK) {
std::move(callback).Run(error, mojom::DocumentPtr());
return;
}
auto iter = mapping.find(basename.value());
if (iter == mapping.end()) {
std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND,
mojom::DocumentPtr());
return;
}
std::move(callback).Run(base::File::FILE_OK, iter->second);
}
void ArcDocumentsProviderRoot::ResolveToDocumentId( void ArcDocumentsProviderRoot::ResolveToDocumentId(
const base::FilePath& path, const base::FilePath& path,
ResolveToDocumentIdCallback callback) { ResolveToDocumentIdCallback callback) {
......
...@@ -65,7 +65,7 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer { ...@@ -65,7 +65,7 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer {
using WatcherStatusCallback = storage::WatcherManager::StatusCallback; using WatcherStatusCallback = storage::WatcherManager::StatusCallback;
using ResolveToContentUrlCallback = using ResolveToContentUrlCallback =
base::OnceCallback<void(const GURL& content_url)>; base::OnceCallback<void(const GURL& content_url)>;
using GetMetadataCallback = using GetExtraMetadataCallback =
base::OnceCallback<void(base::File::Error error, base::OnceCallback<void(base::File::Error error,
const ExtraFileMetadata& metadata)>; const ExtraFileMetadata& metadata)>;
...@@ -188,7 +188,8 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer { ...@@ -188,7 +188,8 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer {
// Get extra metadata of the file at |path|. // Get extra metadata of the file at |path|.
// The metadata is about capatility of write operations. // The metadata is about capatility of write operations.
// See ExtraFileMetadata for the supported capabilities. // See ExtraFileMetadata for the supported capabilities.
void GetMetadata(const base::FilePath& path, GetMetadataCallback callback); void GetExtraFileMetadata(const base::FilePath& path,
GetExtraMetadataCallback callback);
// Instructs to make directory caches expire "soon" after callbacks are // Instructs to make directory caches expire "soon" after callbacks are
// called, that is, when the message loop gets idle. // called, that is, when the message loop gets idle.
...@@ -214,14 +215,13 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer { ...@@ -214,14 +215,13 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer {
using ReadDirectoryInternalCallback = using ReadDirectoryInternalCallback =
base::OnceCallback<void(base::File::Error error, base::OnceCallback<void(base::File::Error error,
const NameToDocumentMap& mapping)>; const NameToDocumentMap& mapping)>;
using GetDocumentCallback =
base::OnceCallback<void(base::File::Error error,
const mojom::DocumentPtr& document)>;
void GetFileInfoWithParentDocumentId(GetFileInfoCallback callback, void GetFileInfoFromDocument(GetFileInfoCallback callback,
const base::FilePath& basename, base::File::Error error,
const std::string& parent_document_id); const mojom::DocumentPtr& document);
void GetFileInfoWithNameToDocumentMap(GetFileInfoCallback callback,
const base::FilePath& basename,
base::File::Error error,
const NameToDocumentMap& mapping);
void ReadDirectoryWithDocumentId(ReadDirectoryCallback callback, void ReadDirectoryWithDocumentId(ReadDirectoryCallback callback,
const std::string& document_id); const std::string& document_id);
...@@ -315,11 +315,20 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer { ...@@ -315,11 +315,20 @@ class ArcDocumentsProviderRoot : public ArcFileSystemOperationRunner::Observer {
void ResolveToContentUrlWithDocumentId(ResolveToContentUrlCallback callback, void ResolveToContentUrlWithDocumentId(ResolveToContentUrlCallback callback,
const std::string& document_id); const std::string& document_id);
void GetMetadataWithDocumentId(GetMetadataCallback callback, void GetExtraMetadataFromDocument(GetExtraMetadataCallback callback,
const std::string& document_id); base::File::Error error,
void OnMetadataGotten(GetMetadataCallback callback, const mojom::DocumentPtr& document);
mojom::DocumentPtr document);
// Queries for a single document at the given |path|, using a directory cache,
// if present.
void GetDocument(const base::FilePath& path, GetDocumentCallback callback);
void GetDocumentWithParentDocumentId(GetDocumentCallback callback,
const base::FilePath& basename,
const std::string& parent_document_id);
void GetDocumentWithNameToDocumentMap(GetDocumentCallback callback,
const base::FilePath& basename,
base::File::Error error,
const NameToDocumentMap& mapping);
// Resolves |path| to a document ID. Failures are indicated by an empty // Resolves |path| to a document ID. Failures are indicated by an empty
// document ID. // document ID.
void ResolveToDocumentId(const base::FilePath& path, void ResolveToDocumentId(const base::FilePath& path,
......
...@@ -1326,7 +1326,7 @@ TEST_F(ArcDocumentsProviderRootTest, ResolveToContentUrlDups) { ...@@ -1326,7 +1326,7 @@ TEST_F(ArcDocumentsProviderRootTest, ResolveToContentUrlDups) {
TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonDeletable) { TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonDeletable) {
base::RunLoop run_loop; base::RunLoop run_loop;
root_->GetMetadata( root_->GetExtraFileMetadata(
base::FilePath(FILE_PATH_LITERAL("dir/no-delete.jpg")), base::FilePath(FILE_PATH_LITERAL("dir/no-delete.jpg")),
base::BindOnce( base::BindOnce(
[](base::RunLoop* run_loop, base::File::Error error, [](base::RunLoop* run_loop, base::File::Error error,
...@@ -1343,7 +1343,7 @@ TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonDeletable) { ...@@ -1343,7 +1343,7 @@ TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonDeletable) {
TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonRenamable) { TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonRenamable) {
base::RunLoop run_loop; base::RunLoop run_loop;
root_->GetMetadata( root_->GetExtraFileMetadata(
base::FilePath(FILE_PATH_LITERAL("dir/no-rename.jpg")), base::FilePath(FILE_PATH_LITERAL("dir/no-rename.jpg")),
base::BindOnce( base::BindOnce(
[](base::RunLoop* run_loop, base::File::Error error, [](base::RunLoop* run_loop, base::File::Error error,
...@@ -1360,7 +1360,7 @@ TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonRenamable) { ...@@ -1360,7 +1360,7 @@ TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonRenamable) {
TEST_F(ArcDocumentsProviderRootTest, GetMetadataReadOnlyDirectory) { TEST_F(ArcDocumentsProviderRootTest, GetMetadataReadOnlyDirectory) {
base::RunLoop run_loop; base::RunLoop run_loop;
root_->GetMetadata( root_->GetExtraFileMetadata(
base::FilePath(FILE_PATH_LITERAL("ro-dir")), base::FilePath(FILE_PATH_LITERAL("ro-dir")),
base::BindOnce( base::BindOnce(
[](base::RunLoop* run_loop, base::File::Error error, [](base::RunLoop* run_loop, base::File::Error error,
...@@ -1377,7 +1377,7 @@ TEST_F(ArcDocumentsProviderRootTest, GetMetadataReadOnlyDirectory) { ...@@ -1377,7 +1377,7 @@ TEST_F(ArcDocumentsProviderRootTest, GetMetadataReadOnlyDirectory) {
TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonExist) { TEST_F(ArcDocumentsProviderRootTest, GetMetadataNonExist) {
base::RunLoop run_loop; base::RunLoop run_loop;
root_->GetMetadata( root_->GetExtraFileMetadata(
base::FilePath(FILE_PATH_LITERAL("dir/no-exist-file")), base::FilePath(FILE_PATH_LITERAL("dir/no-exist-file")),
base::BindOnce( base::BindOnce(
[](base::RunLoop* run_loop, base::File::Error error, [](base::RunLoop* run_loop, base::File::Error error,
......
...@@ -274,14 +274,13 @@ class SingleEntryPropertiesGetterForDocumentsProvider { ...@@ -274,14 +274,13 @@ class SingleEntryPropertiesGetterForDocumentsProvider {
CompleteGetEntryProperties(base::File::FILE_ERROR_NOT_FOUND); CompleteGetEntryProperties(base::File::FILE_ERROR_NOT_FOUND);
return; return;
} }
root->GetMetadata( root->GetExtraFileMetadata(
path, path, base::BindOnce(&SingleEntryPropertiesGetterForDocumentsProvider::
base::BindOnce( OnGetExtraFileMetadata,
&SingleEntryPropertiesGetterForDocumentsProvider::OnGetMetadata, weak_ptr_factory_.GetWeakPtr()));
weak_ptr_factory_.GetWeakPtr()));
} }
void OnGetMetadata( void OnGetExtraFileMetadata(
base::File::Error error, base::File::Error error,
const arc::ArcDocumentsProviderRoot::ExtraFileMetadata& metadata) { const arc::ArcDocumentsProviderRoot::ExtraFileMetadata& metadata) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
......
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