OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #include "content/browser/download/parallel_download_job.h" | 5 #include "content/browser/download/parallel_download_job.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "content/browser/download/download_create_info.h" | 8 #include "content/browser/download/download_create_info.h" |
| 9 #include "content/browser/download/download_stats.h" |
9 #include "content/browser/download/parallel_download_utils.h" | 10 #include "content/browser/download/parallel_download_utils.h" |
10 #include "content/public/browser/browser_context.h" | 11 #include "content/public/browser/browser_context.h" |
11 #include "content/public/browser/storage_partition.h" | 12 #include "content/public/browser/storage_partition.h" |
12 | 13 |
13 namespace content { | 14 namespace content { |
14 namespace { | 15 namespace { |
15 | 16 |
16 const int kVerboseLevel = 1; | 17 const int kVerboseLevel = 1; |
17 | 18 |
18 } // namespace | 19 } // namespace |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 | 96 |
96 timer_.Start(FROM_HERE, GetParallelRequestDelayConfig(), this, | 97 timer_.Start(FROM_HERE, GetParallelRequestDelayConfig(), this, |
97 &ParallelDownloadJob::BuildParallelRequests); | 98 &ParallelDownloadJob::BuildParallelRequests); |
98 } | 99 } |
99 | 100 |
100 void ParallelDownloadJob::OnByteStreamReady( | 101 void ParallelDownloadJob::OnByteStreamReady( |
101 DownloadWorker* worker, | 102 DownloadWorker* worker, |
102 std::unique_ptr<ByteStreamReader> stream_reader) { | 103 std::unique_ptr<ByteStreamReader> stream_reader) { |
103 bool success = DownloadJob::AddByteStream(std::move(stream_reader), | 104 bool success = DownloadJob::AddByteStream(std::move(stream_reader), |
104 worker->offset(), worker->length()); | 105 worker->offset(), worker->length()); |
| 106 RecordParallelDownloadAddStreamSuccess(success); |
105 | 107 |
106 // Destroy the request if the sink is gone. | 108 // Destroy the request if the sink is gone. |
107 if (!success) { | 109 if (!success) { |
108 VLOG(kVerboseLevel) | 110 VLOG(kVerboseLevel) |
109 << "Byte stream arrived after download file is released."; | 111 << "Byte stream arrived after download file is released."; |
110 worker->Cancel(); | 112 worker->Cancel(); |
111 } | 113 } |
112 } | 114 } |
113 | 115 |
114 void ParallelDownloadJob::OnServerResponseError( | 116 void ParallelDownloadJob::OnServerResponseError( |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 DCHECK_EQ(slices_to_download.back().received_bytes, | 165 DCHECK_EQ(slices_to_download.back().received_bytes, |
164 DownloadSaveInfo::kLengthFullContent); | 166 DownloadSaveInfo::kLengthFullContent); |
165 | 167 |
166 ForkSubRequests(slices_to_download); | 168 ForkSubRequests(slices_to_download); |
167 requests_sent_ = true; | 169 requests_sent_ = true; |
168 } | 170 } |
169 | 171 |
170 void ParallelDownloadJob::ForkSubRequests( | 172 void ParallelDownloadJob::ForkSubRequests( |
171 const DownloadItem::ReceivedSlices& slices_to_download) { | 173 const DownloadItem::ReceivedSlices& slices_to_download) { |
172 bool initial_request_skipped = false; | 174 bool initial_request_skipped = false; |
| 175 int requests_num = 0; |
| 176 int early_requests_num = 0; |
| 177 |
173 for (auto it = slices_to_download.begin(); it != slices_to_download.end(); | 178 for (auto it = slices_to_download.begin(); it != slices_to_download.end(); |
174 ++it) { | 179 ++it) { |
175 // Create requests for holes before the |initial_request_offset_|. | 180 // Create requests for holes before the |initial_request_offset_|. |
176 if (it->offset < initial_request_offset_) { | 181 if (it->offset < initial_request_offset_) { |
177 CreateRequest(it->offset, it->received_bytes); | 182 CreateRequest(it->offset, it->received_bytes); |
| 183 early_requests_num++; |
| 184 requests_num++; |
178 continue; | 185 continue; |
179 } | 186 } |
180 | 187 |
181 // Assume the first slice to download after |initial_request_offset_| will | 188 // Assume the first slice to download after |initial_request_offset_| will |
182 // be handled by the initial request. | 189 // be handled by the initial request. |
183 if (initial_request_skipped) | 190 if (initial_request_skipped) { |
184 CreateRequest(it->offset, it->received_bytes); | 191 CreateRequest(it->offset, it->received_bytes); |
185 else | 192 requests_num++; |
| 193 } else |
186 initial_request_skipped = true; | 194 initial_request_skipped = true; |
187 } | 195 } |
| 196 |
| 197 RecordParallelDownloadRequestCount(requests_num + 1); |
| 198 if (early_requests_num > 0) |
| 199 RecordParallelDownloadEarlyRequests(early_requests_num); |
188 } | 200 } |
189 | 201 |
190 void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) { | 202 void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) { |
191 DCHECK(download_item_); | 203 DCHECK(download_item_); |
192 | 204 |
193 std::unique_ptr<DownloadWorker> worker = | 205 std::unique_ptr<DownloadWorker> worker = |
194 base::MakeUnique<DownloadWorker>(this, offset, length); | 206 base::MakeUnique<DownloadWorker>(this, offset, length); |
195 | 207 |
196 StoragePartition* storage_partition = | 208 StoragePartition* storage_partition = |
197 BrowserContext::GetStoragePartitionForSite( | 209 BrowserContext::GetStoragePartitionForSite( |
(...skipping 15 matching lines...) Expand all Loading... |
213 // download request. | 225 // download request. |
214 download_params->set_referrer(Referrer(download_item_->GetReferrerUrl(), | 226 download_params->set_referrer(Referrer(download_item_->GetReferrerUrl(), |
215 blink::WebReferrerPolicyAlways)); | 227 blink::WebReferrerPolicyAlways)); |
216 // Send the request. | 228 // Send the request. |
217 worker->SendRequest(std::move(download_params)); | 229 worker->SendRequest(std::move(download_params)); |
218 DCHECK(workers_.find(offset) == workers_.end()); | 230 DCHECK(workers_.find(offset) == workers_.end()); |
219 workers_[offset] = std::move(worker); | 231 workers_[offset] = std::move(worker); |
220 } | 232 } |
221 | 233 |
222 } // namespace content | 234 } // namespace content |
OLD | NEW |