Index: chrome/browser/url_fetcher_protect.h |
=================================================================== |
--- chrome/browser/url_fetcher_protect.h (revision 8164) |
+++ chrome/browser/url_fetcher_protect.h (working copy) |
@@ -1,145 +0,0 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
-// |
-// This file implements backoff in the suggest system so that we don't |
-// DOS the Suggest servers when using URLFetcher. |
- |
-#ifndef CHROME_BROWSER_URL_FETCHER_PROTECT_H__ |
-#define CHROME_BROWSER_URL_FETCHER_PROTECT_H__ |
- |
-#include <map> |
-#include <queue> |
-#include <string> |
- |
-#include "base/lock.h" |
-#include "base/logging.h" |
-#include "base/scoped_ptr.h" |
-#include "base/time.h" |
- |
- |
-// This class is used to manage one service's rate protection. It maintains |
-// a queue of connection successes and failures and analyzes the requests |
-// over some period of time, in order to deduce the backoff time of every |
-// request. |
-// The backoff algorithm consists of two parts. Firstly, avoid too many |
-// send events in a sliding window. That will prevent traffic overload. |
-// Secondly, exponential backoff is used when receiving an error message |
-// from server. Exponential backoff period is calculated using the following |
-// formula: |
-// |
-// initial backoff time (the first time to receive error) |
-// backoff = k * current_backoff + c (the second, third, ... error) |
-// maximum backoff time (when backoff > maximum backoff time) |
-// |
-// where |k| is the multiplier, and |c| is the constant factor. |
-class URLFetcherProtectEntry { |
- public: |
- enum EventType { |
- SEND, // request will be sent out |
- SUCCESS, // successful response |
- FAILURE // no response or error |
- }; |
- |
- URLFetcherProtectEntry(); |
- URLFetcherProtectEntry(int sliding_window_period, int max_send_threshold, |
- int max_retries, int initial_timeout, |
- double multiplier, int constant_factor, |
- int maximum_timeout); |
- |
- |
- virtual ~URLFetcherProtectEntry() { } |
- |
- // When a connection event happens, log it to the queue, and recalculate |
- // the timeout period. It returns the backoff time, in milliseconds, that |
- // indicates to the sender how long should it wait before sending the request. |
- // If the request is allowed to be sent immediately, the backoff time is 0. |
- int UpdateBackoff(EventType event_type); |
- |
- // Returns the max retries allowed. |
- int max_retries() const { |
- return max_retries_; |
- } |
- |
- private: |
- // When a request comes, calculate the release time for it. |
- // Returns the backoff time before sending. |
- base::TimeDelta AntiOverload(); |
- // Resets backoff when service is ok. |
- // Returns the backoff time before sending. |
- base::TimeDelta ResetBackoff(); |
- // Calculates new backoff when encountering a failure. |
- // Returns the backoff time before sending. |
- base::TimeDelta IncreaseBackoff(); |
- |
- // Default parameters. Time is in milliseconds. |
- static const int kDefaultSlidingWindowPeriod; |
- static const int kDefaultMaxSendThreshold; |
- static const int kDefaultMaxRetries; |
- static const int kDefaultInitialTimeout; |
- static const double kDefaultMultiplier; |
- static const int kDefaultConstantFactor; |
- static const int kDefaultMaximumTimeout; |
- |
- // time to consider events when checking backoff |
- int sliding_window_period_; |
- |
- // maximum number of requests allowed in sliding window period |
- int max_send_threshold_; |
- // maximum retris allowed |
- int max_retries_; |
- |
- // initial timeout on first failure |
- int initial_timeout_; |
- // factor by which to multiply on exponential backoff (e.g., 2.0) |
- double multiplier_; |
- // constant time term to add to each attempt |
- int constant_factor_; |
- // maximum amount of time between requests |
- int maximum_timeout_; |
- |
- // current exponential backoff period |
- int timeout_period_; |
- // time that protection is scheduled to end |
- base::TimeTicks release_time_; |
- |
- // Sets up a lock to ensure thread safe. |
- Lock lock_; |
- |
- // A list of the recent send events. We ues them to decide whether |
- // there are too many requests sent in sliding window. |
- std::queue<base::TimeTicks> send_log_; |
- |
- DISALLOW_COPY_AND_ASSIGN(URLFetcherProtectEntry); |
-}; |
- |
- |
-// This singleton class is used to manage all protect entries. |
-// Now we use the host name as service id. |
-class URLFetcherProtectManager { |
- public: |
- ~URLFetcherProtectManager(); |
- |
- // Returns the global instance of this class. |
- static URLFetcherProtectManager* GetInstance(); |
- |
- // Registers a new entry in this service. If the entry already exists, |
- // just returns it. |
- URLFetcherProtectEntry* Register(std::string id); |
- // Always registers the entry even when it exists. |
- URLFetcherProtectEntry* Register(std::string id, |
- URLFetcherProtectEntry* entry); |
- |
- private: |
- URLFetcherProtectManager() { } |
- |
- typedef std::map<const std::string, URLFetcherProtectEntry*> ProtectService; |
- |
- static Lock lock_; |
- static scoped_ptr<URLFetcherProtectManager> protect_manager_; |
- ProtectService services_; |
- |
- DISALLOW_COPY_AND_ASSIGN(URLFetcherProtectManager); |
-}; |
- |
-#endif // CHROME_BROWSER_URL_FETCHER_PROTECT_H__ |