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 "components/cronet/host_cache_persistence_manager.h" | 5 #include "components/cronet/host_cache_persistence_manager.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/metrics/histogram_macros.h" |
10 #include "base/values.h" | 11 #include "base/values.h" |
11 #include "components/prefs/pref_service.h" | 12 #include "components/prefs/pref_service.h" |
| 13 #include "net/log/net_log.h" |
12 | 14 |
13 namespace cronet { | 15 namespace cronet { |
14 | 16 |
15 HostCachePersistenceManager::HostCachePersistenceManager( | 17 HostCachePersistenceManager::HostCachePersistenceManager( |
16 net::HostCache* cache, | 18 net::HostCache* cache, |
17 PrefService* pref_service, | 19 PrefService* pref_service, |
18 std::string pref_name, | 20 std::string pref_name, |
19 base::TimeDelta delay) | 21 base::TimeDelta delay, |
| 22 net::NetLog* net_log) |
20 : cache_(cache), | 23 : cache_(cache), |
21 pref_service_(pref_service), | 24 pref_service_(pref_service), |
22 pref_name_(pref_name), | 25 pref_name_(pref_name), |
23 writing_pref_(false), | 26 writing_pref_(false), |
24 delay_(delay), | 27 delay_(delay), |
| 28 net_log_(net::NetLogWithSource::Make( |
| 29 net_log, |
| 30 net::NetLogSourceType::HOST_CACHE_PERSISTENCE_MANAGER)), |
25 weak_factory_(this) { | 31 weak_factory_(this) { |
26 DCHECK(cache_); | 32 DCHECK(cache_); |
27 DCHECK(pref_service_); | 33 DCHECK(pref_service_); |
28 | 34 |
29 // Get the initial value of the pref if it's already initialized. | 35 // Get the initial value of the pref if it's already initialized. |
30 if (pref_service_->HasPrefPath(pref_name_)) | 36 if (pref_service_->HasPrefPath(pref_name_)) |
31 ReadFromDisk(); | 37 ReadFromDisk(); |
32 | 38 |
33 registrar_.Init(pref_service_); | 39 registrar_.Init(pref_service_); |
34 registrar_.Add(pref_name_, | 40 registrar_.Add(pref_name_, |
35 base::Bind(&HostCachePersistenceManager::ReadFromDisk, | 41 base::Bind(&HostCachePersistenceManager::ReadFromDisk, |
36 weak_factory_.GetWeakPtr())); | 42 weak_factory_.GetWeakPtr())); |
37 cache_->set_persistence_delegate(this); | 43 cache_->set_persistence_delegate(this); |
38 } | 44 } |
39 | 45 |
40 HostCachePersistenceManager::~HostCachePersistenceManager() { | 46 HostCachePersistenceManager::~HostCachePersistenceManager() { |
41 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 47 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
42 | 48 |
43 timer_.Stop(); | 49 timer_.Stop(); |
44 registrar_.RemoveAll(); | 50 registrar_.RemoveAll(); |
45 cache_->set_persistence_delegate(nullptr); | 51 cache_->set_persistence_delegate(nullptr); |
46 } | 52 } |
47 | 53 |
48 void HostCachePersistenceManager::ReadFromDisk() { | 54 void HostCachePersistenceManager::ReadFromDisk() { |
49 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 55 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
50 | 56 |
51 if (writing_pref_) | 57 if (writing_pref_) |
52 return; | 58 return; |
53 | 59 |
| 60 net_log_.BeginEvent(net::NetLogEventType::HOST_CACHE_PREF_READ); |
54 const base::ListValue* pref_value = pref_service_->GetList(pref_name_); | 61 const base::ListValue* pref_value = pref_service_->GetList(pref_name_); |
55 cache_->RestoreFromListValue(*pref_value); | 62 bool success = cache_->RestoreFromListValue(*pref_value); |
| 63 net_log_.EndEvent(net::NetLogEventType::HOST_CACHE_PREF_READ, |
| 64 net::NetLog::BoolCallback("success", success)); |
| 65 |
| 66 UMA_HISTOGRAM_BOOLEAN("DNS.HostCache.RestoreSuccess", success); |
| 67 UMA_HISTOGRAM_COUNTS_1000("DNS.HostCache.RestoreSize", pref_value->GetSize()); |
56 } | 68 } |
57 | 69 |
58 void HostCachePersistenceManager::ScheduleWrite() { | 70 void HostCachePersistenceManager::ScheduleWrite() { |
59 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 71 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
60 | 72 |
61 if (timer_.IsRunning()) | 73 if (timer_.IsRunning()) |
62 return; | 74 return; |
63 | 75 |
| 76 net_log_.AddEvent(net::NetLogEventType::HOST_CACHE_PERSISTENCE_START_TIMER); |
64 timer_.Start(FROM_HERE, delay_, | 77 timer_.Start(FROM_HERE, delay_, |
65 base::Bind(&HostCachePersistenceManager::WriteToDisk, | 78 base::Bind(&HostCachePersistenceManager::WriteToDisk, |
66 weak_factory_.GetWeakPtr())); | 79 weak_factory_.GetWeakPtr())); |
67 } | 80 } |
68 | 81 |
69 void HostCachePersistenceManager::WriteToDisk() { | 82 void HostCachePersistenceManager::WriteToDisk() { |
70 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 83 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
71 | 84 |
| 85 net_log_.AddEvent(net::NetLogEventType::HOST_CACHE_PREF_WRITE); |
72 base::ListValue value; | 86 base::ListValue value; |
73 cache_->GetAsListValue(&value, false); | 87 cache_->GetAsListValue(&value, false); |
74 writing_pref_ = true; | 88 writing_pref_ = true; |
75 pref_service_->Set(pref_name_, value); | 89 pref_service_->Set(pref_name_, value); |
76 writing_pref_ = false; | 90 writing_pref_ = false; |
77 } | 91 } |
78 | 92 |
79 } // namespace cronet | 93 } // namespace cronet |
OLD | NEW |