⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 98749 in webkit


Ignore:
Timestamp:
Oct 28, 2011, 12:22:27 PM (15 years ago)
Author:
commit-queue@webkit.org
Message:

IndexedDB: Database metadata changes should be tied to transaction
https://bugs.webkit.org/show_bug.cgi?id=70974

Patch by Joshua Bell <jsbell@chromium.org> on 2011-10-28
Reviewed by Tony Chang.

Source/WebCore:

Database metadata (that is, the version string) was rolled back
on abort by an abort task. If the abort task didn't run e.g.
due to a crash, the metadata would not be reverted. All of the
other store/index/data changes were written into the transaction
itself, so the metadata now is too. Refactored the metadata
get/create/update methods for clarity as well.

Note that the new tests don't actually verify that the code handles
this case; that will need to be done with persistence tests
that span multiple runs of the browser and induce crashes.
The new tests do verify that these changes don't cause regressions
not caught by other tests.

Tests: storage/indexeddb/open-during-transaction.html

storage/indexeddb/version-change-abort.html

  • storage/IDBBackingStore.h:
  • storage/IDBDatabaseBackendImpl.cpp:

(WebCore::IDBDatabaseBackendImpl::IDBDatabaseBackendImpl):
(WebCore::IDBDatabaseBackendImpl::setVersionInternal):

  • storage/IDBLevelDBBackingStore.cpp:

(WebCore::IDBLevelDBBackingStore::getIDBDatabaseMetaData):
(WebCore::IDBLevelDBBackingStore::createIDBDatabaseMetaData):
(WebCore::IDBLevelDBBackingStore::updateIDBDatabaseMetaData):

  • storage/IDBLevelDBBackingStore.h:

LayoutTests:

  • storage/indexeddb/open-during-transaction-expected.txt: Added.
  • storage/indexeddb/open-during-transaction.html: Added.
  • storage/indexeddb/version-change-abort-expected.txt: Added.
  • storage/indexeddb/version-change-abort.html: Added.
