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

Side by Side Diff: components/ntp_snippets/ntp_snippets_database.cc

Issue 2083533002: [NTP Snippets] Shut down the service on database failure (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@image_db_tests
Patch Set: comments Created 4 years, 6 months 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
OLDNEW
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 "components/ntp_snippets/ntp_snippets_database.h" 5 #include "components/ntp_snippets/ntp_snippets_database.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "components/leveldb_proto/proto_database_impl.h" 10 #include "components/leveldb_proto/proto_database_impl.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 43
44 base::FilePath image_dir = database_dir.AppendASCII(kImageDatabaseFolder); 44 base::FilePath image_dir = database_dir.AppendASCII(kImageDatabaseFolder);
45 image_database_->Init(kImageDatabaseUMAClientName, image_dir, 45 image_database_->Init(kImageDatabaseUMAClientName, image_dir,
46 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseInited, 46 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseInited,
47 weak_ptr_factory_.GetWeakPtr())); 47 weak_ptr_factory_.GetWeakPtr()));
48 } 48 }
49 49
50 NTPSnippetsDatabase::~NTPSnippetsDatabase() {} 50 NTPSnippetsDatabase::~NTPSnippetsDatabase() {}
51 51
52 bool NTPSnippetsDatabase::IsInitialized() const { 52 bool NTPSnippetsDatabase::IsInitialized() const {
53 return database_ && database_initialized_ && image_database_ && 53 return !IsErrorState() && database_initialized_ &&
54 image_database_initialized_; 54 image_database_initialized_;
55 } 55 }
56 56
57 bool NTPSnippetsDatabase::IsErrorState() const {
58 return !database_ || !image_database_;
59 }
60
61 void NTPSnippetsDatabase::SetErrorCallback(
62 const base::Closure& error_callback) {
63 error_callback_ = error_callback;
64 }
65
57 void NTPSnippetsDatabase::LoadSnippets(const SnippetsCallback& callback) { 66 void NTPSnippetsDatabase::LoadSnippets(const SnippetsCallback& callback) {
58 if (IsInitialized()) 67 if (IsInitialized())
59 LoadSnippetsImpl(callback); 68 LoadSnippetsImpl(callback);
60 else 69 else
61 pending_snippets_callbacks_.emplace_back(callback); 70 pending_snippets_callbacks_.emplace_back(callback);
62 } 71 }
63 72
64 void NTPSnippetsDatabase::SaveSnippet(const NTPSnippet& snippet) { 73 void NTPSnippetsDatabase::SaveSnippet(const NTPSnippet& snippet) {
65 std::unique_ptr<KeyEntryVector> entries_to_save(new KeyEntryVector()); 74 std::unique_ptr<KeyEntryVector> entries_to_save(new KeyEntryVector());
66 entries_to_save->emplace_back(snippet.id(), snippet.ToProto()); 75 entries_to_save->emplace_back(snippet.id(), snippet.ToProto());
(...skipping 24 matching lines...) Expand all
91 void NTPSnippetsDatabase::LoadImage(const std::string& snippet_id, 100 void NTPSnippetsDatabase::LoadImage(const std::string& snippet_id,
92 const SnippetImageCallback& callback) { 101 const SnippetImageCallback& callback) {
93 if (IsInitialized()) 102 if (IsInitialized())
94 LoadImageImpl(snippet_id, callback); 103 LoadImageImpl(snippet_id, callback);
95 else 104 else
96 pending_image_callbacks_.emplace_back(snippet_id, callback); 105 pending_image_callbacks_.emplace_back(snippet_id, callback);
97 } 106 }
98 107
99 void NTPSnippetsDatabase::SaveImage(const std::string& snippet_id, 108 void NTPSnippetsDatabase::SaveImage(const std::string& snippet_id,
100 const std::string& image_data) { 109 const std::string& image_data) {
101 // TODO(treib): After we pass errors to the client, DCHECK(IsInitialized()). 110 DCHECK(IsInitialized());
102 if (!IsInitialized())
103 return;
104 111
105 SnippetImageProto image_proto; 112 SnippetImageProto image_proto;
106 image_proto.set_data(image_data); 113 image_proto.set_data(image_data);
107 114
108 std::unique_ptr<ImageKeyEntryVector> entries_to_save( 115 std::unique_ptr<ImageKeyEntryVector> entries_to_save(
109 new ImageKeyEntryVector()); 116 new ImageKeyEntryVector());
110 entries_to_save->emplace_back(snippet_id, std::move(image_proto)); 117 entries_to_save->emplace_back(snippet_id, std::move(image_proto));
111 118
112 image_database_->UpdateEntries( 119 image_database_->UpdateEntries(
113 std::move(entries_to_save), 120 std::move(entries_to_save),
114 base::WrapUnique(new std::vector<std::string>()), 121 base::WrapUnique(new std::vector<std::string>()),
115 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseSaved, 122 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseSaved,
116 weak_ptr_factory_.GetWeakPtr())); 123 weak_ptr_factory_.GetWeakPtr()));
117 } 124 }
118 125
119 void NTPSnippetsDatabase::DeleteImage(const std::string& snippet_id) { 126 void NTPSnippetsDatabase::DeleteImage(const std::string& snippet_id) {
120 DeleteImagesImpl( 127 DeleteImagesImpl(
121 base::WrapUnique(new std::vector<std::string>(1, snippet_id))); 128 base::WrapUnique(new std::vector<std::string>(1, snippet_id)));
122 } 129 }
123 130
124 void NTPSnippetsDatabase::OnDatabaseInited(bool success) { 131 void NTPSnippetsDatabase::OnDatabaseInited(bool success) {
125 DCHECK(!database_initialized_); 132 DCHECK(!database_initialized_);
126 if (!success) { 133 if (!success) {
127 DVLOG(1) << "NTPSnippetsDatabase init failed."; 134 DVLOG(1) << "NTPSnippetsDatabase init failed.";
128 ResetDatabases(); 135 OnDatabaseError();
129 return; 136 return;
130 } 137 }
131 database_initialized_ = true; 138 database_initialized_ = true;
132 if (IsInitialized()) 139 if (IsInitialized())
133 ProcessPendingLoads(); 140 ProcessPendingLoads();
134 } 141 }
135 142
136 void NTPSnippetsDatabase::OnDatabaseLoaded( 143 void NTPSnippetsDatabase::OnDatabaseLoaded(
137 const SnippetsCallback& callback, 144 const SnippetsCallback& callback,
138 bool success, 145 bool success,
139 std::unique_ptr<std::vector<SnippetProto>> entries) { 146 std::unique_ptr<std::vector<SnippetProto>> entries) {
140 if (!success) { 147 if (!success) {
141 DVLOG(1) << "NTPSnippetsDatabase load failed."; 148 DVLOG(1) << "NTPSnippetsDatabase load failed.";
142 ResetDatabases(); 149 OnDatabaseError();
143 return; 150 return;
144 } 151 }
145 152
146 std::unique_ptr<std::vector<std::string>> keys_to_remove( 153 std::unique_ptr<std::vector<std::string>> keys_to_remove(
147 new std::vector<std::string>()); 154 new std::vector<std::string>());
148 155
149 NTPSnippet::PtrVector snippets; 156 NTPSnippet::PtrVector snippets;
150 for (const SnippetProto& proto : *entries) { 157 for (const SnippetProto& proto : *entries) {
151 std::unique_ptr<NTPSnippet> snippet = NTPSnippet::CreateFromProto(proto); 158 std::unique_ptr<NTPSnippet> snippet = NTPSnippet::CreateFromProto(proto);
152 if (snippet) { 159 if (snippet) {
153 snippets.emplace_back(std::move(snippet)); 160 snippets.emplace_back(std::move(snippet));
154 } else { 161 } else {
155 LOG(WARNING) << "Invalid proto from DB " << proto.id(); 162 LOG(WARNING) << "Invalid proto from DB " << proto.id();
156 keys_to_remove->emplace_back(proto.id()); 163 keys_to_remove->emplace_back(proto.id());
157 } 164 }
158 } 165 }
159 166
160 callback.Run(std::move(snippets)); 167 callback.Run(std::move(snippets));
161 168
162 // If any of the snippet protos couldn't be converted to actual snippets, 169 // If any of the snippet protos couldn't be converted to actual snippets,
163 // clean them up now. 170 // clean them up now.
164 if (!keys_to_remove->empty()) 171 if (!keys_to_remove->empty())
165 DeleteSnippetsImpl(std::move(keys_to_remove)); 172 DeleteSnippetsImpl(std::move(keys_to_remove));
166 } 173 }
167 174
168 void NTPSnippetsDatabase::OnDatabaseSaved(bool success) { 175 void NTPSnippetsDatabase::OnDatabaseSaved(bool success) {
169 if (!success) { 176 if (!success) {
170 DVLOG(1) << "NTPSnippetsDatabase save failed."; 177 DVLOG(1) << "NTPSnippetsDatabase save failed.";
171 ResetDatabases(); 178 OnDatabaseError();
172 } 179 }
173 } 180 }
174 181
175 void NTPSnippetsDatabase::OnImageDatabaseInited(bool success) { 182 void NTPSnippetsDatabase::OnImageDatabaseInited(bool success) {
176 DCHECK(!image_database_initialized_); 183 DCHECK(!image_database_initialized_);
177 if (!success) { 184 if (!success) {
178 DVLOG(1) << "NTPSnippetsDatabase init failed."; 185 DVLOG(1) << "NTPSnippetsDatabase init failed.";
179 ResetDatabases(); 186 OnDatabaseError();
180 return; 187 return;
181 } 188 }
182 image_database_initialized_ = true; 189 image_database_initialized_ = true;
183 if (IsInitialized()) 190 if (IsInitialized())
184 ProcessPendingLoads(); 191 ProcessPendingLoads();
185 } 192 }
186 193
187 void NTPSnippetsDatabase::OnImageDatabaseLoaded( 194 void NTPSnippetsDatabase::OnImageDatabaseLoaded(
188 const SnippetImageCallback& callback, 195 const SnippetImageCallback& callback,
189 bool success, 196 bool success,
190 std::unique_ptr<SnippetImageProto> entry) { 197 std::unique_ptr<SnippetImageProto> entry) {
191 if (!success) { 198 if (!success) {
192 DVLOG(1) << "NTPSnippetsDatabase load failed."; 199 DVLOG(1) << "NTPSnippetsDatabase load failed.";
193 ResetDatabases(); 200 OnDatabaseError();
194 return; 201 return;
195 } 202 }
196 203
197 if (!entry) { 204 if (!entry) {
198 callback.Run(std::string()); 205 callback.Run(std::string());
199 return; 206 return;
200 } 207 }
201 208
202 std::unique_ptr<std::string> data(entry->release_data()); 209 std::unique_ptr<std::string> data(entry->release_data());
203 callback.Run(std::move(*data)); 210 callback.Run(std::move(*data));
204 } 211 }
205 212
206 void NTPSnippetsDatabase::OnImageDatabaseSaved(bool success) { 213 void NTPSnippetsDatabase::OnImageDatabaseSaved(bool success) {
207 if (!success) { 214 if (!success) {
208 DVLOG(1) << "NTPSnippetsDatabase save failed."; 215 DVLOG(1) << "NTPSnippetsDatabase save failed.";
209 ResetDatabases(); 216 OnDatabaseError();
210 } 217 }
211 } 218 }
212 219
220 void NTPSnippetsDatabase::OnDatabaseError() {
221 database_.reset();
222 image_database_.reset();
223 if (!error_callback_.is_null())
224 error_callback_.Run();
225 }
226
213 void NTPSnippetsDatabase::ProcessPendingLoads() { 227 void NTPSnippetsDatabase::ProcessPendingLoads() {
214 DCHECK(IsInitialized()); 228 DCHECK(IsInitialized());
215 229
216 for (const auto& callback : pending_snippets_callbacks_) 230 for (const auto& callback : pending_snippets_callbacks_)
217 LoadSnippetsImpl(callback); 231 LoadSnippetsImpl(callback);
218 pending_snippets_callbacks_.clear(); 232 pending_snippets_callbacks_.clear();
219 233
220 for (const auto& id_callback : pending_image_callbacks_) 234 for (const auto& id_callback : pending_image_callbacks_)
221 LoadImageImpl(id_callback.first, id_callback.second); 235 LoadImageImpl(id_callback.first, id_callback.second);
222 pending_image_callbacks_.clear(); 236 pending_image_callbacks_.clear();
223 } 237 }
224 238
225 void NTPSnippetsDatabase::LoadSnippetsImpl(const SnippetsCallback& callback) { 239 void NTPSnippetsDatabase::LoadSnippetsImpl(const SnippetsCallback& callback) {
226 DCHECK(IsInitialized()); 240 DCHECK(IsInitialized());
227 database_->LoadEntries(base::Bind(&NTPSnippetsDatabase::OnDatabaseLoaded, 241 database_->LoadEntries(base::Bind(&NTPSnippetsDatabase::OnDatabaseLoaded,
228 weak_ptr_factory_.GetWeakPtr(), 242 weak_ptr_factory_.GetWeakPtr(),
229 callback)); 243 callback));
230 } 244 }
231 245
232 void NTPSnippetsDatabase::SaveSnippetsImpl( 246 void NTPSnippetsDatabase::SaveSnippetsImpl(
233 std::unique_ptr<KeyEntryVector> entries_to_save) { 247 std::unique_ptr<KeyEntryVector> entries_to_save) {
234 // TODO(treib): After we pass errors to the client, DCHECK(IsInitialized()). 248 DCHECK(IsInitialized());
235 if (!IsInitialized())
236 return;
237 249
238 std::unique_ptr<std::vector<std::string>> keys_to_remove( 250 std::unique_ptr<std::vector<std::string>> keys_to_remove(
239 new std::vector<std::string>()); 251 new std::vector<std::string>());
240 database_->UpdateEntries(std::move(entries_to_save), 252 database_->UpdateEntries(std::move(entries_to_save),
241 std::move(keys_to_remove), 253 std::move(keys_to_remove),
242 base::Bind(&NTPSnippetsDatabase::OnDatabaseSaved, 254 base::Bind(&NTPSnippetsDatabase::OnDatabaseSaved,
243 weak_ptr_factory_.GetWeakPtr())); 255 weak_ptr_factory_.GetWeakPtr()));
244 } 256 }
245 257
246 void NTPSnippetsDatabase::DeleteSnippetsImpl( 258 void NTPSnippetsDatabase::DeleteSnippetsImpl(
247 std::unique_ptr<std::vector<std::string>> keys_to_remove) { 259 std::unique_ptr<std::vector<std::string>> keys_to_remove) {
248 // TODO(treib): After we pass errors to the client, DCHECK(IsInitialized()). 260 DCHECK(IsInitialized());
249 if (!IsInitialized())
250 return;
251 261
252 DeleteImagesImpl( 262 DeleteImagesImpl(
253 base::WrapUnique(new std::vector<std::string>(*keys_to_remove))); 263 base::WrapUnique(new std::vector<std::string>(*keys_to_remove)));
254 264
255 std::unique_ptr<KeyEntryVector> entries_to_save(new KeyEntryVector()); 265 std::unique_ptr<KeyEntryVector> entries_to_save(new KeyEntryVector());
256 database_->UpdateEntries(std::move(entries_to_save), 266 database_->UpdateEntries(std::move(entries_to_save),
257 std::move(keys_to_remove), 267 std::move(keys_to_remove),
258 base::Bind(&NTPSnippetsDatabase::OnDatabaseSaved, 268 base::Bind(&NTPSnippetsDatabase::OnDatabaseSaved,
259 weak_ptr_factory_.GetWeakPtr())); 269 weak_ptr_factory_.GetWeakPtr()));
260 } 270 }
261 271
262 void NTPSnippetsDatabase::LoadImageImpl(const std::string& snippet_id, 272 void NTPSnippetsDatabase::LoadImageImpl(const std::string& snippet_id,
263 const SnippetImageCallback& callback) { 273 const SnippetImageCallback& callback) {
264 DCHECK(IsInitialized()); 274 DCHECK(IsInitialized());
265 image_database_->GetEntry( 275 image_database_->GetEntry(
266 snippet_id, 276 snippet_id,
267 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseLoaded, 277 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseLoaded,
268 weak_ptr_factory_.GetWeakPtr(), callback)); 278 weak_ptr_factory_.GetWeakPtr(), callback));
269 } 279 }
270 280
271 void NTPSnippetsDatabase::DeleteImagesImpl( 281 void NTPSnippetsDatabase::DeleteImagesImpl(
272 std::unique_ptr<std::vector<std::string>> keys_to_remove) { 282 std::unique_ptr<std::vector<std::string>> keys_to_remove) {
273 // TODO(treib): After we pass errors to the client, DCHECK(IsInitialized()). 283 DCHECK(IsInitialized());
274 if (!IsInitialized())
275 return;
276 284
277 image_database_->UpdateEntries( 285 image_database_->UpdateEntries(
278 base::WrapUnique(new ImageKeyEntryVector()), 286 base::WrapUnique(new ImageKeyEntryVector()),
279 std::move(keys_to_remove), 287 std::move(keys_to_remove),
280 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseSaved, 288 base::Bind(&NTPSnippetsDatabase::OnImageDatabaseSaved,
281 weak_ptr_factory_.GetWeakPtr())); 289 weak_ptr_factory_.GetWeakPtr()));
282 } 290 }
283 291
284 void NTPSnippetsDatabase::ResetDatabases() {
285 database_.reset();
286 image_database_.reset();
287 }
288
289 } // namespace ntp_snippets 292 } // namespace ntp_snippets
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698