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

Side by Side Diff: sync/notifier/non_blocking_invalidator.cc

Issue 56113003: Implement new invalidations ack tracking system (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Modify drive TODO comment + rebase Created 7 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "sync/notifier/non_blocking_invalidator.h" 5 #include "sync/notifier/non_blocking_invalidator.h"
6 6
7 #include <cstddef> 7 #include <cstddef>
8 8
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/thread_task_runner_handle.h" 13 #include "base/thread_task_runner_handle.h"
14 #include "base/threading/thread.h" 14 #include "base/threading/thread.h"
15 #include "jingle/notifier/listener/push_client.h" 15 #include "jingle/notifier/listener/push_client.h"
16 #include "sync/notifier/invalidation_notifier.h" 16 #include "sync/notifier/invalidation_notifier.h"
17 #include "sync/notifier/object_id_invalidation_map.h"
17 18
18 namespace syncer { 19 namespace syncer {
19 20
20 class NonBlockingInvalidator::Core 21 class NonBlockingInvalidator::Core
21 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, 22 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>,
22 // InvalidationHandler to observe the InvalidationNotifier we create. 23 // InvalidationHandler to observe the InvalidationNotifier we create.
23 public InvalidationHandler { 24 public InvalidationHandler {
24 public: 25 public:
25 // Called on parent thread. |delegate_observer| should be 26 // Called on parent thread. |delegate_observer| should be
26 // initialized. 27 // initialized.
27 explicit Core( 28 explicit Core(
28 const WeakHandle<InvalidationHandler>& delegate_observer); 29 const WeakHandle<InvalidationHandler>& delegate_observer);
29 30
30 // Helpers called on I/O thread. 31 // Helpers called on I/O thread.
31 void Initialize( 32 void Initialize(
32 const notifier::NotifierOptions& notifier_options, 33 const notifier::NotifierOptions& notifier_options,
33 const std::string& invalidator_client_id, 34 const std::string& invalidator_client_id,
34 const InvalidationStateMap& initial_invalidation_state_map, 35 const UnackedInvalidationsMap& saved_invalidations,
35 const std::string& invalidation_bootstrap_data, 36 const std::string& invalidation_bootstrap_data,
36 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, 37 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker,
37 const std::string& client_info); 38 const std::string& client_info);
38 void Teardown(); 39 void Teardown();
39 void UpdateRegisteredIds(const ObjectIdSet& ids); 40 void UpdateRegisteredIds(const ObjectIdSet& ids);
40 void Acknowledge(const invalidation::ObjectId& id,
41 const AckHandle& ack_handle);
42 void UpdateCredentials(const std::string& email, const std::string& token); 41 void UpdateCredentials(const std::string& email, const std::string& token);
43 42
44 // InvalidationHandler implementation (all called on I/O thread by 43 // InvalidationHandler implementation (all called on I/O thread by
45 // InvalidationNotifier). 44 // InvalidationNotifier).
46 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; 45 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE;
47 virtual void OnIncomingInvalidation( 46 virtual void OnIncomingInvalidation(
48 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 47 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE;
49 48
50 private: 49 private:
51 friend class 50 friend class
(...skipping 14 matching lines...) Expand all
66 : delegate_observer_(delegate_observer) { 65 : delegate_observer_(delegate_observer) {
67 DCHECK(delegate_observer_.IsInitialized()); 66 DCHECK(delegate_observer_.IsInitialized());
68 } 67 }
69 68
70 NonBlockingInvalidator::Core::~Core() { 69 NonBlockingInvalidator::Core::~Core() {
71 } 70 }
72 71
73 void NonBlockingInvalidator::Core::Initialize( 72 void NonBlockingInvalidator::Core::Initialize(
74 const notifier::NotifierOptions& notifier_options, 73 const notifier::NotifierOptions& notifier_options,
75 const std::string& invalidator_client_id, 74 const std::string& invalidator_client_id,
76 const InvalidationStateMap& initial_invalidation_state_map, 75 const UnackedInvalidationsMap& saved_invalidations,
77 const std::string& invalidation_bootstrap_data, 76 const std::string& invalidation_bootstrap_data,
78 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, 77 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker,
79 const std::string& client_info) { 78 const std::string& client_info) {
80 DCHECK(notifier_options.request_context_getter.get()); 79 DCHECK(notifier_options.request_context_getter.get());
81 DCHECK_EQ(notifier::NOTIFICATION_SERVER, 80 DCHECK_EQ(notifier::NOTIFICATION_SERVER,
82 notifier_options.notification_method); 81 notifier_options.notification_method);
83 network_task_runner_ = notifier_options.request_context_getter-> 82 network_task_runner_ = notifier_options.request_context_getter->
84 GetNetworkTaskRunner(); 83 GetNetworkTaskRunner();
85 DCHECK(network_task_runner_->BelongsToCurrentThread()); 84 DCHECK(network_task_runner_->BelongsToCurrentThread());
86 invalidation_notifier_.reset( 85 invalidation_notifier_.reset(
87 new InvalidationNotifier( 86 new InvalidationNotifier(
88 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), 87 notifier::PushClient::CreateDefaultOnIOThread(notifier_options),
89 invalidator_client_id, 88 invalidator_client_id,
90 initial_invalidation_state_map, 89 saved_invalidations,
91 invalidation_bootstrap_data, 90 invalidation_bootstrap_data,
92 invalidation_state_tracker, 91 invalidation_state_tracker,
93 client_info)); 92 client_info));
94 invalidation_notifier_->RegisterHandler(this); 93 invalidation_notifier_->RegisterHandler(this);
95 } 94 }
96 95
97 void NonBlockingInvalidator::Core::Teardown() { 96 void NonBlockingInvalidator::Core::Teardown() {
98 DCHECK(network_task_runner_->BelongsToCurrentThread()); 97 DCHECK(network_task_runner_->BelongsToCurrentThread());
99 invalidation_notifier_->UnregisterHandler(this); 98 invalidation_notifier_->UnregisterHandler(this);
100 invalidation_notifier_.reset(); 99 invalidation_notifier_.reset();
101 network_task_runner_ = NULL; 100 network_task_runner_ = NULL;
102 } 101 }
103 102
104 void NonBlockingInvalidator::Core::UpdateRegisteredIds(const ObjectIdSet& ids) { 103 void NonBlockingInvalidator::Core::UpdateRegisteredIds(const ObjectIdSet& ids) {
105 DCHECK(network_task_runner_->BelongsToCurrentThread()); 104 DCHECK(network_task_runner_->BelongsToCurrentThread());
106 invalidation_notifier_->UpdateRegisteredIds(this, ids); 105 invalidation_notifier_->UpdateRegisteredIds(this, ids);
107 } 106 }
108 107
109 void NonBlockingInvalidator::Core::Acknowledge(const invalidation::ObjectId& id,
110 const AckHandle& ack_handle) {
111 DCHECK(network_task_runner_->BelongsToCurrentThread());
112 invalidation_notifier_->Acknowledge(id, ack_handle);
113 }
114
115 void NonBlockingInvalidator::Core::UpdateCredentials(const std::string& email, 108 void NonBlockingInvalidator::Core::UpdateCredentials(const std::string& email,
116 const std::string& token) { 109 const std::string& token) {
117 DCHECK(network_task_runner_->BelongsToCurrentThread()); 110 DCHECK(network_task_runner_->BelongsToCurrentThread());
118 invalidation_notifier_->UpdateCredentials(email, token); 111 invalidation_notifier_->UpdateCredentials(email, token);
119 } 112 }
120 113
121 void NonBlockingInvalidator::Core::OnInvalidatorStateChange( 114 void NonBlockingInvalidator::Core::OnInvalidatorStateChange(
122 InvalidatorState reason) { 115 InvalidatorState reason) {
123 DCHECK(network_task_runner_->BelongsToCurrentThread()); 116 DCHECK(network_task_runner_->BelongsToCurrentThread());
124 delegate_observer_.Call( 117 delegate_observer_.Call(
125 FROM_HERE, &InvalidationHandler::OnInvalidatorStateChange, reason); 118 FROM_HERE, &InvalidationHandler::OnInvalidatorStateChange, reason);
126 } 119 }
127 120
128 void NonBlockingInvalidator::Core::OnIncomingInvalidation( 121 void NonBlockingInvalidator::Core::OnIncomingInvalidation(
129 const ObjectIdInvalidationMap& invalidation_map) { 122 const ObjectIdInvalidationMap& invalidation_map) {
130 DCHECK(network_task_runner_->BelongsToCurrentThread()); 123 DCHECK(network_task_runner_->BelongsToCurrentThread());
131 delegate_observer_.Call(FROM_HERE, 124 delegate_observer_.Call(FROM_HERE,
132 &InvalidationHandler::OnIncomingInvalidation, 125 &InvalidationHandler::OnIncomingInvalidation,
133 invalidation_map); 126 invalidation_map);
134 } 127 }
135 128
136 NonBlockingInvalidator::NonBlockingInvalidator( 129 NonBlockingInvalidator::NonBlockingInvalidator(
137 const notifier::NotifierOptions& notifier_options, 130 const notifier::NotifierOptions& notifier_options,
138 const std::string& invalidator_client_id, 131 const std::string& invalidator_client_id,
139 const InvalidationStateMap& initial_invalidation_state_map, 132 const UnackedInvalidationsMap& saved_invalidations,
140 const std::string& invalidation_bootstrap_data, 133 const std::string& invalidation_bootstrap_data,
141 const WeakHandle<InvalidationStateTracker>& 134 const WeakHandle<InvalidationStateTracker>&
142 invalidation_state_tracker, 135 invalidation_state_tracker,
143 const std::string& client_info) 136 const std::string& client_info)
144 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), 137 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()),
145 network_task_runner_( 138 network_task_runner_(
146 notifier_options.request_context_getter->GetNetworkTaskRunner()), 139 notifier_options.request_context_getter->GetNetworkTaskRunner()),
147 weak_ptr_factory_(this) { 140 weak_ptr_factory_(this) {
148 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); 141 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()));
149 142
150 if (!network_task_runner_->PostTask( 143 if (!network_task_runner_->PostTask(
151 FROM_HERE, 144 FROM_HERE,
152 base::Bind( 145 base::Bind(
153 &NonBlockingInvalidator::Core::Initialize, 146 &NonBlockingInvalidator::Core::Initialize,
154 core_.get(), 147 core_.get(),
155 notifier_options, 148 notifier_options,
156 invalidator_client_id, 149 invalidator_client_id,
157 initial_invalidation_state_map, 150 saved_invalidations,
158 invalidation_bootstrap_data, 151 invalidation_bootstrap_data,
159 invalidation_state_tracker, 152 invalidation_state_tracker,
160 client_info))) { 153 client_info))) {
161 NOTREACHED(); 154 NOTREACHED();
162 } 155 }
163 } 156 }
164 157
165 NonBlockingInvalidator::~NonBlockingInvalidator() { 158 NonBlockingInvalidator::~NonBlockingInvalidator() {
166 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 159 DCHECK(parent_task_runner_->BelongsToCurrentThread());
167 if (!network_task_runner_->PostTask( 160 if (!network_task_runner_->PostTask(
(...skipping 21 matching lines...) Expand all
189 registrar_.GetAllRegisteredIds()))) { 182 registrar_.GetAllRegisteredIds()))) {
190 NOTREACHED(); 183 NOTREACHED();
191 } 184 }
192 } 185 }
193 186
194 void NonBlockingInvalidator::UnregisterHandler(InvalidationHandler* handler) { 187 void NonBlockingInvalidator::UnregisterHandler(InvalidationHandler* handler) {
195 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 188 DCHECK(parent_task_runner_->BelongsToCurrentThread());
196 registrar_.UnregisterHandler(handler); 189 registrar_.UnregisterHandler(handler);
197 } 190 }
198 191
199 void NonBlockingInvalidator::Acknowledge(const invalidation::ObjectId& id,
200 const AckHandle& ack_handle) {
201 DCHECK(parent_task_runner_->BelongsToCurrentThread());
202 if (!network_task_runner_->PostTask(
203 FROM_HERE,
204 base::Bind(
205 &NonBlockingInvalidator::Core::Acknowledge,
206 core_.get(),
207 id,
208 ack_handle))) {
209 NOTREACHED();
210 }
211 }
212
213 InvalidatorState NonBlockingInvalidator::GetInvalidatorState() const { 192 InvalidatorState NonBlockingInvalidator::GetInvalidatorState() const {
214 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 193 DCHECK(parent_task_runner_->BelongsToCurrentThread());
215 return registrar_.GetInvalidatorState(); 194 return registrar_.GetInvalidatorState();
216 } 195 }
217 196
218 void NonBlockingInvalidator::UpdateCredentials(const std::string& email, 197 void NonBlockingInvalidator::UpdateCredentials(const std::string& email,
219 const std::string& token) { 198 const std::string& token) {
220 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 199 DCHECK(parent_task_runner_->BelongsToCurrentThread());
221 if (!network_task_runner_->PostTask( 200 if (!network_task_runner_->PostTask(
222 FROM_HERE, 201 FROM_HERE,
223 base::Bind(&NonBlockingInvalidator::Core::UpdateCredentials, 202 base::Bind(&NonBlockingInvalidator::Core::UpdateCredentials,
224 core_.get(), email, token))) { 203 core_.get(), email, token))) {
225 NOTREACHED(); 204 NOTREACHED();
226 } 205 }
227 } 206 }
228 207
229 void NonBlockingInvalidator::OnInvalidatorStateChange(InvalidatorState state) { 208 void NonBlockingInvalidator::OnInvalidatorStateChange(InvalidatorState state) {
230 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 209 DCHECK(parent_task_runner_->BelongsToCurrentThread());
231 registrar_.UpdateInvalidatorState(state); 210 registrar_.UpdateInvalidatorState(state);
232 } 211 }
233 212
234 void NonBlockingInvalidator::OnIncomingInvalidation( 213 void NonBlockingInvalidator::OnIncomingInvalidation(
235 const ObjectIdInvalidationMap& invalidation_map) { 214 const ObjectIdInvalidationMap& invalidation_map) {
236 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 215 DCHECK(parent_task_runner_->BelongsToCurrentThread());
237 registrar_.DispatchInvalidationsToHandlers(invalidation_map); 216 registrar_.DispatchInvalidationsToHandlers(invalidation_map);
238 } 217 }
239 218
240 } // namespace syncer 219 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/notifier/non_blocking_invalidator.h ('k') | sync/notifier/non_blocking_invalidator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698