Location:
trunk
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r98746 r98749  
     12011-10-28  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Database metadata changes should be tied to transaction
     4        https://bugs.webkit.org/show_bug.cgi?id=70974
     5
     6        Reviewed by Tony Chang.
     7
     8        * storage/indexeddb/open-during-transaction-expected.txt: Added.
     9        * storage/indexeddb/open-during-transaction.html: Added.
     10        * storage/indexeddb/version-change-abort-expected.txt: Added.
     11        * storage/indexeddb/version-change-abort.html: Added.
     12
    1132011-10-28  Simon Fraser  <simon.fraser@apple.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r98748 r98749  
     12011-10-28  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Database metadata changes should be tied to transaction
     4        https://bugs.webkit.org/show_bug.cgi?id=70974
     5
     6        Reviewed by Tony Chang.
     7
     8        Database metadata (that is, the version string) was rolled back
     9        on abort by an abort task. If the abort task didn't run e.g.
     10        due to a crash, the metadata would not be reverted. All of the
     11        other store/index/data changes were written into the transaction
     12        itself, so the metadata now is too. Refactored the metadata
     13        get/create/update methods for clarity as well.
     14
     15        Note that the new tests don't actually verify that the code handles
     16        this case; that will need to be done with persistence tests
     17        that span multiple runs of the browser and induce crashes.
     18        The new tests do verify that these changes don't cause regressions
     19        not caught by other tests.
     20
     21        Tests: storage/indexeddb/open-during-transaction.html
     22               storage/indexeddb/version-change-abort.html
     23
     24        * storage/IDBBackingStore.h:
     25        * storage/IDBDatabaseBackendImpl.cpp:
     26        (WebCore::IDBDatabaseBackendImpl::IDBDatabaseBackendImpl):
     27        (WebCore::IDBDatabaseBackendImpl::setVersionInternal):
     28        * storage/IDBLevelDBBackingStore.cpp:
     29        (WebCore::IDBLevelDBBackingStore::getIDBDatabaseMetaData):
     30        (WebCore::IDBLevelDBBackingStore::createIDBDatabaseMetaData):
     31        (WebCore::IDBLevelDBBackingStore::updateIDBDatabaseMetaData):
     32        * storage/IDBLevelDBBackingStore.h:
     33
    1342011-10-28  Luke Macpherson   <macpherson@chromium.org>
    235
  • trunk/Source/WebCore/storage/IDBBackingStore.h

    r97453 r98749  
    4848
    4949    virtual void getDatabaseNames(Vector<String>& foundNames) = 0;
    50     virtual bool extractIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId) = 0;
    51     virtual bool setIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId, bool invalidRowId) = 0;
     50    virtual bool getIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId) = 0;
     51    virtual bool createIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId) = 0;
     52    virtual bool updateIDBDatabaseMetaData(int64_t rowId, const String& version) = 0;
    5253
    5354    virtual void getObjectStores(int64_t databaseId, Vector<int64_t>& foundIds, Vector<String>& foundNames, Vector<String>& foundKeyPaths, Vector<bool>& foundAutoIncrementFlags) = 0;
  • trunk/Source/WebCore/storage/IDBDatabaseBackendImpl.cpp

    r97417 r98749  
    8989    ASSERT(!m_name.isNull());
    9090
    91     bool success = m_backingStore->extractIDBDatabaseMetaData(m_name, m_version, m_id);
    92     ASSERT_UNUSED(success, success == (m_id != InvalidId));
    93     if (!m_backingStore->setIDBDatabaseMetaData(m_name, m_version, m_id, m_id == InvalidId))
     91    bool success = m_backingStore->getIDBDatabaseMetaData(m_name, m_version, m_id);
     92    ASSERT(success == (m_id != InvalidId));
     93    if (!success && !m_backingStore->createIDBDatabaseMetaData(m_name, m_version, m_id))
    9494        ASSERT_NOT_REACHED(); // FIXME: Need better error handling.
    9595    loadObjectStores();
     
    219219    int64_t databaseId = database->id();
    220220    database->m_version = version;
    221     if (!database->m_backingStore->setIDBDatabaseMetaData(database->m_name, database->m_version, databaseId, databaseId == InvalidId)) {
     221    if (!database->m_backingStore->updateIDBDatabaseMetaData(databaseId, database->m_version)) {
    222222        // FIXME: The Indexed Database specification does not have an error code dedicated to I/O errors.
    223223        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Error writing data to stable storage."));
  • trunk/Source/WebCore/storage/IDBLevelDBBackingStore.cpp

    r97453 r98749  
    187187}
    188188
    189 bool IDBLevelDBBackingStore::extractIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId)
     189bool IDBLevelDBBackingStore::getIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId)
    190190{
    191191    const Vector<char> key = DatabaseNameKey::encode(m_identifier, name);
     
    217217}
    218218
    219 bool IDBLevelDBBackingStore::setIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId, bool invalidRowId)
    220 {
    221     if (invalidRowId) {
    222         rowId = getNewDatabaseId(m_db.get());
    223         if (rowId < 0)
    224             return false;
    225 
    226         const Vector<char> key = DatabaseNameKey::encode(m_identifier, name);
    227         if (!putInt(m_db.get(), key, rowId))
    228             return false;
    229     }
    230 
     219bool IDBLevelDBBackingStore::createIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId)
     220{
     221    rowId = getNewDatabaseId(m_db.get());
     222    if (rowId < 0)
     223        return false;
     224
     225    const Vector<char> key = DatabaseNameKey::encode(m_identifier, name);
     226    if (!putInt(m_db.get(), key, rowId))
     227        return false;
    231228    if (!putString(m_db.get(), DatabaseMetaDataKey::encode(rowId, DatabaseMetaDataKey::kUserVersion), version))
     229        return false;
     230    return true;
     231}
     232
     233bool IDBLevelDBBackingStore::updateIDBDatabaseMetaData(int64_t rowId, const String& version)
     234{
     235    ASSERT(m_currentTransaction);
     236    if (!putString(m_currentTransaction.get(), DatabaseMetaDataKey::encode(rowId, DatabaseMetaDataKey::kUserVersion), version))
    232237        return false;
    233238
  • trunk/Source/WebCore/storage/IDBLevelDBBackingStore.h

    r97453 r98749  
    4646
    4747    virtual void getDatabaseNames(Vector<String>& foundNames);
    48     virtual bool extractIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId);
    49     virtual bool setIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId, bool invalidRowId);
     48    virtual bool getIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId);
     49    virtual bool createIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId);
     50    virtual bool updateIDBDatabaseMetaData(int64_t rowId, const String& version);
    5051
    5152    virtual void getObjectStores(int64_t databaseId, Vector<int64_t>& foundIds, Vector<String>& foundNames, Vector<String>& foundKeyPaths, Vector<bool>& foundAutoIncrementFlags);
Note: See TracChangeset for help on using the changeset viewer.