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 #ifndef COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_STORAGE_MANAGER_H_ | 5 #ifndef COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_STORAGE_MANAGER_H_ |
6 #define COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_STORAGE_MANAGER_H_ | 6 #define COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_STORAGE_MANAGER_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
16 #include "components/offline_pages/archive_manager.h" | 16 #include "components/offline_pages/archive_manager.h" |
17 #include "components/offline_pages/offline_page_types.h" | 17 #include "components/offline_pages/offline_page_types.h" |
18 | 18 |
19 namespace base { | 19 namespace base { |
20 class Clock; | 20 class Clock; |
21 } // namespace base | 21 } // namespace base |
22 | 22 |
23 namespace offline_pages { | 23 namespace offline_pages { |
24 | 24 |
25 // Maximum % of total available storage that will be occupied by offline pages | 25 // Maximum % of total available storage that will be occupied by offline pages |
26 // before a storage clearup. | 26 // before a storage clearup. |
27 const double kOfflinePageStorageLimit = 0.3; | 27 const double kOfflinePageStorageLimit = 0.3; |
28 // The target % of storage usage we try to reach below when expiring pages. | 28 // The target % of storage usage we try to reach below when deleting pages. |
29 const double kOfflinePageStorageClearThreshold = 0.1; | 29 const double kOfflinePageStorageClearThreshold = 0.1; |
30 // The time that the storage cleanup will be triggered again since the last one. | 30 // The time that the storage cleanup will be triggered again since the last one. |
31 const base::TimeDelta kClearStorageInterval = base::TimeDelta::FromMinutes(10); | 31 const base::TimeDelta kClearStorageInterval = base::TimeDelta::FromMinutes(10); |
32 // The time that the page record will be removed from the store since the page | |
33 // has been expired. | |
34 const base::TimeDelta kRemovePageItemInterval = base::TimeDelta::FromDays(21); | |
35 | 32 |
36 class ClientPolicyController; | 33 class ClientPolicyController; |
37 class OfflinePageModel; | 34 class OfflinePageModel; |
38 | 35 |
39 // This class is used for storage management of offline pages. It provides | 36 // This class is used for storage management of offline pages. It provides |
40 // a ClearPagesIfNeeded method which is used to clear expired offline pages | 37 // a ClearPagesIfNeeded method which is used to clear outdated offline pages |
41 // based on last_access_time and lifetime policy of its namespace. | 38 // based on last_access_time and lifetime policy of its namespace. |
42 // It has its own throttle mechanism so calling the method would not be | 39 // It has its own throttle mechanism so calling the method would not be |
43 // guaranteed to clear the pages immediately. | 40 // guaranteed to clear the pages immediately. |
44 // | 41 // |
45 // OfflinePageModel should own and control the lifecycle of this manager. | 42 // OfflinePageModel should own and control the lifecycle of this manager. |
46 // And this manager would use OfflinePageModel to get/remove pages. | 43 // And this manager would use OfflinePageModel to get/remove pages. |
47 class OfflinePageStorageManager { | 44 class OfflinePageStorageManager { |
48 public: | 45 public: |
49 enum class ClearStorageResult { | 46 enum class ClearStorageResult { |
jianli
2016/11/18 00:15:48
Do you want to update the histogram for this?
romax
2016/11/18 20:50:49
Yes, I'm following the comment from Filip below to
| |
50 SUCCESS, // Cleared successfully. | 47 SUCCESS, // Cleared successfully. |
51 UNNECESSARY, // No expired pages. | 48 UNNECESSARY, // No expired pages. |
52 EXPIRE_FAILURE, // Expiration failed. | 49 CLEAR_FAILURE, // Deletion failed. |
53 DELETE_FAILURE, // Deletion failed. | |
54 EXPIRE_AND_DELETE_FAILURES, // Both expiration and deletion failed. | |
55 // NOTE: always keep this entry at the end. Add new result types only | 50 // NOTE: always keep this entry at the end. Add new result types only |
fgorski
2016/11/18 00:13:04
Read this note before making changes.
Mark the im
romax
2016/11/18 20:50:49
Done but not sure, can you please take a close loo
| |
56 // immediately above this line. Make sure to update the corresponding | 51 // immediately above this line. Make sure to update the corresponding |
57 // histogram enum accordingly. | 52 // histogram enum accordingly. |
58 RESULT_COUNT, | 53 RESULT_COUNT, |
59 }; | 54 }; |
60 | 55 |
61 // Callback used when calling ClearPagesIfNeeded. | 56 // Callback used when calling ClearPagesIfNeeded. |
62 // size_t: the number of expired pages. | 57 // size_t: the number of cleared pages. |
63 // ClearStorageResult: result of expiring pages in storage. | 58 // ClearStorageResult: result of clearing pages in storage. |
64 typedef base::Callback<void(size_t, ClearStorageResult)> ClearStorageCallback; | 59 typedef base::Callback<void(size_t, ClearStorageResult)> ClearStorageCallback; |
65 | 60 |
66 explicit OfflinePageStorageManager(OfflinePageModel* model, | 61 explicit OfflinePageStorageManager(OfflinePageModel* model, |
67 ClientPolicyController* policy_controller, | 62 ClientPolicyController* policy_controller, |
68 ArchiveManager* archive_manager); | 63 ArchiveManager* archive_manager); |
69 | 64 |
70 ~OfflinePageStorageManager(); | 65 ~OfflinePageStorageManager(); |
71 | 66 |
72 // The manager would *try* to clear pages when called. It may not delete any | 67 // The manager would *try* to clear pages when called. It may not delete any |
73 // pages (if clearing condition wasn't satisfied). | 68 // pages (if clearing condition wasn't satisfied). |
74 // It clears the storage (expire pages) when it's using more disk space than a | 69 // It clears the storage (expire pages) when it's using more disk space than a |
75 // certain limit, or the time elapsed from last time clearing is longer than a | 70 // certain limit, or the time elapsed from last time clearing is longer than a |
76 // certain interval. Both values are defined above. | 71 // certain interval. Both values are defined above. |
77 void ClearPagesIfNeeded(const ClearStorageCallback& callback); | 72 void ClearPagesIfNeeded(const ClearStorageCallback& callback); |
78 | 73 |
79 // Sets the clock for testing. | 74 // Sets the clock for testing. |
80 void SetClockForTesting(std::unique_ptr<base::Clock> clock); | 75 void SetClockForTesting(std::unique_ptr<base::Clock> clock); |
81 | 76 |
82 private: | 77 private: |
83 // Enum indicating how to clear the pages. | 78 // Enum indicating how to clear the pages. |
84 enum class ClearMode { | 79 enum class ClearMode { |
85 // Using normal expiration logic to expire pages. Will reduce the storage | 80 // Using normal expiration logic to clear pages. Will reduce the storage |
86 // usage down below the threshold. | 81 // usage down below the threshold. |
87 DEFAULT, | 82 DEFAULT, |
88 // No need to expire any page (no pages in the model or no expired | 83 // No need to clear any page (no pages in the model or no expired pages and |
89 // pages and we're not exceeding the storage limit.) | 84 // we're not exceeding the storage limit.) |
90 NOT_NEEDED, | 85 NOT_NEEDED, |
91 }; | 86 }; |
92 | 87 |
93 // Callback called after getting storage stats from archive manager. | 88 // Callback called after getting storage stats from archive manager. |
94 void OnGetStorageStatsDoneForClearingPages( | 89 void OnGetStorageStatsDoneForClearingPages( |
95 const ClearStorageCallback& callback, | 90 const ClearStorageCallback& callback, |
96 const ArchiveManager::StorageStats& pages); | 91 const ArchiveManager::StorageStats& pages); |
97 | 92 |
98 // Callback called after getting all pages from model. | 93 // Callback called after getting all pages from model. |
99 void OnGetAllPagesDoneForClearingPages( | 94 void OnGetAllPagesDoneForClearingPages( |
100 const ClearStorageCallback& callback, | 95 const ClearStorageCallback& callback, |
101 const ArchiveManager::StorageStats& storage_stats, | 96 const ArchiveManager::StorageStats& storage_stats, |
102 const MultipleOfflinePageItemResult& pages); | 97 const MultipleOfflinePageItemResult& pages); |
103 | 98 |
104 // Callback called after expired pages have been deleted. | 99 // Callback called after clearing expired pages from model. |
105 void OnPagesExpired(const ClearStorageCallback& callback, | 100 void OnExpiredPagesCleared(const ClearStorageCallback& callback, |
fgorski
2016/11/18 00:13:04
Expired... part should probably go.
romax
2016/11/18 20:50:49
Acknowledged.
| |
106 size_t pages_to_clear, | 101 size_t pages_cleared, |
107 const std::vector<int64_t>& page_ids_to_remove, | 102 DeletePageResult result); |
108 bool expiration_succeeded); | |
109 | 103 |
110 // Callback called after clearing outdated pages from model. | 104 // Gets offline IDs of pages that should be cleared based on current |stats| |
111 void OnOutdatedPagesCleared(const ClearStorageCallback& callback, | 105 // and return the IDs in |page_ids_to_clear|. |
112 size_t pages_cleared, | |
113 bool expiration_succeeded, | |
114 DeletePageResult result); | |
115 | |
116 // Gets offline IDs of both pages that should be expired and the ones that | |
117 // need to be removed from metadata store. |page_ids_to_expire| will have | |
118 // the pages to be expired, |page_ids_to_remove| will have the pages to be | |
119 // removed. | |
120 void GetPageIdsToClear(const MultipleOfflinePageItemResult& pages, | 106 void GetPageIdsToClear(const MultipleOfflinePageItemResult& pages, |
121 const ArchiveManager::StorageStats& stats, | 107 const ArchiveManager::StorageStats& stats, |
122 std::vector<int64_t>* page_ids_to_expire, | 108 std::vector<int64_t>* page_ids_to_clear); |
123 std::vector<int64_t>* page_ids_to_remove); | |
124 | 109 |
125 // Determines if manager should clear pages. | 110 // Determines if manager should clear pages. |
126 ClearMode ShouldClearPages(const ArchiveManager::StorageStats& storage_stats); | 111 ClearMode ShouldClearPages(const ArchiveManager::StorageStats& storage_stats); |
127 | 112 |
128 // Returns true if |page| is expired comparing to |clear_time_|. | 113 // Returns true if |page| is should be cleared based on |clear_time_|. |
129 bool ShouldBeExpired(const OfflinePageItem& page) const; | 114 bool IsExpired(const OfflinePageItem& page) const; |
fgorski
2016/11/18 00:13:04
Explain why we are still using the concept of expi
romax
2016/11/18 20:50:49
Yes expiration should still be a valid term for th
| |
130 | 115 |
131 // Returns true if we're currently doing a cleanup. | 116 // Returns true if we're currently doing a cleanup. |
132 bool IsInProgress() const; | 117 bool IsInProgress() const; |
133 | 118 |
134 // Not owned. | 119 // Not owned. |
135 OfflinePageModel* model_; | 120 OfflinePageModel* model_; |
136 | 121 |
137 // Not owned. | 122 // Not owned. |
138 ClientPolicyController* policy_controller_; | 123 ClientPolicyController* policy_controller_; |
139 | 124 |
(...skipping 11 matching lines...) Expand all Loading... | |
151 std::unique_ptr<base::Clock> clock_; | 136 std::unique_ptr<base::Clock> clock_; |
152 | 137 |
153 base::WeakPtrFactory<OfflinePageStorageManager> weak_ptr_factory_; | 138 base::WeakPtrFactory<OfflinePageStorageManager> weak_ptr_factory_; |
154 | 139 |
155 DISALLOW_COPY_AND_ASSIGN(OfflinePageStorageManager); | 140 DISALLOW_COPY_AND_ASSIGN(OfflinePageStorageManager); |
156 }; | 141 }; |
157 | 142 |
158 } // namespace offline_pages | 143 } // namespace offline_pages |
159 | 144 |
160 #endif // COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_STORAGE_MANAGER_H_ | 145 #endif // COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_STORAGE_MANAGER_H_ |
OLD | NEW |