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

Side by Side Diff: components/precache/core/precache_fetcher.h

Issue 2403193002: Precache: Optionally rank resources-to-precache globally. (Closed)
Patch Set: Rebase. Created 4 years, 2 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef COMPONENTS_PRECACHE_CORE_PRECACHE_FETCHER_H_ 5 #ifndef COMPONENTS_PRECACHE_CORE_PRECACHE_FETCHER_H_
6 #define COMPONENTS_PRECACHE_CORE_PRECACHE_FETCHER_H_ 6 #define COMPONENTS_PRECACHE_CORE_PRECACHE_FETCHER_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <deque> 10 #include <deque>
11 #include <list>
11 #include <memory> 12 #include <memory>
12 #include <string> 13 #include <string>
13 #include <vector> 14 #include <vector>
14 15
15 #include "base/callback.h" 16 #include "base/callback.h"
16 #include "base/macros.h" 17 #include "base/macros.h"
17 #include "base/memory/ref_counted.h" 18 #include "base/memory/ref_counted.h"
18 #include "base/memory/weak_ptr.h" 19 #include "base/memory/weak_ptr.h"
19 #include "base/single_thread_task_runner.h" 20 #include "base/single_thread_task_runner.h"
20 #include "base/time/time.h" 21 #include "base/time/time.h"
(...skipping 12 matching lines...) Expand all
33 } 34 }
34 35
35 namespace precache { 36 namespace precache {
36 37
37 class PrecacheConfigurationSettings; 38 class PrecacheConfigurationSettings;
38 class PrecacheDatabase; 39 class PrecacheDatabase;
39 class PrecacheUnfinishedWork; 40 class PrecacheUnfinishedWork;
40 41
41 // Visible for testing. 42 // Visible for testing.
42 extern const int kNoTracking; 43 extern const int kNoTracking;
44 extern const int kMaxParallelFetches;
43 45
44 // Contains the information about manifest for a host. 46 // Information about the manifest for a host.
45 struct ManifestHostInfo { 47 struct ManifestHostInfo {
46 ManifestHostInfo(int64_t manifest_id, 48 ManifestHostInfo(int64_t manifest_id,
47 const std::string& hostname, 49 const std::string& hostname,
50 int64_t visits,
48 const std::string& used_url_hash, 51 const std::string& used_url_hash,
49 const std::string& unused_url_hash); 52 const std::string& unused_url_hash);
53 ~ManifestHostInfo();
50 ManifestHostInfo(ManifestHostInfo&&); 54 ManifestHostInfo(ManifestHostInfo&&);
51 ManifestHostInfo& operator=(ManifestHostInfo&&); 55 ManifestHostInfo& operator=(ManifestHostInfo&&);
52 56 // Copy constructor and assignment operator are implicitly deleted.
53 ~ManifestHostInfo();
54 57
55 int64_t manifest_id; 58 int64_t manifest_id;
56 std::string hostname; 59 std::string hostname;
57 GURL manifest_url; 60 GURL manifest_url;
61 int64_t visits;
58 std::string used_url_hash; 62 std::string used_url_hash;
59 std::string unused_url_hash; 63 std::string unused_url_hash;
60 }; 64 };
61 65
66 // Information about a resource to be downloaded.
67 struct ResourceInfo {
68 ResourceInfo(const GURL& url, const std::string& referrer, double weight);
69 ~ResourceInfo();
70 ResourceInfo(ResourceInfo&&);
71 ResourceInfo& operator=(ResourceInfo&&);
72 // Copy constructor and assignment operator are implicitly deleted.
73
74 GURL url; // The resource being requested.
75 std::string referrer; // The host of the manifest requesting this resource.
76 double weight; // Estimate of the expected utility of this resource.
77 };
78
62 // Public interface to code that fetches resources that the user is likely to 79 // Public interface to code that fetches resources that the user is likely to
63 // want to fetch in the future, putting them in the network stack disk cache. 80 // want to fetch in the future, putting them in the network stack disk cache.
64 // Precaching is intended to be done when Chrome is not actively in use, likely 81 // Precaching is intended to be done when Chrome is not actively in use, likely
65 // hours ahead of the time when the resources are actually needed. 82 // hours ahead of the time when the resources are actually needed.
66 // 83 //
67 // This class takes as input a prioritized list of URL domains that the user 84 // This class takes as input a prioritized list of URL domains that the user
68 // commonly visits, referred to as starting hosts. This class interacts with a 85 // commonly visits, referred to as starting hosts. This class interacts with a
69 // server, sending it the list of starting hosts sequentially. For each starting 86 // server, sending it the list of starting hosts sequentially. For each starting
70 // host, the server returns a manifest of resource URLs that are good candidates 87 // host, the server returns a manifest of resource URLs that are good candidates
71 // for precaching. Every resource returned is fetched, and responses are cached 88 // for precaching. Every resource returned is fetched, and responses are cached
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 // std::unique_ptr<PrecacheFetcher> fetcher_; 120 // std::unique_ptr<PrecacheFetcher> fetcher_;
104 // }; 121 // };
105 class PrecacheFetcher : public base::SupportsWeakPtr<PrecacheFetcher> { 122 class PrecacheFetcher : public base::SupportsWeakPtr<PrecacheFetcher> {
106 public: 123 public:
107 class PrecacheDelegate { 124 class PrecacheDelegate {
108 public: 125 public:
109 // Called when the fetching of resources has finished, whether the resources 126 // Called when the fetching of resources has finished, whether the resources
110 // were fetched or not. If the PrecacheFetcher is destroyed before OnDone is 127 // were fetched or not. If the PrecacheFetcher is destroyed before OnDone is
111 // called, then precaching will be canceled and OnDone will not be called. 128 // called, then precaching will be canceled and OnDone will not be called.
112 virtual void OnDone() = 0; 129 virtual void OnDone() = 0;
113
114 }; 130 };
115 131
116 // Visible for testing. 132 // Visible for testing.
117 class Fetcher; 133 class Fetcher;
118 134
119 static void RecordCompletionStatistics( 135 static void RecordCompletionStatistics(
120 const PrecacheUnfinishedWork& unfinished_work, 136 const PrecacheUnfinishedWork& unfinished_work,
121 size_t remaining_manifest_urls_to_fetch, 137 size_t remaining_manifest_urls_to_fetch,
122 size_t remaining_resource_urls_to_fetch); 138 size_t remaining_resource_urls_to_fetch);
123 139
(...skipping 21 matching lines...) Expand all
145 // be called from any thread. Start should only be called once on a 161 // be called from any thread. Start should only be called once on a
146 // PrecacheFetcher instance. 162 // PrecacheFetcher instance.
147 void Start(); 163 void Start();
148 164
149 // Stops all precaching work. The PreacheFetcher should not be used after 165 // Stops all precaching work. The PreacheFetcher should not be used after
150 // calling this method. 166 // calling this method.
151 std::unique_ptr<PrecacheUnfinishedWork> CancelPrecaching(); 167 std::unique_ptr<PrecacheUnfinishedWork> CancelPrecaching();
152 168
153 private: 169 private:
154 friend class PrecacheFetcherTest; 170 friend class PrecacheFetcherTest;
171 FRIEND_TEST_ALL_PREFIXES(PrecacheFetcherTest,
172 GloballyRankResourcesAfterPauseResume);
155 FRIEND_TEST_ALL_PREFIXES(PrecacheFetcherTest, FetcherPoolMaxLimitReached); 173 FRIEND_TEST_ALL_PREFIXES(PrecacheFetcherTest, FetcherPoolMaxLimitReached);
156 FRIEND_TEST_ALL_PREFIXES(PrecacheFetcherTest, 174 FRIEND_TEST_ALL_PREFIXES(PrecacheFetcherTest,
157 CancelPrecachingAfterAllManifestFetch); 175 CancelPrecachingAfterAllManifestFetch);
158 FRIEND_TEST_ALL_PREFIXES(PrecacheFetcherTest, DailyQuota); 176 FRIEND_TEST_ALL_PREFIXES(PrecacheFetcherTest, DailyQuota);
159 177
160 // Notifies the precache delete that precaching is done, and report 178 // Notifies the precache delete that precaching is done, and report
161 // completion statistics. 179 // completion statistics.
162 void NotifyDone(size_t remaining_manifest_urls_to_fetch, 180 void NotifyDone(size_t remaining_manifest_urls_to_fetch,
163 size_t remaining_resource_urls_to_fetch); 181 size_t remaining_resource_urls_to_fetch);
164 182
165 // Fetches the next resource or manifest URL, if any remain. Fetching is done 183 // Fetches the next resource or manifest URL, if any remain. Fetching is done
166 // sequentially and depth-first: all resources are fetched for a manifest 184 // sequentially and depth-first: all resources are fetched for a manifest
167 // before the next manifest is fetched. This is done to limit the length of 185 // before the next manifest is fetched. This is done to limit the length of
168 // the |resource_urls_to_fetch_| list, reducing the memory usage. 186 // the |resource_urls_to_fetch_| list, reducing the memory usage.
169 void StartNextFetch(); 187 void StartNextFetch();
170 188
171 void StartNextManifestFetch(); 189 void StartNextManifestFetches();
172 void StartNextResourceFetch(); 190 void StartNextResourceFetch();
173 191
174 // Called when the precache configuration settings have been fetched. 192 // Called when the precache configuration settings have been fetched.
175 // Determines the list of manifest URLs to fetch according to the list of 193 // Determines the list of manifest URLs to fetch according to the list of
176 // |starting_hosts_| and information from the precache configuration settings. 194 // |starting_hosts_| and information from the precache configuration settings.
177 // If the fetch of the configuration settings fails, then precaching ends. 195 // If the fetch of the configuration settings fails, then precaching ends.
178 void OnConfigFetchComplete(const Fetcher& source); 196 void OnConfigFetchComplete(const Fetcher& source);
179 197
180 // Constructs manifest URLs using a manifest URL prefix, and lists of hosts. 198 // Constructs manifest URLs using a manifest URL prefix, and lists of hosts.
181 void DetermineManifests(); 199 void DetermineManifests();
182 200
183 // Called when a precache manifest has been fetched. Builds the list of 201 // Called when a precache manifest has been fetched. Builds the list of
184 // resource URLs to fetch according to the URLs in the manifest. If the fetch 202 // resource URLs to fetch according to the URLs in the manifest. If the fetch
185 // of a manifest fails, then it skips to the next manifest. 203 // of a manifest fails, then it skips to the next manifest.
186 void OnManifestFetchComplete(const Fetcher& source); 204 void OnManifestFetchComplete(int64_t host_visits, const Fetcher& source);
205
206 // Moves the pending resource URLs into the to-be-fetched queue, and sorts and
207 // truncates if specified by the PrecacheConfigurationSettings. Called by
208 // OnManifestFetchComplete after the last manifest is fetched, so that
209 // StartNextFetch will begin fetching resource URLs.
210 void QueueResourcesForFetch();
187 211
188 // Called when a resource has been fetched. 212 // Called when a resource has been fetched.
189 void OnResourceFetchComplete(const Fetcher& source); 213 void OnResourceFetchComplete(const Fetcher& source);
190 214
191 // Adds up the response sizes. 215 // Adds up the response sizes.
192 void UpdateStats(int64_t response_bytes, int64_t network_response_bytes); 216 void UpdateStats(int64_t response_bytes, int64_t network_response_bytes);
193 217
194 // Callback invoked when the manifest info for all the top hosts is retrieved. 218 // Callback invoked when the manifest info for all the top hosts is retrieved.
195 void OnManifestInfoRetrieved(std::deque<ManifestHostInfo> manifests_info); 219 void OnManifestInfoRetrieved(std::deque<ManifestHostInfo> manifests_info);
196 220
(...skipping 11 matching lines...) Expand all
208 // default flag-specified prefix will be used. 232 // default flag-specified prefix will be used.
209 const std::string manifest_url_prefix_; 233 const std::string manifest_url_prefix_;
210 234
211 // PrecacheDatabase should be accessed on the DB thread. 235 // PrecacheDatabase should be accessed on the DB thread.
212 base::WeakPtr<PrecacheDatabase> precache_database_; 236 base::WeakPtr<PrecacheDatabase> precache_database_;
213 scoped_refptr<base::SingleThreadTaskRunner> db_task_runner_; 237 scoped_refptr<base::SingleThreadTaskRunner> db_task_runner_;
214 238
215 // Non-owning pointer. Should not be NULL. 239 // Non-owning pointer. Should not be NULL.
216 PrecacheDelegate* precache_delegate_; 240 PrecacheDelegate* precache_delegate_;
217 241
242 // Top hosts for which manifests still need to be fetched (i.e. no Fetcher has
243 // been created yet).
218 std::deque<ManifestHostInfo> top_hosts_to_fetch_; 244 std::deque<ManifestHostInfo> top_hosts_to_fetch_;
219 std::deque<std::pair<GURL, std::string>> resources_to_fetch_; 245
246 // Top hosts for which manifests are currently being fetched.
247 std::list<ManifestHostInfo> top_hosts_fetching_;
248
249 // Resources to be fetched, in desired fetch order. Populated only after
250 // manifest fetching is complete.
251 std::deque<ResourceInfo> resources_to_fetch_;
252
253 // Resources currently being fetched, in the order requested.
254 std::list<ResourceInfo> resources_fetching_;
255
256 // Resources to be fetched, not yet ranked. Valid until manifest fetching is
257 // done, after which resources are sorted and places in resources_to_fetch_.
258 std::deque<ResourceInfo> resources_to_rank_;
220 259
221 FetcherPool<Fetcher> pool_; 260 FetcherPool<Fetcher> pool_;
222 261
223 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work_; 262 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work_;
224 263
225 // Daily quota. 264 // Daily quota.
226 PrecacheQuota quota_; 265 PrecacheQuota quota_;
227 266
228 // The fieldtrial experiment ID. 267 // The fieldtrial experiment ID.
229 uint32_t experiment_id_; 268 uint32_t experiment_id_;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 int64_t response_bytes_; 336 int64_t response_bytes_;
298 int64_t network_response_bytes_; 337 int64_t network_response_bytes_;
299 bool was_cached_; 338 bool was_cached_;
300 339
301 DISALLOW_COPY_AND_ASSIGN(Fetcher); 340 DISALLOW_COPY_AND_ASSIGN(Fetcher);
302 }; 341 };
303 342
304 } // namespace precache 343 } // namespace precache
305 344
306 #endif // COMPONENTS_PRECACHE_CORE_PRECACHE_FETCHER_H_ 345 #endif // COMPONENTS_PRECACHE_CORE_PRECACHE_FETCHER_H_
OLDNEW
« no previous file with comments | « components/precache/content/precache_manager.cc ('k') | components/precache/core/precache_fetcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698