Commit 411641b4 authored by Sergei Datsenko's avatar Sergei Datsenko Committed by Commit Bot

Perform cache shared-with-me search results.

DriveFS caches results fetched through search so after first online search
we can obtain the same result performing it's offline version which is faster.

BUG=chromium:902600

Change-Id: I775a1e587c9f1d12f83aec03dd5b53ac5f483331
Reviewed-on: https://chromium-review.googlesource.com/c/1328542
Commit-Queue: Sergei Datsenko <dats@chromium.org>
Reviewed-by: default avatarSam McNally <sammc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#607144}
parent 6f9d4147
......@@ -30,6 +30,7 @@ constexpr char kMountScheme[] = "drivefs://";
constexpr char kDataPath[] = "GCache/v2";
constexpr char kIdentityConsumerId[] = "drivefs";
constexpr base::TimeDelta kMountTimeout = base::TimeDelta::FromSeconds(20);
constexpr base::TimeDelta kQueryCacheTtl = base::TimeDelta::FromMinutes(5);
class MojoConnectionDelegateImpl : public DriveFsHost::MojoConnectionDelegate {
public:
......@@ -272,6 +273,16 @@ class DriveFsHost::MountState
mojom::QueryParameters::QuerySource SearchDriveFs(
mojom::QueryParametersPtr query,
mojom::SearchQuery::GetNextPageCallback callback) {
// The only cacheable query is 'shared with me'.
if (IsCloudSharedWithMeQuery(query)) {
// Check if we should have the response cached.
auto delta = host_->clock_->Now() - last_shared_with_me_response_;
if (delta <= kQueryCacheTtl) {
query->query_source =
drivefs::mojom::QueryParameters::QuerySource::kLocalOnly;
}
}
drivefs::mojom::SearchQueryPtr search;
drivefs::mojom::QueryParameters::QuerySource source = query->query_source;
if (net::NetworkChangeNotifier::IsOffline() &&
......@@ -471,9 +482,21 @@ class DriveFsHost::MountState
return;
}
if (IsCloudSharedWithMeQuery(query)) {
// Mark that DriveFS should have cached the required info.
last_shared_with_me_response_ = host_->clock_->Now();
}
std::move(callback).Run(error, std::move(items));
}
static bool IsCloudSharedWithMeQuery(
const drivefs::mojom::QueryParametersPtr& query) {
return query->query_source ==
drivefs::mojom::QueryParameters::QuerySource::kCloudOnly &&
query->shared_with_me && !query->text_content && !query->title;
}
// Owns |this|.
DriveFsHost* const host_;
......@@ -498,6 +521,8 @@ class DriveFsHost::MountState
bool drivefs_has_terminated_ = false;
bool token_fetch_attempted_ = false;
base::Time last_shared_with_me_response_;
base::WeakPtrFactory<MountState> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(MountState);
......
......@@ -324,7 +324,9 @@ ACTION_P(RunQuitClosure, quit) {
class DriveFsHostTest : public ::testing::Test, public mojom::DriveFsBootstrap {
public:
DriveFsHostTest() : bootstrap_binding_(this), binding_(&mock_drivefs_) {}
DriveFsHostTest() : bootstrap_binding_(this), binding_(&mock_drivefs_) {
clock_.SetNow(base::Time::Now());
}
protected:
void SetUp() override {
......@@ -1295,5 +1297,85 @@ TEST_F(DriveFsHostTest, Search_OnlineToOfflineFallback) {
EXPECT_TRUE(called);
}
TEST_F(DriveFsHostTest, Search_SharedWithMeCaching) {
ASSERT_NO_FATAL_FAILURE(DoMount());
EXPECT_CALL(mock_drivefs_,
OnStartSearchQuery(
MatchQuery(mojom::QueryParameters::QuerySource::kCloudOnly,
nullptr, nullptr, true, false)))
.Times(2);
EXPECT_CALL(mock_drivefs_,
OnStartSearchQuery(
MatchQuery(mojom::QueryParameters::QuerySource::kLocalOnly,
nullptr, nullptr, true, false)))
.Times(1);
EXPECT_CALL(mock_drivefs_, OnGetNextPage(_))
.WillOnce(testing::DoAll(
PopulateSearch(3), testing::Return(drive::FileError::FILE_ERROR_OK)))
.WillOnce(testing::DoAll(
PopulateSearch(3), testing::Return(drive::FileError::FILE_ERROR_OK)))
.WillOnce(testing::DoAll(
PopulateSearch(3), testing::Return(drive::FileError::FILE_ERROR_OK)));
mojom::QueryParametersPtr params = mojom::QueryParameters::New();
params->query_source = mojom::QueryParameters::QuerySource::kCloudOnly;
params->shared_with_me = true;
bool called = false;
mojom::QueryParameters::QuerySource source = host_->PerformSearch(
std::move(params),
base::BindLambdaForTesting(
[&called](drive::FileError err,
base::Optional<std::vector<mojom::QueryItemPtr>> items) {
called = true;
EXPECT_EQ(drive::FileError::FILE_ERROR_OK, err);
EXPECT_EQ(3u, items->size());
}));
EXPECT_EQ(mojom::QueryParameters::QuerySource::kCloudOnly, source);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
params = mojom::QueryParameters::New();
params->query_source = mojom::QueryParameters::QuerySource::kCloudOnly;
params->shared_with_me = true;
called = false;
source = host_->PerformSearch(
std::move(params),
base::BindLambdaForTesting(
[&called](drive::FileError err,
base::Optional<std::vector<mojom::QueryItemPtr>> items) {
called = true;
EXPECT_EQ(drive::FileError::FILE_ERROR_OK, err);
EXPECT_EQ(3u, items->size());
}));
EXPECT_EQ(mojom::QueryParameters::QuerySource::kLocalOnly, source);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
// Time has passed...
clock_.Advance(base::TimeDelta::FromHours(1));
params = mojom::QueryParameters::New();
params->query_source = mojom::QueryParameters::QuerySource::kCloudOnly;
params->shared_with_me = true;
called = false;
source = host_->PerformSearch(
std::move(params),
base::BindLambdaForTesting(
[&called](drive::FileError err,
base::Optional<std::vector<mojom::QueryItemPtr>> items) {
called = true;
EXPECT_EQ(drive::FileError::FILE_ERROR_OK, err);
EXPECT_EQ(3u, items->size());
}));
EXPECT_EQ(mojom::QueryParameters::QuerySource::kCloudOnly, source);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
}
} // namespace
} // namespace drivefs
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