Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(461)

Unified Diff: components/suggestions/suggestions_service.cc

Issue 766053010: SuggestionsService undo blacklist functionality. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: GetTimeUntilReadyForUpload should not return negative values Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/suggestions/suggestions_service.cc
diff --git a/components/suggestions/suggestions_service.cc b/components/suggestions/suggestions_service.cc
index 44e173be1a0d8006749eee2e4b6b5f0446a8b27a..07b310ae6c40641e8486b614c0befbc57a000c66 100644
--- a/components/suggestions/suggestions_service.cc
+++ b/components/suggestions/suggestions_service.cc
@@ -30,6 +30,8 @@
#include "url/gurl.h"
using base::CancelableClosure;
+using base::TimeDelta;
+using base::TimeTicks;
namespace suggestions {
@@ -74,17 +76,15 @@ void DispatchRequestsAndClear(
}
}
-// Default delay used when scheduling a blacklist request.
-const int kBlacklistDefaultDelaySec = 1;
+// Default delay used when scheduling a request.
+const TimeDelta kDefaultSchedulingDelay = TimeDelta::FromSeconds(1);
Mathieu 2014/12/04 18:53:32 consider having a const int and rather initialize
manzagop (departed) 2014/12/05 15:13:22 Done. Went with local variables.
-// Multiplier on the delay used when scheduling a blacklist request, in case the
-// last observed request was unsuccessful.
-const int kBlacklistBackoffMultiplier = 2;
+// Multiplier on the delay used when re-scheduling a failed request.
+const int kSchedulingBackoffMultiplier = 2;
// Maximum valid delay for scheduling a request. Candidate delays larger than
-// this are rejected. This means the maximum backoff is at least 300 / 2, i.e.
-// 2.5 minutes.
-const int kBlacklistMaxDelaySec = 300; // 5 minutes
+// this are rejected. This means the maximum backoff is at least 5 / 2 minutes.
+const TimeDelta kSchedulingMaxDelaySec = TimeDelta::FromMinutes(5);
} // namespace
@@ -110,7 +110,7 @@ SuggestionsService::SuggestionsService(
suggestions_store_(suggestions_store.Pass()),
thumbnail_manager_(thumbnail_manager.Pass()),
blacklist_store_(blacklist_store.Pass()),
- blacklist_delay_sec_(kBlacklistDefaultDelaySec),
+ scheduling_delay_(kDefaultSchedulingDelay),
suggestions_url_(kSuggestionsURL),
blacklist_url_prefix_(kSuggestionsBlacklistURLPrefix),
weak_ptr_factory_(this) {}
@@ -154,21 +154,38 @@ void SuggestionsService::GetPageThumbnail(
void SuggestionsService::BlacklistURL(
const GURL& candidate_url,
- const SuggestionsService::ResponseCallback& callback) {
+ const SuggestionsService::ResponseCallback& callback,
+ const base::Closure& fail_callback) {
DCHECK(thread_checker_.CalledOnValidThread());
- waiting_requestors_.push_back(callback);
- // Blacklist locally for immediate effect and serve the requestors.
- blacklist_store_->BlacklistUrl(candidate_url);
+ if (!blacklist_store_->BlacklistUrl(candidate_url)) {
+ fail_callback.Run();
+ return;
+ }
+
+ waiting_requestors_.push_back(callback);
ServeFromCache();
+ if (!pending_request_.get()) {
Mathieu 2014/12/04 18:53:33 put comment above here, mentioning why we only sch
manzagop (departed) 2014/12/05 15:13:22 Done.
+ ScheduleBlacklistUpload();
+ }
+}
- // Send blacklisting request. Even if this request ends up not being sent
- // because of an ongoing request, a blacklist request is later scheduled.
- // TODO(mathp): Currently, this will not send a request if there is already
- // a request in flight (for suggestions or blacklist). Should we prioritize
- // blacklist requests since they actually carry a payload?
- IssueRequestIfNoneOngoing(
- BuildBlacklistRequestURL(blacklist_url_prefix_, candidate_url));
+void SuggestionsService::UndoBlacklistURL(
+ const GURL& url,
+ const SuggestionsService::ResponseCallback& callback,
+ const base::Closure& fail_callback) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ TimeDelta time_delta;
+ if (blacklist_store_->GetTimeUntilReadyForUpload(url, &time_delta) &&
+ time_delta > TimeDelta::FromSeconds(0) &&
+ blacklist_store_->RemoveUrl(url)) {
+ // The URL was in the blacklist without being ready for upload and was
Mathieu 2014/12/04 18:53:32 // The URL was not yet uploaded to the server and
manzagop (departed) 2014/12/05 15:13:22 Changed it, though not quite to what you propose b
+ // successfully removed.
+ waiting_requestors_.push_back(callback);
+ ServeFromCache();
+ return;
+ }
+ fail_callback.Run();
}
// static
@@ -219,7 +236,7 @@ void SuggestionsService::IssueRequestIfNoneOngoing(const GURL& url) {
}
pending_request_.reset(CreateSuggestionsRequest(url));
pending_request_->Start();
- last_request_started_time_ = base::TimeTicks::Now();
+ last_request_started_time_ = TimeTicks::Now();
}
net::URLFetcher* SuggestionsService::CreateSuggestionsRequest(const GURL& url) {
@@ -251,7 +268,8 @@ void SuggestionsService::OnURLFetchComplete(const net::URLFetcher* source) {
DVLOG(1) << "Suggestions server request failed with error: "
<< request_status.error() << ": "
<< net::ErrorToString(request_status.error());
- ScheduleBlacklistUpload(false);
+ UpdateBlacklistDelay(false);
+ ScheduleBlacklistUpload();
return;
}
@@ -261,12 +279,12 @@ void SuggestionsService::OnURLFetchComplete(const net::URLFetcher* source) {
// A non-200 response code means that server has no (longer) suggestions for
// this user. Aggressively clear the cache.
suggestions_store_->ClearSuggestions();
- ScheduleBlacklistUpload(false);
+ UpdateBlacklistDelay(false);
+ ScheduleBlacklistUpload();
return;
}
- const base::TimeDelta latency =
- base::TimeTicks::Now() - last_request_started_time_;
+ const TimeDelta latency = TimeTicks::Now() - last_request_started_time_;
UMA_HISTOGRAM_MEDIUM_TIMES("Suggestions.FetchSuccessLatency", latency);
// Handle a successful blacklisting.
@@ -295,7 +313,8 @@ void SuggestionsService::OnURLFetchComplete(const net::URLFetcher* source) {
LogResponseState(RESPONSE_INVALID);
}
- ScheduleBlacklistUpload(true);
+ UpdateBlacklistDelay(true);
+ ScheduleBlacklistUpload();
}
void SuggestionsService::Shutdown() {
@@ -317,20 +336,16 @@ void SuggestionsService::FilterAndServe(SuggestionsProfile* suggestions) {
DispatchRequestsAndClear(*suggestions, &waiting_requestors_);
}
-void SuggestionsService::ScheduleBlacklistUpload(bool last_request_successful) {
+void SuggestionsService::ScheduleBlacklistUpload() {
DCHECK(thread_checker_.CalledOnValidThread());
-
- UpdateBlacklistDelay(last_request_successful);
-
- // Schedule a blacklist upload task.
- GURL blacklist_url;
- if (blacklist_store_->GetFirstUrlFromBlacklist(&blacklist_url)) {
+ TimeDelta time_delta;
+ if (blacklist_store_->GetTimeUntilReadyForUpload(&time_delta)) {
+ // Blacklist cache is not empty: schedule.
base::Closure blacklist_cb =
base::Bind(&SuggestionsService::UploadOneFromBlacklist,
weak_ptr_factory_.GetWeakPtr());
base::MessageLoopProxy::current()->PostDelayedTask(
- FROM_HERE, blacklist_cb,
- base::TimeDelta::FromSeconds(blacklist_delay_sec_));
+ FROM_HERE, blacklist_cb, time_delta + scheduling_delay_);
}
}
@@ -338,24 +353,29 @@ void SuggestionsService::UploadOneFromBlacklist() {
DCHECK(thread_checker_.CalledOnValidThread());
GURL blacklist_url;
- if (!blacklist_store_->GetFirstUrlFromBlacklist(&blacklist_url))
- return; // Local blacklist is empty.
+ if (blacklist_store_->GetCandidateForUpload(&blacklist_url)) {
+ // Issue a blacklisting request. Even if this request ends up not being sent
+ // because of an ongoing request, a blacklist request is later scheduled.
+ IssueRequestIfNoneOngoing(
+ BuildBlacklistRequestURL(blacklist_url_prefix_, blacklist_url));
+ return;
+ }
- // Send blacklisting request. Even if this request ends up not being sent
- // because of an ongoing request, a blacklist request is later scheduled.
- IssueRequestIfNoneOngoing(
- BuildBlacklistRequestURL(blacklist_url_prefix_, blacklist_url));
+ // Even though there's no candidate for upload, the blacklist might not be
+ // empty.
+ ScheduleBlacklistUpload();
}
void SuggestionsService::UpdateBlacklistDelay(bool last_request_successful) {
DCHECK(thread_checker_.CalledOnValidThread());
if (last_request_successful) {
- blacklist_delay_sec_ = kBlacklistDefaultDelaySec;
+ scheduling_delay_ = kDefaultSchedulingDelay;
} else {
- int candidate_delay = blacklist_delay_sec_ * kBlacklistBackoffMultiplier;
- if (candidate_delay < kBlacklistMaxDelaySec)
- blacklist_delay_sec_ = candidate_delay;
+ TimeDelta candidate_delay =
+ scheduling_delay_ * kSchedulingBackoffMultiplier;
+ if (candidate_delay < kSchedulingMaxDelaySec)
+ scheduling_delay_ = candidate_delay;
}
}

Powered by Google App Engine
This is Rietveld 408576698