Commit 30d51c39 authored by Yao Xiao's avatar Yao Xiao Committed by Commit Bot

Set a pending recompute event to run after the in-progress one finishes

Why: Before this patch we'd ignore any recompute event coming during
an in-progress computation. That assumes the history query callback is
the last task to run before the computation completes. However, since
we are going to add SortingLSH based computation after the history
callback, and the check (i.e. file read) is async, the original
assumption no longer holds. And there could be races.

What: This CL handles of recompute that comes during an in-progress
computation. We'll use a member variable to keep track of the last
recompute event (trigger) that we weren't able to handle. After the
current one completes, we'll ignore its result, and we'll recompute
again using that pending trigger.


Bug: 1062736
Change-Id: I3e30d26d47352480faa39494b0f6b4171f361456
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2437782Reviewed-by: default avatarJosh Karlin <jkarlin@chromium.org>
Commit-Queue: Yao Xiao <yaoxia@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811827}
parent fdaf667d
...@@ -332,7 +332,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest, ...@@ -332,7 +332,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest,
EXPECT_EQ(1u, GetHistoryUrls().size()); EXPECT_EQ(1u, GetHistoryUrls().size());
EXPECT_EQ(GetFlocId().ToDebugHeaderValue(), FlocId().ToDebugHeaderValue()); EXPECT_EQ(GetFlocId(), FlocId());
InitializeBlocklist({}); InitializeBlocklist({});
...@@ -362,7 +362,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest, ...@@ -362,7 +362,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest,
EXPECT_EQ(1u, GetHistoryUrls().size()); EXPECT_EQ(1u, GetHistoryUrls().size());
EXPECT_EQ(GetFlocId().ToDebugHeaderValue(), FlocId().ToDebugHeaderValue()); EXPECT_EQ(GetFlocId(), FlocId());
InitializeBlocklist({}); InitializeBlocklist({});
...@@ -382,7 +382,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest, ...@@ -382,7 +382,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest,
EXPECT_EQ(1u, GetHistoryUrls().size()); EXPECT_EQ(1u, GetHistoryUrls().size());
EXPECT_EQ(GetFlocId().ToDebugHeaderValue(), FlocId().ToDebugHeaderValue()); EXPECT_EQ(GetFlocId(), FlocId());
InitializeBlocklist({}); InitializeBlocklist({});
...@@ -419,7 +419,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest, ...@@ -419,7 +419,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest,
EXPECT_EQ(1u, GetHistoryUrls().size()); EXPECT_EQ(1u, GetHistoryUrls().size());
EXPECT_EQ(GetFlocId().ToDebugHeaderValue(), FlocId().ToDebugHeaderValue()); EXPECT_EQ(GetFlocId(), FlocId());
// Load a blocklist that would block the upcoming floc. // Load a blocklist that would block the upcoming floc.
InitializeBlocklist({FlocId::CreateFromHistory({test_host()}).ToUint64()}); InitializeBlocklist({FlocId::CreateFromHistory({test_host()}).ToUint64()});
...@@ -440,7 +440,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest, ...@@ -440,7 +440,7 @@ IN_PROC_BROWSER_TEST_F(FlocIdProviderWithCustomizedServicesBrowserTest,
EXPECT_EQ(1u, GetHistoryUrls().size()); EXPECT_EQ(1u, GetHistoryUrls().size());
EXPECT_EQ(GetFlocId().ToDebugHeaderValue(), FlocId().ToDebugHeaderValue()); EXPECT_EQ(GetFlocId(), FlocId());
// Load a blocklist that would block a floc different from the upcoming floc. // Load a blocklist that would block a floc different from the upcoming floc.
InitializeBlocklist({FlocId::CreateFromHistory({"b.test"}).ToUint64()}); InitializeBlocklist({FlocId::CreateFromHistory({"b.test"}).ToUint64()});
......
...@@ -75,10 +75,9 @@ class FlocIdProviderImpl : public FlocIdProvider, ...@@ -75,10 +75,9 @@ class FlocIdProviderImpl : public FlocIdProvider,
protected: protected:
// protected virtual for testing. // protected virtual for testing.
virtual void OnComputeFlocCompleted(ComputeFlocTrigger trigger,
FlocId floc_id);
virtual void NotifyFlocUpdated(ComputeFlocTrigger trigger); virtual void NotifyFlocUpdated(ComputeFlocTrigger trigger);
virtual bool IsSyncHistoryEnabled() const;
virtual bool AreThirdPartyCookiesAllowed() const;
virtual void IsSwaaNacAccountEnabled(CanComputeFlocCallback callback);
private: private:
friend class FlocIdProviderUnitTest; friend class FlocIdProviderUnitTest;
...@@ -102,13 +101,18 @@ class FlocIdProviderImpl : public FlocIdProvider, ...@@ -102,13 +101,18 @@ class FlocIdProviderImpl : public FlocIdProvider,
void MaybeTriggerFirstFlocComputation(); void MaybeTriggerFirstFlocComputation();
void OnComputeFlocScheduledUpdate();
void ComputeFloc(ComputeFlocTrigger trigger); void ComputeFloc(ComputeFlocTrigger trigger);
void OnComputeFlocCompleted(ComputeFlocTrigger trigger, FlocId floc_id);
void CheckCanComputeFloc(CanComputeFlocCallback callback); void CheckCanComputeFloc(CanComputeFlocCallback callback);
void OnCheckCanComputeFlocCompleted(ComputeFlocCompletedCallback callback, void OnCheckCanComputeFlocCompleted(ComputeFlocCompletedCallback callback,
bool can_compute_floc); bool can_compute_floc);
bool IsSyncHistoryEnabled() const;
bool AreThirdPartyCookiesAllowed() const;
void IsSwaaNacAccountEnabled(CanComputeFlocCallback callback);
void OnCheckSwaaNacAccountEnabledCompleted(CanComputeFlocCallback callback, void OnCheckSwaaNacAccountEnabledCompleted(CanComputeFlocCallback callback,
bool enabled); bool enabled);
...@@ -116,10 +120,20 @@ class FlocIdProviderImpl : public FlocIdProvider, ...@@ -116,10 +120,20 @@ class FlocIdProviderImpl : public FlocIdProvider,
void OnGetRecentlyVisitedURLsCompleted(ComputeFlocCompletedCallback callback, void OnGetRecentlyVisitedURLsCompleted(ComputeFlocCompletedCallback callback,
history::QueryResults results); history::QueryResults results);
// Apply any additional filtering or transformation on a floc computed from
// history. For example, invalidate it if it's in the blocklist.
void ApplyAdditionalFiltering(ComputeFlocCompletedCallback callback,
const FlocId& floc_id);
FlocId floc_id_; FlocId floc_id_;
bool floc_computation_in_progress_ = false; bool floc_computation_in_progress_ = false;
bool first_floc_computation_triggered_ = false; bool first_floc_computation_triggered_ = false;
// We store a pending event if it arrives during an in-progress computation.
// When the in-progress one finishes, we would disregard the result (no
// loggings, updates, etc.), and compute again.
base::Optional<ComputeFlocTrigger> pending_recompute_event_;
bool first_blocklist_loaded_seen_ = false; bool first_blocklist_loaded_seen_ = false;
bool first_sync_history_enabled_seen_ = false; bool first_sync_history_enabled_seen_ = false;
......
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