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

Side by Side Diff: content/browser/indexed_db/indexed_db_backing_store.cc

Issue 26045002: Don't reset the database when there was an I/O error. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: mark enum as deprecated Created 7 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "content/browser/indexed_db/indexed_db_backing_store.h" 5 #include "content/browser/indexed_db/indexed_db_backing_store.h"
6 6
7 #include "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/strings/string_piece.h" 10 #include "base/strings/string_piece.h"
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 INDEXED_DB_BACKING_STORE_OPEN_SUCCESS, 389 INDEXED_DB_BACKING_STORE_OPEN_SUCCESS,
390 INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY, 390 INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY,
391 INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA, 391 INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA,
392 INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED, 392 INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED,
393 INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED, 393 INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED,
394 INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS, 394 INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS,
395 INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA, 395 INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA,
396 INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR, 396 INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR,
397 INDEXED_DB_BACKING_STORE_OPEN_MEMORY_FAILED, 397 INDEXED_DB_BACKING_STORE_OPEN_MEMORY_FAILED,
398 INDEXED_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII, 398 INDEXED_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII,
399 INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL, 399 INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL_DEPRECATED,
400 INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG, 400 INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG,
401 INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY, 401 INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY,
402 INDEXED_DB_BACKING_STORE_OPEN_MAX, 402 INDEXED_DB_BACKING_STORE_OPEN_MAX,
403 }; 403 };
404 404
405 // TODO(dgrogan): Move to leveldb_env.
406 bool RecoveryCouldBeFruitful(leveldb::Status status) {
407 leveldb_env::MethodID method;
408 int error = -1;
409 leveldb_env::ErrorParsingResult result = leveldb_env::ParseMethodAndError(
410 status.ToString().c_str(), &method, &error);
411 switch (result) {
412 case leveldb_env::NONE:
413 return true;
414 case leveldb_env::METHOD_AND_PFE: {
415 base::PlatformFileError pfe = static_cast<base::PlatformFileError>(error);
416 switch (pfe) {
417 case base::PLATFORM_FILE_ERROR_TOO_MANY_OPENED:
418 case base::PLATFORM_FILE_ERROR_NO_MEMORY:
419 case base::PLATFORM_FILE_ERROR_NO_SPACE:
420 return false;
421 default:
422 return true;
423 }
424 }
425 case leveldb_env::METHOD_AND_ERRNO: {
426 switch (error) {
427 case EMFILE:
428 case ENOMEM:
429 case ENOSPC:
430 return false;
431 default:
432 return true;
433 }
434 }
435 default:
436 return true;
437 }
438 return true;
439 }
440
441 scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( 405 scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
442 const std::string& origin_identifier, 406 const std::string& origin_identifier,
443 const base::FilePath& path_base, 407 const base::FilePath& path_base,
444 const std::string& file_identifier, 408 const std::string& file_identifier,
445 WebKit::WebIDBCallbacks::DataLoss* data_loss, 409 WebKit::WebIDBCallbacks::DataLoss* data_loss,
446 bool* disk_full) { 410 bool* disk_full) {
447 *data_loss = WebKit::WebIDBCallbacks::DataLossNone; 411 *data_loss = WebKit::WebIDBCallbacks::DataLossNone;
448 DefaultLevelDBFactory leveldb_factory; 412 DefaultLevelDBFactory leveldb_factory;
449 return IndexedDBBackingStore::Open(origin_identifier, 413 return IndexedDBBackingStore::Open(origin_identifier,
450 path_base, 414 path_base,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 } else if (!known) { 508 } else if (!known) {
545 LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it " 509 LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it "
546 "as failure to open"; 510 "as failure to open";
547 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA); 511 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA);
548 db.reset(); 512 db.reset();
549 } 513 }
550 } 514 }
551 515
552 if (db) { 516 if (db) {
553 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_SUCCESS); 517 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_SUCCESS);
554 } else if (!RecoveryCouldBeFruitful(status)) { 518 } else if (!leveldb_env::RecoveryCouldBeFruitful(status)) {
555 LOG(ERROR) << "Unable to open backing store, not trying to recover - " 519 LOG(ERROR) << "Unable to open backing store, not trying to recover - "
556 << status.ToString(); 520 << status.ToString();
557 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY); 521 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY);
558 return scoped_refptr<IndexedDBBackingStore>(); 522 return scoped_refptr<IndexedDBBackingStore>();
559 } else if (*is_disk_full) {
jsbell 2013/10/04 23:32:33 Just to confirm my reading: * RecoveryCouldBeFrui
dgrogan 2013/10/05 01:06:16 This could be reached if there was <100k free spac
560 LOG(ERROR) << "Unable to open backing store - disk is full.";
561 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL);
jsbell 2013/10/04 23:32:33 I'm guessing we're not gaining anything by logging
dgrogan 2013/10/05 01:06:16 Yeah, we still have https://uma.googleplex.com/his
562 return scoped_refptr<IndexedDBBackingStore>();
563 } else { 523 } else {
564 LOG(ERROR) << "IndexedDB backing store open failed, attempting cleanup"; 524 LOG(ERROR) << "IndexedDB backing store open failed, attempting cleanup";
565 *data_loss = WebKit::WebIDBCallbacks::DataLossTotal; 525 *data_loss = WebKit::WebIDBCallbacks::DataLossTotal;
566 bool success = leveldb_factory->DestroyLevelDB(file_path); 526 bool success = leveldb_factory->DestroyLevelDB(file_path);
567 if (!success) { 527 if (!success) {
568 LOG(ERROR) << "IndexedDB backing store cleanup failed"; 528 LOG(ERROR) << "IndexedDB backing store cleanup failed";
569 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED); 529 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED);
570 return scoped_refptr<IndexedDBBackingStore>(); 530 return scoped_refptr<IndexedDBBackingStore>();
571 } 531 }
572 532
(...skipping 2000 matching lines...) Expand 10 before | Expand all | Expand 10 after
2573 } 2533 }
2574 2534
2575 void IndexedDBBackingStore::Transaction::Rollback() { 2535 void IndexedDBBackingStore::Transaction::Rollback() {
2576 IDB_TRACE("IndexedDBBackingStore::Transaction::Rollback"); 2536 IDB_TRACE("IndexedDBBackingStore::Transaction::Rollback");
2577 DCHECK(transaction_.get()); 2537 DCHECK(transaction_.get());
2578 transaction_->Rollback(); 2538 transaction_->Rollback();
2579 transaction_ = NULL; 2539 transaction_ = NULL;
2580 } 2540 }
2581 2541
2582 } // namespace content 2542 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698