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

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

Issue 2711473006: Add Precache.Fetch.MinWeight UMA. (Closed)
Patch Set: Track min_weight_fetched in unfinished_work, and add tests. Created 3 years, 10 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 #include "components/precache/core/precache_fetcher.h" 5 #include "components/precache/core/precache_fetcher.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 num_total_resources)); 412 num_total_resources));
413 413
414 UMA_HISTOGRAM_PERCENTAGE("Precache.Fetch.PercentCompleted", 414 UMA_HISTOGRAM_PERCENTAGE("Precache.Fetch.PercentCompleted",
415 percent_completed); 415 percent_completed);
416 UMA_HISTOGRAM_CUSTOM_COUNTS("Precache.Fetch.ResponseBytes.Total", 416 UMA_HISTOGRAM_CUSTOM_COUNTS("Precache.Fetch.ResponseBytes.Total",
417 unfinished_work.total_bytes(), 1, 417 unfinished_work.total_bytes(), 1,
418 kMaxResponseBytes, 100); 418 kMaxResponseBytes, 100);
419 UMA_HISTOGRAM_CUSTOM_COUNTS("Precache.Fetch.ResponseBytes.Network", 419 UMA_HISTOGRAM_CUSTOM_COUNTS("Precache.Fetch.ResponseBytes.Network",
420 unfinished_work.network_bytes(), 1, 420 unfinished_work.network_bytes(), 1,
421 kMaxResponseBytes, 100); 421 kMaxResponseBytes, 100);
422
423 if (unfinished_work.has_min_weight_fetched()) {
424 UMA_HISTOGRAM_COUNTS_1000("Precache.Fetch.MinWeight",
425 unfinished_work.min_weight_fetched() * 1000);
426 }
422 } 427 }
423 428
424 // static 429 // static
425 std::string PrecacheFetcher::GetResourceURLBase64HashForTesting( 430 std::string PrecacheFetcher::GetResourceURLBase64HashForTesting(
426 const std::vector<GURL>& urls) { 431 const std::vector<GURL>& urls) {
427 return GetResourceURLBase64Hash(urls); 432 return GetResourceURLBase64Hash(urls);
428 } 433 }
429 434
430 PrecacheFetcher::PrecacheFetcher( 435 PrecacheFetcher::PrecacheFetcher(
431 net::URLRequestContextGetter* request_context, 436 net::URLRequestContextGetter* request_context,
(...skipping 19 matching lines...) Expand all
451 << "Could not determine the precache config settings URL."; 456 << "Could not determine the precache config settings URL.";
452 DCHECK_NE(std::string(), GetDefaultManifestURLPrefix()) 457 DCHECK_NE(std::string(), GetDefaultManifestURLPrefix())
453 << "Could not determine the default precache manifest URL prefix."; 458 << "Could not determine the default precache manifest URL prefix.";
454 DCHECK(unfinished_work); 459 DCHECK(unfinished_work);
455 460
456 // Copy resources to member variable as a convenience. 461 // Copy resources to member variable as a convenience.
457 // TODO(rajendrant): Consider accessing these directly from the proto, by 462 // TODO(rajendrant): Consider accessing these directly from the proto, by
458 // keeping track of the current resource index. 463 // keeping track of the current resource index.
459 for (const auto& resource : unfinished_work->resource()) { 464 for (const auto& resource : unfinished_work->resource()) {
460 if (resource.has_url() && resource.has_top_host_name()) { 465 if (resource.has_url() && resource.has_top_host_name()) {
461 // Weight doesn't matter, as the resources have already been sorted by 466 resources_to_fetch_.emplace_back(
462 // this point. 467 GURL(resource.url()), resource.top_host_name(), resource.weight());
463 resources_to_fetch_.emplace_back(GURL(resource.url()),
464 resource.top_host_name(), 0);
465 } 468 }
466 } 469 }
467 unfinished_work_ = std::move(unfinished_work); 470 unfinished_work_ = std::move(unfinished_work);
468 } 471 }
469 472
470 PrecacheFetcher::~PrecacheFetcher() { 473 PrecacheFetcher::~PrecacheFetcher() {
471 } 474 }
472 475
473 std::unique_ptr<PrecacheUnfinishedWork> PrecacheFetcher::CancelPrecaching() { 476 std::unique_ptr<PrecacheUnfinishedWork> PrecacheFetcher::CancelPrecaching() {
474 // This could get called multiple times, and it should be handled gracefully. 477 // This could get called multiple times, and it should be handled gracefully.
475 if (!unfinished_work_) 478 if (!unfinished_work_)
476 return nullptr; 479 return nullptr;
477 480
478 unfinished_work_->clear_resource(); 481 unfinished_work_->clear_resource();
479 if (unfinished_work_->has_config_settings()) { 482 if (unfinished_work_->has_config_settings()) {
480 // If config fetch is incomplete, |top_hosts_to_fetch_| will be empty and 483 // If config fetch is incomplete, |top_hosts_to_fetch_| will be empty and
481 // top hosts should be left as is in |unfinished_work_|. 484 // top hosts should be left as is in |unfinished_work_|.
482 unfinished_work_->clear_top_host(); 485 unfinished_work_->clear_top_host();
483 for (const auto& top_host : top_hosts_fetching_) 486 for (const auto& top_host : top_hosts_fetching_)
484 unfinished_work_->add_top_host()->set_hostname(top_host.hostname); 487 unfinished_work_->add_top_host()->set_hostname(top_host.hostname);
485 for (const auto& top_host : top_hosts_to_fetch_) 488 for (const auto& top_host : top_hosts_to_fetch_)
486 unfinished_work_->add_top_host()->set_hostname(top_host.hostname); 489 unfinished_work_->add_top_host()->set_hostname(top_host.hostname);
487 } 490 }
488 for (const auto& resource : resources_fetching_) { 491 for (const auto& resource : resources_fetching_) {
489 auto new_resource = unfinished_work_->add_resource(); 492 auto new_resource = unfinished_work_->add_resource();
490 new_resource->set_url(resource.url.spec()); 493 new_resource->set_url(resource.url.spec());
491 new_resource->set_top_host_name(resource.referrer); 494 new_resource->set_top_host_name(resource.referrer);
495 new_resource->set_weight(resource.weight);
492 } 496 }
493 for (const auto& resource : resources_to_fetch_) { 497 for (const auto& resource : resources_to_fetch_) {
494 auto new_resource = unfinished_work_->add_resource(); 498 auto new_resource = unfinished_work_->add_resource();
495 new_resource->set_url(resource.url.spec()); 499 new_resource->set_url(resource.url.spec());
496 new_resource->set_top_host_name(resource.referrer); 500 new_resource->set_top_host_name(resource.referrer);
501 new_resource->set_weight(resource.weight);
497 } 502 }
498 top_hosts_fetching_.clear(); 503 top_hosts_fetching_.clear();
499 top_hosts_to_fetch_.clear(); 504 top_hosts_to_fetch_.clear();
500 resources_fetching_.clear(); 505 resources_fetching_.clear();
501 resources_to_fetch_.clear(); 506 resources_to_fetch_.clear();
502 pool_.DeleteAll(); 507 pool_.DeleteAll();
503 return std::move(unfinished_work_); 508 return std::move(unfinished_work_);
504 } 509 }
505 510
506 void PrecacheFetcher::Start() { 511 void PrecacheFetcher::Start() {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 request_context_.get(), top_host.manifest_url, top_host.hostname, 559 request_context_.get(), top_host.manifest_url, top_host.hostname,
555 base::Bind(&PrecacheFetcher::OnManifestFetchComplete, AsWeakPtr(), 560 base::Bind(&PrecacheFetcher::OnManifestFetchComplete, AsWeakPtr(),
556 top_host.visits), 561 top_host.visits),
557 false /* is_resource_request */, std::numeric_limits<int32_t>::max(), 562 false /* is_resource_request */, std::numeric_limits<int32_t>::max(),
558 false /* revalidation_only */)); 563 false /* revalidation_only */));
559 top_hosts_fetching_.push_back(std::move(top_host)); 564 top_hosts_fetching_.push_back(std::move(top_host));
560 top_hosts_to_fetch_.pop_front(); 565 top_hosts_to_fetch_.pop_front();
561 } 566 }
562 } 567 }
563 568
564 void PrecacheFetcher::NotifyDone( 569 void PrecacheFetcher::NotifyDone(size_t remaining_manifest_urls_to_fetch,
565 size_t remaining_manifest_urls_to_fetch, 570 size_t remaining_resource_urls_to_fetch) {
566 size_t remaining_resource_urls_to_fetch) {
567 RecordCompletionStatistics(*unfinished_work_, 571 RecordCompletionStatistics(*unfinished_work_,
568 remaining_manifest_urls_to_fetch, 572 remaining_manifest_urls_to_fetch,
569 remaining_resource_urls_to_fetch); 573 remaining_resource_urls_to_fetch);
570 precache_delegate_->OnDone(); 574 precache_delegate_->OnDone();
571 } 575 }
572 576
573 void PrecacheFetcher::StartNextFetch() { 577 void PrecacheFetcher::StartNextFetch() {
574 DCHECK(unfinished_work_->has_config_settings()); 578 DCHECK(unfinished_work_->has_config_settings());
575 579
576 // If over the precache total size cap or daily quota, then stop prefetching. 580 // If over the precache total size cap or daily quota, then stop prefetching.
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 811
808 void PrecacheFetcher::OnResourceFetchComplete(const Fetcher& source) { 812 void PrecacheFetcher::OnResourceFetchComplete(const Fetcher& source) {
809 UpdateStats(source.response_bytes(), source.network_response_bytes()); 813 UpdateStats(source.response_bytes(), source.network_response_bytes());
810 814
811 db_task_runner_->PostTask( 815 db_task_runner_->PostTask(
812 FROM_HERE, 816 FROM_HERE,
813 base::Bind(&PrecacheDatabase::RecordURLPrefetch, precache_database_, 817 base::Bind(&PrecacheDatabase::RecordURLPrefetch, precache_database_,
814 source.url(), source.referrer(), base::Time::Now(), 818 source.url(), source.referrer(), base::Time::Now(),
815 source.was_cached(), source.response_bytes())); 819 source.was_cached(), source.response_bytes()));
816 820
817 resources_fetching_.remove_if([&source](const ResourceInfo& resource) { 821 auto resource =
818 return resource.url == source.url(); 822 std::find_if(resources_fetching_.begin(), resources_fetching_.end(),
819 }); 823 [&source](const ResourceInfo& resource) {
824 return resource.url == source.url();
825 });
826 if (resource != resources_fetching_.end()) {
827 if (unfinished_work_->config_settings().global_ranking() &&
828 (!unfinished_work_->has_min_weight_fetched() ||
829 resource->weight < unfinished_work_->min_weight_fetched()))
830 unfinished_work_->set_min_weight_fetched(resource->weight);
831
832 resources_fetching_.erase(resource);
833 }
820 834
821 pool_.Delete(source); 835 pool_.Delete(source);
822 836
823 // The resource has already been put in the cache during the fetch process, so 837 // The resource has already been put in the cache during the fetch process, so
824 // nothing more needs to be done for the resource. 838 // nothing more needs to be done for the resource.
825 StartNextFetch(); 839 StartNextFetch();
826 } 840 }
827 841
828 void PrecacheFetcher::UpdateStats(int64_t response_bytes, 842 void PrecacheFetcher::UpdateStats(int64_t response_bytes,
829 int64_t network_response_bytes) { 843 int64_t network_response_bytes) {
(...skipping 13 matching lines...) Expand all
843 remaining = 0; 857 remaining = 0;
844 quota_.set_remaining( 858 quota_.set_remaining(
845 used_bytes > quota_.remaining() ? 0U : quota_.remaining() - used_bytes); 859 used_bytes > quota_.remaining() ? 0U : quota_.remaining() - used_bytes);
846 db_task_runner_->PostTask( 860 db_task_runner_->PostTask(
847 FROM_HERE, 861 FROM_HERE,
848 base::Bind(&PrecacheDatabase::SaveQuota, precache_database_, quota_)); 862 base::Bind(&PrecacheDatabase::SaveQuota, precache_database_, quota_));
849 } 863 }
850 } 864 }
851 865
852 } // namespace precache 866 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698