OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "storage/browser/blob/blob_memory_controller.h" | 5 #include "storage/browser/blob/blob_memory_controller.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <numeric> | 8 #include <numeric> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 23 matching lines...) Expand all Loading... | |
34 #include "storage/browser/blob/shareable_file_reference.h" | 34 #include "storage/browser/blob/shareable_file_reference.h" |
35 #include "storage/common/data_element.h" | 35 #include "storage/common/data_element.h" |
36 | 36 |
37 using base::File; | 37 using base::File; |
38 using base::FilePath; | 38 using base::FilePath; |
39 | 39 |
40 namespace storage { | 40 namespace storage { |
41 namespace { | 41 namespace { |
42 constexpr int64_t kUnknownDiskAvailability = -1ll; | 42 constexpr int64_t kUnknownDiskAvailability = -1ll; |
43 constexpr uint64_t kMegabyte = 1024ull * 1024; | 43 constexpr uint64_t kMegabyte = 1024ull * 1024; |
44 const int64_t kMinSecondsForPressureEvictions = 30; | |
44 | 45 |
45 using FileCreationInfo = BlobMemoryController::FileCreationInfo; | 46 using FileCreationInfo = BlobMemoryController::FileCreationInfo; |
46 using MemoryAllocation = BlobMemoryController::MemoryAllocation; | 47 using MemoryAllocation = BlobMemoryController::MemoryAllocation; |
47 using QuotaAllocationTask = BlobMemoryController::QuotaAllocationTask; | 48 using QuotaAllocationTask = BlobMemoryController::QuotaAllocationTask; |
48 using DiskSpaceFuncPtr = BlobMemoryController::DiskSpaceFuncPtr; | 49 using DiskSpaceFuncPtr = BlobMemoryController::DiskSpaceFuncPtr; |
49 | 50 |
50 // CrOS: | 51 // CrOS: |
51 // * Ram - 20% | 52 // * Ram - 20% |
52 // * Disk - 50% | 53 // * Disk - 50% |
53 // Note: The disk is the user partition, so the operating system can still | 54 // Note: The disk is the user partition, so the operating system can still |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
498 | 499 |
499 BlobMemoryController::BlobMemoryController( | 500 BlobMemoryController::BlobMemoryController( |
500 const base::FilePath& storage_directory, | 501 const base::FilePath& storage_directory, |
501 scoped_refptr<base::TaskRunner> file_runner) | 502 scoped_refptr<base::TaskRunner> file_runner) |
502 : file_paging_enabled_(file_runner.get() != nullptr), | 503 : file_paging_enabled_(file_runner.get() != nullptr), |
503 blob_storage_dir_(storage_directory), | 504 blob_storage_dir_(storage_directory), |
504 file_runner_(std::move(file_runner)), | 505 file_runner_(std::move(file_runner)), |
505 disk_space_function_(&base::SysInfo::AmountOfFreeDiskSpace), | 506 disk_space_function_(&base::SysInfo::AmountOfFreeDiskSpace), |
506 populated_memory_items_( | 507 populated_memory_items_( |
507 base::MRUCache<uint64_t, ShareableBlobDataItem*>::NO_AUTO_EVICT), | 508 base::MRUCache<uint64_t, ShareableBlobDataItem*>::NO_AUTO_EVICT), |
509 memory_pressure_listener_( | |
510 base::Bind(&BlobMemoryController::OnMemoryPressure, | |
511 base::Unretained(this))), | |
508 weak_factory_(this) {} | 512 weak_factory_(this) {} |
509 | 513 |
510 BlobMemoryController::~BlobMemoryController() {} | 514 BlobMemoryController::~BlobMemoryController() {} |
511 | 515 |
512 void BlobMemoryController::DisableFilePaging(base::File::Error reason) { | 516 void BlobMemoryController::DisableFilePaging(base::File::Error reason) { |
513 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.PagingDisabled", -reason, | 517 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.PagingDisabled", -reason, |
514 -File::FILE_ERROR_MAX); | 518 -File::FILE_ERROR_MAX); |
515 DLOG(ERROR) << "Blob storage paging disabled, reason: " << reason; | 519 DLOG(ERROR) << "Blob storage paging disabled, reason: " << reason; |
516 file_paging_enabled_ = false; | 520 file_paging_enabled_ = false; |
517 in_flight_memory_used_ = 0; | 521 in_flight_memory_used_ = 0; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
597 // more paging for any more pending blobs. | 601 // more paging for any more pending blobs. |
598 if (!pending_memory_quota_tasks_.empty()) { | 602 if (!pending_memory_quota_tasks_.empty()) { |
599 return AppendMemoryTask(total_bytes_needed, | 603 return AppendMemoryTask(total_bytes_needed, |
600 std::move(unreserved_memory_items), done_callback); | 604 std::move(unreserved_memory_items), done_callback); |
601 } | 605 } |
602 | 606 |
603 // Store right away if we can. | 607 // Store right away if we can. |
604 if (total_bytes_needed <= GetAvailableMemoryForBlobs()) { | 608 if (total_bytes_needed <= GetAvailableMemoryForBlobs()) { |
605 GrantMemoryAllocations(&unreserved_memory_items, | 609 GrantMemoryAllocations(&unreserved_memory_items, |
606 static_cast<size_t>(total_bytes_needed)); | 610 static_cast<size_t>(total_bytes_needed)); |
607 MaybeScheduleEvictionUntilSystemHealthy(); | 611 MaybeScheduleEvictionUntilSystemHealthy( |
612 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE); | |
608 done_callback.Run(true); | 613 done_callback.Run(true); |
609 return base::WeakPtr<QuotaAllocationTask>(); | 614 return base::WeakPtr<QuotaAllocationTask>(); |
610 } | 615 } |
611 | 616 |
612 // Size is larger than available memory. | 617 // Size is larger than available memory. |
613 DCHECK(pending_memory_quota_tasks_.empty()); | 618 DCHECK(pending_memory_quota_tasks_.empty()); |
614 DCHECK_EQ(0u, pending_memory_quota_total_size_); | 619 DCHECK_EQ(0u, pending_memory_quota_total_size_); |
615 | 620 |
616 auto weak_ptr = AppendMemoryTask( | 621 auto weak_ptr = AppendMemoryTask( |
617 total_bytes_needed, std::move(unreserved_memory_items), done_callback); | 622 total_bytes_needed, std::move(unreserved_memory_items), done_callback); |
618 MaybeScheduleEvictionUntilSystemHealthy(); | 623 MaybeScheduleEvictionUntilSystemHealthy( |
624 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE); | |
619 return weak_ptr; | 625 return weak_ptr; |
620 } | 626 } |
621 | 627 |
622 base::WeakPtr<QuotaAllocationTask> BlobMemoryController::ReserveFileQuota( | 628 base::WeakPtr<QuotaAllocationTask> BlobMemoryController::ReserveFileQuota( |
623 std::vector<scoped_refptr<ShareableBlobDataItem>> unreserved_file_items, | 629 std::vector<scoped_refptr<ShareableBlobDataItem>> unreserved_file_items, |
624 const FileQuotaRequestCallback& done_callback) { | 630 const FileQuotaRequestCallback& done_callback) { |
625 pending_file_quota_tasks_.push_back(base::MakeUnique<FileQuotaAllocationTask>( | 631 pending_file_quota_tasks_.push_back(base::MakeUnique<FileQuotaAllocationTask>( |
626 this, disk_space_function_, std::move(unreserved_file_items), | 632 this, disk_space_function_, std::move(unreserved_file_items), |
627 done_callback)); | 633 done_callback)); |
628 pending_file_quota_tasks_.back()->set_my_list_position( | 634 pending_file_quota_tasks_.back()->set_my_list_position( |
(...skipping 13 matching lines...) Expand all Loading... | |
642 items_paging_to_file_.end()) { | 648 items_paging_to_file_.end()) { |
643 return; | 649 return; |
644 } | 650 } |
645 auto iterator = populated_memory_items_.Get(item->item_id()); | 651 auto iterator = populated_memory_items_.Get(item->item_id()); |
646 if (iterator == populated_memory_items_.end()) { | 652 if (iterator == populated_memory_items_.end()) { |
647 populated_memory_items_bytes_ += | 653 populated_memory_items_bytes_ += |
648 static_cast<size_t>(item->item()->length()); | 654 static_cast<size_t>(item->item()->length()); |
649 populated_memory_items_.Put(item->item_id(), item.get()); | 655 populated_memory_items_.Put(item->item_id(), item.get()); |
650 } | 656 } |
651 } | 657 } |
652 MaybeScheduleEvictionUntilSystemHealthy(); | 658 MaybeScheduleEvictionUntilSystemHealthy( |
659 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE); | |
653 } | 660 } |
654 | 661 |
655 void BlobMemoryController::CalculateBlobStorageLimits() { | 662 void BlobMemoryController::CalculateBlobStorageLimits() { |
656 if (file_runner_) { | 663 if (file_runner_) { |
657 PostTaskAndReplyWithResult( | 664 PostTaskAndReplyWithResult( |
658 file_runner_.get(), FROM_HERE, | 665 file_runner_.get(), FROM_HERE, |
659 base::Bind(&CalculateBlobStorageLimitsImpl, blob_storage_dir_, true), | 666 base::Bind(&CalculateBlobStorageLimitsImpl, blob_storage_dir_, true), |
660 base::Bind(&BlobMemoryController::OnStorageLimitsCalculated, | 667 base::Bind(&BlobMemoryController::OnStorageLimitsCalculated, |
661 weak_factory_.GetWeakPtr())); | 668 weak_factory_.GetWeakPtr())); |
662 } else { | 669 } else { |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
764 std::unique_ptr<MemoryQuotaAllocationTask> memory_task = | 771 std::unique_ptr<MemoryQuotaAllocationTask> memory_task = |
765 std::move(pending_memory_quota_tasks_.front()); | 772 std::move(pending_memory_quota_tasks_.front()); |
766 pending_memory_quota_tasks_.pop_front(); | 773 pending_memory_quota_tasks_.pop_front(); |
767 pending_memory_quota_total_size_ -= memory_task->allocation_size(); | 774 pending_memory_quota_total_size_ -= memory_task->allocation_size(); |
768 memory_task->RunDoneCallback(true); | 775 memory_task->RunDoneCallback(true); |
769 } | 776 } |
770 RecordTracingCounters(); | 777 RecordTracingCounters(); |
771 } | 778 } |
772 | 779 |
773 size_t BlobMemoryController::CollectItemsForEviction( | 780 size_t BlobMemoryController::CollectItemsForEviction( |
774 std::vector<scoped_refptr<ShareableBlobDataItem>>* output) { | 781 std::vector<scoped_refptr<ShareableBlobDataItem>>* output, |
782 uint64_t min_page_file_size) { | |
775 base::CheckedNumeric<size_t> total_items_size = 0; | 783 base::CheckedNumeric<size_t> total_items_size = 0; |
776 // Process the recent item list and remove items until we have at least a | 784 // Process the recent item list and remove items until we have at least a |
777 // minimum file size or we're at the end of our items to page to disk. | 785 // minimum file size or we're at the end of our items to page to disk. |
778 while (total_items_size.ValueOrDie() < limits_.min_page_file_size && | 786 while (total_items_size.ValueOrDie() < min_page_file_size && |
779 !populated_memory_items_.empty()) { | 787 !populated_memory_items_.empty()) { |
780 auto iterator = --populated_memory_items_.end(); | 788 auto iterator = --populated_memory_items_.end(); |
781 ShareableBlobDataItem* item = iterator->second; | 789 ShareableBlobDataItem* item = iterator->second; |
782 DCHECK_EQ(item->item()->type(), DataElement::TYPE_BYTES); | 790 DCHECK_EQ(item->item()->type(), DataElement::TYPE_BYTES); |
783 populated_memory_items_.Erase(iterator); | 791 populated_memory_items_.Erase(iterator); |
784 size_t size = base::checked_cast<size_t>(item->item()->length()); | 792 size_t size = base::checked_cast<size_t>(item->item()->length()); |
785 populated_memory_items_bytes_ -= size; | 793 populated_memory_items_bytes_ -= size; |
786 total_items_size += size; | 794 total_items_size += size; |
787 output->push_back(make_scoped_refptr(item)); | 795 output->push_back(make_scoped_refptr(item)); |
788 } | 796 } |
789 return total_items_size.ValueOrDie(); | 797 return total_items_size.ValueOrDie(); |
790 } | 798 } |
791 | 799 |
792 void BlobMemoryController::MaybeScheduleEvictionUntilSystemHealthy() { | 800 void BlobMemoryController::MaybeScheduleEvictionUntilSystemHealthy( |
801 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { | |
793 // Don't do eviction when others are happening, as we don't change our | 802 // Don't do eviction when others are happening, as we don't change our |
794 // pending_memory_quota_total_size_ value until after the paging files have | 803 // pending_memory_quota_total_size_ value until after the paging files have |
795 // been written. | 804 // been written. |
796 if (pending_evictions_ != 0 || !file_paging_enabled_) | 805 if (pending_evictions_ != 0 || !file_paging_enabled_) |
797 return; | 806 return; |
798 | 807 |
799 uint64_t total_memory_usage = | 808 uint64_t total_memory_usage = |
800 static_cast<uint64_t>(pending_memory_quota_total_size_) + | 809 static_cast<uint64_t>(pending_memory_quota_total_size_) + |
801 blob_memory_used_; | 810 blob_memory_used_; |
802 | 811 |
812 size_t in_memory_limit = limits_.memory_limit_before_paging(); | |
813 uint64_t min_page_file_size = limits_.min_page_file_size; | |
814 if (memory_pressure_level != | |
815 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { | |
816 in_memory_limit = 0; | |
817 // Use lower page file size to reduce using more memory for writing under | |
818 // pressure. | |
819 min_page_file_size = limits_.max_blob_in_memory_space * | |
820 limits_.min_page_file_size_ratio_under_pressure; | |
821 } | |
822 | |
803 // We try to page items to disk until our current system size + requested | 823 // We try to page items to disk until our current system size + requested |
804 // memory is below our size limit. | 824 // memory is below our size limit. |
805 // Size limit is a lower |memory_limit_before_paging()| if we have disk space. | 825 // Size limit is a lower |memory_limit_before_paging()| if we have disk space. |
806 while (total_memory_usage > limits_.effective_max_disk_space || | 826 while (total_memory_usage > limits_.effective_max_disk_space || |
807 (disk_used_ < limits_.effective_max_disk_space && | 827 (disk_used_ < limits_.effective_max_disk_space && |
808 total_memory_usage > limits_.memory_limit_before_paging())) { | 828 total_memory_usage > in_memory_limit)) { |
829 const char* reason = nullptr; | |
830 if (memory_pressure_level != | |
831 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { | |
832 reason = "OnMemoryPressure"; | |
833 } else if (total_memory_usage > limits_.effective_max_disk_space) { | |
834 reason = "SizeExceededMaxDiskSpace"; | |
835 } else { | |
836 reason = "SizeExceededInMemoryLimit"; | |
837 } | |
838 | |
809 // We only page when we have enough items to fill a whole page file. | 839 // We only page when we have enough items to fill a whole page file. |
810 if (populated_memory_items_bytes_ < limits_.min_page_file_size) | 840 if (populated_memory_items_bytes_ < min_page_file_size) |
811 break; | 841 break; |
812 DCHECK_LE(limits_.min_page_file_size, | 842 DCHECK_LE(min_page_file_size, static_cast<uint64_t>(blob_memory_used_)); |
813 static_cast<uint64_t>(blob_memory_used_)); | |
814 | 843 |
815 std::vector<scoped_refptr<ShareableBlobDataItem>> items_to_swap; | 844 std::vector<scoped_refptr<ShareableBlobDataItem>> items_to_swap; |
816 size_t total_items_size = CollectItemsForEviction(&items_to_swap); | 845 |
846 size_t total_items_size = | |
847 CollectItemsForEviction(&items_to_swap, min_page_file_size); | |
817 if (total_items_size == 0) | 848 if (total_items_size == 0) |
818 break; | 849 break; |
819 | 850 |
820 std::vector<DataElement*> items_for_paging; | 851 std::vector<DataElement*> items_for_paging; |
821 for (auto& shared_blob_item : items_to_swap) { | 852 for (auto& shared_blob_item : items_to_swap) { |
822 items_paging_to_file_.insert(shared_blob_item->item_id()); | 853 items_paging_to_file_.insert(shared_blob_item->item_id()); |
823 items_for_paging.push_back(shared_blob_item->item()->data_element_ptr()); | 854 items_for_paging.push_back(shared_blob_item->item()->data_element_ptr()); |
824 } | 855 } |
825 | 856 |
826 // Update our bookkeeping. | 857 // Update our bookkeeping. |
(...skipping 15 matching lines...) Expand all Loading... | |
842 | 873 |
843 // Post the file writing task. | 874 // Post the file writing task. |
844 base::PostTaskAndReplyWithResult( | 875 base::PostTaskAndReplyWithResult( |
845 file_runner_.get(), FROM_HERE, | 876 file_runner_.get(), FROM_HERE, |
846 base::Bind(&CreateFileAndWriteItems, blob_storage_dir_, | 877 base::Bind(&CreateFileAndWriteItems, blob_storage_dir_, |
847 disk_space_function_, base::Passed(&page_file_path), | 878 disk_space_function_, base::Passed(&page_file_path), |
848 file_runner_, base::Passed(&items_for_paging), | 879 file_runner_, base::Passed(&items_for_paging), |
849 total_items_size), | 880 total_items_size), |
850 base::Bind(&BlobMemoryController::OnEvictionComplete, | 881 base::Bind(&BlobMemoryController::OnEvictionComplete, |
851 weak_factory_.GetWeakPtr(), base::Passed(&file_reference), | 882 weak_factory_.GetWeakPtr(), base::Passed(&file_reference), |
852 base::Passed(&items_to_swap), total_items_size)); | 883 base::Passed(&items_to_swap), total_items_size, reason, |
884 total_memory_usage)); | |
885 | |
886 last_eviction_time_ = base::TimeTicks::Now(); | |
853 } | 887 } |
888 | |
dmurph
2017/05/10 19:13:34
nit: remove newline
ssid
2017/05/12 01:38:01
Done.
| |
854 RecordTracingCounters(); | 889 RecordTracingCounters(); |
855 } | 890 } |
856 | 891 |
857 void BlobMemoryController::OnEvictionComplete( | 892 void BlobMemoryController::OnEvictionComplete( |
858 scoped_refptr<ShareableFileReference> file_reference, | 893 scoped_refptr<ShareableFileReference> file_reference, |
859 std::vector<scoped_refptr<ShareableBlobDataItem>> items, | 894 std::vector<scoped_refptr<ShareableBlobDataItem>> items, |
860 size_t total_items_size, | 895 size_t total_items_size, |
896 const char* evict_reason, | |
897 size_t memory_usage_before_eviction, | |
861 std::pair<FileCreationInfo, int64_t /* avail_disk */> result) { | 898 std::pair<FileCreationInfo, int64_t /* avail_disk */> result) { |
862 if (!file_paging_enabled_) | 899 if (!file_paging_enabled_) |
863 return; | 900 return; |
864 | 901 |
865 FileCreationInfo& file_info = std::get<0>(result); | 902 FileCreationInfo& file_info = std::get<0>(result); |
866 int64_t avail_disk_space = std::get<1>(result); | 903 int64_t avail_disk_space = std::get<1>(result); |
867 | 904 |
868 if (file_info.error != File::FILE_OK) { | 905 if (file_info.error != File::FILE_OK) { |
869 DisableFilePaging(file_info.error); | 906 DisableFilePaging(file_info.error); |
870 return; | 907 return; |
(...skipping 15 matching lines...) Expand all Loading... | |
886 file_reference->path(), offset, shareable_item->item()->length(), | 923 file_reference->path(), offset, shareable_item->item()->length(), |
887 file_info.last_modified); | 924 file_info.last_modified); |
888 DCHECK(shareable_item->memory_allocation_); | 925 DCHECK(shareable_item->memory_allocation_); |
889 shareable_item->set_memory_allocation(nullptr); | 926 shareable_item->set_memory_allocation(nullptr); |
890 shareable_item->set_item(new_item); | 927 shareable_item->set_item(new_item); |
891 items_paging_to_file_.erase(shareable_item->item_id()); | 928 items_paging_to_file_.erase(shareable_item->item_id()); |
892 offset += shareable_item->item()->length(); | 929 offset += shareable_item->item()->length(); |
893 } | 930 } |
894 in_flight_memory_used_ -= total_items_size; | 931 in_flight_memory_used_ -= total_items_size; |
895 | 932 |
933 // Record change in memory usage at the last eviction reply. | |
934 size_t total_usage = blob_memory_used_ + pending_memory_quota_total_size_; | |
935 if (!pending_evictions_ && memory_usage_before_eviction >= total_usage) { | |
936 std::string full_histogram_name = | |
937 std::string("Storage.Blob.SizeEvictedToDiskInKB.") + evict_reason; | |
938 base::HistogramBase* histogram = base::Histogram::FactoryGet( | |
939 full_histogram_name, 1, 100000, 50, | |
940 base::HistogramBase::kUmaTargetedHistogramFlag); | |
Ilya Sherman
2017/05/11 20:13:39
Please use one of the base::UmaHistogram... functi
ssid
2017/05/12 01:38:01
Ah thanks! I couldn't find these functions when I
| |
941 if (histogram) | |
942 histogram->Add((memory_usage_before_eviction - total_usage) / 1024); | |
943 } | |
944 | |
896 // We want callback on blobs up to the amount we've freed. | 945 // We want callback on blobs up to the amount we've freed. |
897 MaybeGrantPendingMemoryRequests(); | 946 MaybeGrantPendingMemoryRequests(); |
898 | 947 |
899 // If we still have more blobs waiting and we're not waiting on more paging | 948 // If we still have more blobs waiting and we're not waiting on more paging |
900 // operations, schedule more. | 949 // operations, schedule more. |
901 MaybeScheduleEvictionUntilSystemHealthy(); | 950 MaybeScheduleEvictionUntilSystemHealthy( |
951 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE); | |
952 } | |
953 | |
954 void BlobMemoryController::OnMemoryPressure( | |
955 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { | |
956 auto time_from_last_evicion = base::TimeTicks::Now() - last_eviction_time_; | |
957 if (time_from_last_evicion.InSeconds() < kMinSecondsForPressureEvictions) | |
958 return; | |
959 | |
960 MaybeScheduleEvictionUntilSystemHealthy(memory_pressure_level); | |
902 } | 961 } |
903 | 962 |
904 FilePath BlobMemoryController::GenerateNextPageFileName() { | 963 FilePath BlobMemoryController::GenerateNextPageFileName() { |
905 std::string file_name = base::Uint64ToString(current_file_num_++); | 964 std::string file_name = base::Uint64ToString(current_file_num_++); |
906 return blob_storage_dir_.Append(FilePath::FromUTF8Unsafe(file_name)); | 965 return blob_storage_dir_.Append(FilePath::FromUTF8Unsafe(file_name)); |
907 } | 966 } |
908 | 967 |
909 void BlobMemoryController::RecordTracingCounters() const { | 968 void BlobMemoryController::RecordTracingCounters() const { |
910 TRACE_COUNTER2("Blob", "MemoryUsage", "TotalStorage", blob_memory_used_, | 969 TRACE_COUNTER2("Blob", "MemoryUsage", "TotalStorage", blob_memory_used_, |
911 "InFlightToDisk", in_flight_memory_used_); | 970 "InFlightToDisk", in_flight_memory_used_); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
977 MaybeGrantPendingMemoryRequests(); | 1036 MaybeGrantPendingMemoryRequests(); |
978 } | 1037 } |
979 | 1038 |
980 void BlobMemoryController::OnBlobFileDelete(uint64_t size, | 1039 void BlobMemoryController::OnBlobFileDelete(uint64_t size, |
981 const FilePath& path) { | 1040 const FilePath& path) { |
982 DCHECK_LE(size, disk_used_); | 1041 DCHECK_LE(size, disk_used_); |
983 disk_used_ -= size; | 1042 disk_used_ -= size; |
984 } | 1043 } |
985 | 1044 |
986 } // namespace storage | 1045 } // namespace storage |
OLD | NEW |