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 3 // found in the LICENSE file. 4 5 #ifndef WEBKIT_BROWSER_QUOTA_QUOTA_TEMPORARY_STORAGE_EVICTOR_H_ 6 #define WEBKIT_BROWSER_QUOTA_QUOTA_TEMPORARY_STORAGE_EVICTOR_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/memory/weak_ptr.h" 12 #include "base/threading/non_thread_safe.h" 13 #include "base/timer/timer.h" 14 #include "webkit/browser/webkit_storage_browser_export.h" 15 #include "webkit/common/quota/quota_types.h" 16 17 class GURL; 18 19 namespace quota { 20 21 class QuotaEvictionHandler; 22 struct UsageAndQuota; 23 24 class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE QuotaTemporaryStorageEvictor 25 : public base::NonThreadSafe { 26 public: 27 struct Statistics { StatisticsStatistics28 Statistics() 29 : num_errors_on_evicting_origin(0), 30 num_errors_on_getting_usage_and_quota(0), 31 num_evicted_origins(0), 32 num_eviction_rounds(0), 33 num_skipped_eviction_rounds(0) {} 34 int64 num_errors_on_evicting_origin; 35 int64 num_errors_on_getting_usage_and_quota; 36 int64 num_evicted_origins; 37 int64 num_eviction_rounds; 38 int64 num_skipped_eviction_rounds; 39 subtract_assignStatistics40 void subtract_assign(const Statistics& rhs) { 41 num_errors_on_evicting_origin -= rhs.num_errors_on_evicting_origin; 42 num_errors_on_getting_usage_and_quota -= 43 rhs.num_errors_on_getting_usage_and_quota; 44 num_evicted_origins -= rhs.num_evicted_origins; 45 num_eviction_rounds -= rhs.num_eviction_rounds; 46 num_skipped_eviction_rounds -= rhs.num_skipped_eviction_rounds; 47 } 48 }; 49 50 struct EvictionRoundStatistics { 51 EvictionRoundStatistics(); 52 53 bool in_round; 54 bool is_initialized; 55 56 base::Time start_time; 57 int64 usage_overage_at_round; 58 int64 diskspace_shortage_at_round; 59 60 int64 usage_on_beginning_of_round; 61 int64 usage_on_end_of_round; 62 int64 num_evicted_origins_in_round; 63 }; 64 65 QuotaTemporaryStorageEvictor( 66 QuotaEvictionHandler* quota_eviction_handler, 67 int64 interval_ms); 68 virtual ~QuotaTemporaryStorageEvictor(); 69 70 void GetStatistics(std::map<std::string, int64>* statistics); 71 void ReportPerRoundHistogram(); 72 void ReportPerHourHistogram(); 73 void Start(); 74 min_available_disk_space_to_start_eviction()75 int64 min_available_disk_space_to_start_eviction() { 76 return min_available_disk_space_to_start_eviction_; 77 } reset_min_available_disk_space_to_start_eviction()78 void reset_min_available_disk_space_to_start_eviction() { 79 min_available_disk_space_to_start_eviction_ = 80 kMinAvailableDiskSpaceToStartEvictionNotSpecified; 81 } set_min_available_disk_space_to_start_eviction(int64 value)82 void set_min_available_disk_space_to_start_eviction(int64 value) { 83 min_available_disk_space_to_start_eviction_ = value; 84 } 85 86 private: 87 friend class QuotaTemporaryStorageEvictorTest; 88 89 void StartEvictionTimerWithDelay(int delay_ms); 90 void ConsiderEviction(); 91 void OnGotUsageAndQuotaForEviction( 92 QuotaStatusCode status, 93 const UsageAndQuota& quota_and_usage); 94 void OnGotLRUOrigin(const GURL& origin); 95 void OnEvictionComplete(QuotaStatusCode status); 96 97 void OnEvictionRoundStarted(); 98 void OnEvictionRoundFinished(); 99 100 // This is only used for tests. set_repeated_eviction(bool repeated_eviction)101 void set_repeated_eviction(bool repeated_eviction) { 102 repeated_eviction_ = repeated_eviction; 103 } 104 105 static const int kMinAvailableDiskSpaceToStartEvictionNotSpecified; 106 107 int64 min_available_disk_space_to_start_eviction_; 108 109 // Not owned; quota_eviction_handler owns us. 110 QuotaEvictionHandler* quota_eviction_handler_; 111 112 Statistics statistics_; 113 Statistics previous_statistics_; 114 EvictionRoundStatistics round_statistics_; 115 base::Time time_of_end_of_last_nonskipped_round_; 116 base::Time time_of_end_of_last_round_; 117 118 int64 interval_ms_; 119 bool repeated_eviction_; 120 121 base::OneShotTimer<QuotaTemporaryStorageEvictor> eviction_timer_; 122 base::RepeatingTimer<QuotaTemporaryStorageEvictor> histogram_timer_; 123 base::WeakPtrFactory<QuotaTemporaryStorageEvictor> weak_factory_; 124 125 DISALLOW_COPY_AND_ASSIGN(QuotaTemporaryStorageEvictor); 126 }; 127 128 } // namespace quota 129 130 #endif // WEBKIT_BROWSER_QUOTA_QUOTA_TEMPORARY_STORAGE_EVICTOR_H_ 131