Changeset 110463 in webkit


Ignore:
Timestamp:
Mar 12, 2012 12:57:00 PM (12 years ago)
Author:
jsbell@chromium.org
Message:

IndexedDB: Handle LevelDB database corruption
https://bugs.webkit.org/show_bug.cgi?id=79413

Source/WebCore:

Add LevelDBDatabase::destroy() method so that clients can retry if open() fails.

Reviewed by Tony Chang.

Test: webkit_unit_tests --gtest_filter='LevelDBDatabaseTest.CorruptionTest'

  • Modules/indexeddb/IDBLevelDBBackingStore.cpp: Implement open/destroy/open strategy.

(WebCore::IDBLevelDBBackingStore::open):

  • platform/leveldb/LevelDBDatabase.cpp:

(WebCore::LevelDBDatabase::destroy):
(WebCore):

  • platform/leveldb/LevelDBDatabase.h:

(LevelDBDatabase):

Source/WebKit/chromium:

Reviewed by Tony Chang.

  • WebKit.gyp: Skip LevelDBTest.cpp in shared component builds due to webkit_support dependency
  • WebKit.gypi: Add LevelDBTest.cpp
  • tests/LevelDBTest.cpp: Added.

(WebCore):
(SimpleComparator):
(WebCore::SimpleComparator::compare):
(WebCore::SimpleComparator::name):
(WebCore::encodeString):
(WebCore::TEST):

Location:
trunk/Source
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r110456 r110463  
     12012-03-12  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Handle LevelDB database corruption
     4        https://bugs.webkit.org/show_bug.cgi?id=79413
     5
     6        Add LevelDBDatabase::destroy() method so that clients can retry if open() fails.
     7
     8        Reviewed by Tony Chang.
     9
     10        Test: webkit_unit_tests --gtest_filter='LevelDBDatabaseTest.CorruptionTest'
     11
     12        * Modules/indexeddb/IDBLevelDBBackingStore.cpp: Implement open/destroy/open strategy.
     13        (WebCore::IDBLevelDBBackingStore::open):
     14        * platform/leveldb/LevelDBDatabase.cpp:
     15        (WebCore::LevelDBDatabase::destroy):
     16        (WebCore):
     17        * platform/leveldb/LevelDBDatabase.h:
     18        (LevelDBDatabase):
     19
    1202012-03-11  Shawn Singh  <shawnsingh@chromium.org>
    221
  • trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp

    r110373 r110463  
    151151
    152152        db = LevelDBDatabase::open(path, comparator.get());
     153
     154        if (!db) {
     155            LOG_ERROR("IndexedDB backing store open failed, attempting cleanup");
     156            bool success = LevelDBDatabase::destroy(path);
     157            if (!success) {
     158                LOG_ERROR("IndexedDB backing store cleanup failed");
     159                return PassRefPtr<IDBBackingStore>();
     160            }
     161
     162            LOG_ERROR("IndexedDB backing store cleanup succeeded, reopening");
     163            db = LevelDBDatabase::open(path, comparator.get());
     164            if (!db) {
     165                LOG_ERROR("IndexedDB backing store reopen after recovery failed");
     166                return PassRefPtr<IDBBackingStore>();
     167            }
     168        }
    153169    }
    154170
  • trunk/Source/WebCore/platform/leveldb/LevelDBDatabase.cpp

    r110373 r110463  
    113113}
    114114
     115bool LevelDBDatabase::destroy(const String& fileName)
     116{
     117    leveldb::Options options;
     118    const leveldb::Status s = leveldb::DestroyDB(fileName.utf8().data(), options);
     119    return s.ok();
     120}
     121
    115122PassOwnPtr<LevelDBDatabase> LevelDBDatabase::open(const String& fileName, const LevelDBComparator* comparator)
    116123{
  • trunk/Source/WebCore/platform/leveldb/LevelDBDatabase.h

    r110373 r110463  
    5151    static PassOwnPtr<LevelDBDatabase> open(const String& fileName, const LevelDBComparator*);
    5252    static PassOwnPtr<LevelDBDatabase> openInMemory(const LevelDBComparator*);
     53    static bool destroy(const String& fileName);
    5354    ~LevelDBDatabase();
    5455
  • trunk/Source/WebKit/chromium/ChangeLog

    r110433 r110463  
     12012-03-12  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Handle LevelDB database corruption
     4        https://bugs.webkit.org/show_bug.cgi?id=79413
     5
     6        Reviewed by Tony Chang.
     7
     8        * WebKit.gyp: Skip LevelDBTest.cpp in shared component builds due to webkit_support dependency
     9        * WebKit.gypi: Add LevelDBTest.cpp
     10        * tests/LevelDBTest.cpp: Added.
     11        (WebCore):
     12        (SimpleComparator):
     13        (WebCore::SimpleComparator::compare):
     14        (WebCore::SimpleComparator::name):
     15        (WebCore::encodeString):
     16        (WebCore::TEST):
     17
    1182012-03-12  Dana Jansens  <danakj@chromium.org>
    219
  • trunk/Source/WebKit/chromium/WebKit.gyp

    r110056 r110463  
    749749                                'tests/AssociatedURLLoaderTest.cpp',
    750750                                'tests/FrameTestHelpers.cpp',
     751                                'tests/LevelDBTest.cpp',
    751752                                'tests/PopupMenuTest.cpp',
    752753                                'tests/RenderTableCellTest.cpp',
  • trunk/Source/WebKit/chromium/WebKit.gypi

    r110373 r110463  
    108108            'tests/LayerChromiumTest.cpp',
    109109            'tests/LayerTextureUpdaterTest.cpp',
     110            'tests/LevelDBTest.cpp',
    110111            'tests/LocalizedNumberICUTest.cpp',
    111112            'tests/PaintAggregatorTest.cpp',
Note: See TracChangeset for help on using the changeset viewer.