| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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::IsIOError(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) { | |
| 560 LOG(ERROR) << "Unable to open backing store - disk is full."; | |
| 561 HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL); | |
| 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 Loading... |
| 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 |
| OLD | NEW |