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

Changeset 241468 in webkit


Ignore:
Timestamp:
Feb 13, 2019, 1:32:44 PM (8 years ago)
Author:
sihui_liu@apple.com
Message:

REGRESSION: [ Mac Debug WK2 ] Layout Test storage/indexeddb/key-type-infinity-private.html is a flaky crash
https://bugs.webkit.org/show_bug.cgi?id=194413
<rdar://problem/47897254>

Reviewed by Brady Eidson.

IDB clients expected transaction operations to be executed in order, but in
UniqueIDBDatabase::immediateCloseForUserDelete, callbacks in callback map were errored out randomly.
This patch added a callback queue to UniqueIDBDatabase to make sure callbacks will be called in the same order
as IDB Server receives the request.

  • Modules/indexeddb/server/UniqueIDBDatabase.cpp:

(WebCore::IDBServer::UniqueIDBDatabase::storeCallbackOrFireError):
(WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete):
(WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback):
(WebCore::IDBServer::UniqueIDBDatabase::performKeyDataCallback):
(WebCore::IDBServer::UniqueIDBDatabase::performGetResultCallback):
(WebCore::IDBServer::UniqueIDBDatabase::performGetAllResultsCallback):
(WebCore::IDBServer::UniqueIDBDatabase::performCountCallback):
(WebCore::IDBServer::UniqueIDBDatabase::forgetErrorCallback):

  • Modules/indexeddb/server/UniqueIDBDatabase.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r241451 r241468  
     12019-02-13  Sihui Liu  <sihui_liu@apple.com>
     2
     3        REGRESSION: [ Mac Debug WK2 ] Layout Test storage/indexeddb/key-type-infinity-private.html is a flaky crash
     4        https://bugs.webkit.org/show_bug.cgi?id=194413
     5        <rdar://problem/47897254>
     6
     7        Reviewed by Brady Eidson.
     8
     9        IDB clients expected transaction operations to be executed in order, but in
     10        UniqueIDBDatabase::immediateCloseForUserDelete, callbacks in callback map were errored out randomly.
     11        This patch added a callback queue to UniqueIDBDatabase to make sure callbacks will be called in the same order
     12        as IDB Server receives the request.
     13
     14        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     15        (WebCore::IDBServer::UniqueIDBDatabase::storeCallbackOrFireError):
     16        (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete):
     17        (WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback):
     18        (WebCore::IDBServer::UniqueIDBDatabase::performKeyDataCallback):
     19        (WebCore::IDBServer::UniqueIDBDatabase::performGetResultCallback):
     20        (WebCore::IDBServer::UniqueIDBDatabase::performGetAllResultsCallback):
     21        (WebCore::IDBServer::UniqueIDBDatabase::performCountCallback):
     22        (WebCore::IDBServer::UniqueIDBDatabase::forgetErrorCallback):
     23        * Modules/indexeddb/server/UniqueIDBDatabase.h:
     24
    1252019-02-13  John Wilander  <wilander@apple.com>
    226
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r240358 r241468  
    424424    ASSERT(!m_errorCallbacks.contains(identifier));
    425425    m_errorCallbacks.add(identifier, WTFMove(callback));
     426    m_callbackQueue.append(identifier);
    426427    return identifier;
    427428}
     
    437438    ASSERT(!m_keyDataCallbacks.contains(identifier));
    438439    m_keyDataCallbacks.add(identifier, WTFMove(callback));
     440    m_callbackQueue.append(identifier);
    439441    return identifier;
    440442}
     
    450452    ASSERT(!m_getResultCallbacks.contains(identifier));
    451453    m_getResultCallbacks.add(identifier, WTFMove(callback));
     454    m_callbackQueue.append(identifier);
    452455    return identifier;
    453456}
     
    463466    ASSERT(!m_getAllResultsCallbacks.contains(identifier));
    464467    m_getAllResultsCallbacks.add(identifier, WTFMove(callback));
     468    m_callbackQueue.append(identifier);
    465469    return identifier;
    466470}
     
    476480    ASSERT(!m_countCallbacks.contains(identifier));
    477481    m_countCallbacks.add(identifier, WTFMove(callback));
     482    m_callbackQueue.append(identifier);
    478483    return identifier;
    479484}
     
    18291834    IDBKeyData keyData;
    18301835    IDBGetResult getResult;
    1831 
    1832     for (auto identifier : copyToVector(m_errorCallbacks.keys()))
    1833         performErrorCallback(identifier, error);
    1834 
    1835     for (auto identifier : copyToVector(m_keyDataCallbacks.keys()))
    1836         performKeyDataCallback(identifier, error, keyData);
    1837 
    1838     for (auto identifier : copyToVector(m_getResultCallbacks.keys()))
    1839         performGetResultCallback(identifier, error, getResult);
    1840 
    1841     for (auto identifier : copyToVector(m_countCallbacks.keys()))
    1842         performCountCallback(identifier, error, 0);
     1836    IDBGetAllResult getAllResult;
     1837
     1838    while (!m_callbackQueue.isEmpty()) {
     1839        auto identifier = m_callbackQueue.first();
     1840        if (m_errorCallbacks.contains(identifier))
     1841            performErrorCallback(identifier, error);
     1842        else if (m_keyDataCallbacks.contains(identifier))
     1843            performKeyDataCallback(identifier, error, keyData);
     1844        else if (m_getResultCallbacks.contains(identifier))
     1845            performGetResultCallback(identifier, error, getResult);
     1846        else if (m_countCallbacks.contains(identifier))
     1847            performCountCallback(identifier, error, 0);
     1848        else if (m_getAllResultsCallbacks.contains(identifier))
     1849            performGetAllResultsCallback(identifier, error, getAllResult);
     1850        else
     1851            ASSERT_NOT_REACHED();
     1852    }
    18431853
    18441854    // Error out all IDBOpenDBRequests
     
    18811891    auto callback = m_errorCallbacks.take(callbackIdentifier);
    18821892    ASSERT(callback || m_hardClosedForUserDelete);
    1883     if (callback)
     1893    if (callback) {
    18841894        callback(error);
     1895        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1896        m_callbackQueue.removeFirst();
     1897    }
    18851898}
    18861899
     
    18891902    auto callback = m_keyDataCallbacks.take(callbackIdentifier);
    18901903    ASSERT(callback || m_hardClosedForUserDelete);
    1891     if (callback)
     1904    if (callback) {
    18921905        callback(error, resultKey);
     1906        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1907        m_callbackQueue.removeFirst();
     1908    }
    18931909}
    18941910
     
    18971913    auto callback = m_getResultCallbacks.take(callbackIdentifier);
    18981914    ASSERT(callback || m_hardClosedForUserDelete);
    1899     if (callback)
     1915    if (callback) {
    19001916        callback(error, resultData);
     1917        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1918        m_callbackQueue.removeFirst();
     1919    }
    19011920}
    19021921
     
    19051924    auto callback = m_getAllResultsCallbacks.take(callbackIdentifier);
    19061925    ASSERT(callback || m_hardClosedForUserDelete);
    1907     if (callback)
     1926    if (callback) {
    19081927        callback(error, resultData);
     1928        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1929        m_callbackQueue.removeFirst();
     1930    }
    19091931}
    19101932
     
    19131935    auto callback = m_countCallbacks.take(callbackIdentifier);
    19141936    ASSERT(callback || m_hardClosedForUserDelete);
    1915     if (callback)
     1937    if (callback) {
    19161938        callback(error, count);
     1939        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1940        m_callbackQueue.removeFirst();
     1941    }
    19171942}
    19181943
     
    19201945{
    19211946    ASSERT(m_errorCallbacks.contains(callbackIdentifier));
     1947    ASSERT(m_callbackQueue.last() == callbackIdentifier);
     1948    m_callbackQueue.removeLast();
    19221949    m_errorCallbacks.remove(callbackIdentifier);
    19231950}
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h

    r241183 r241468  
    251251    HashMap<uint64_t, GetAllResultsCallback> m_getAllResultsCallbacks;
    252252    HashMap<uint64_t, CountCallback> m_countCallbacks;
     253    Deque<uint64_t> m_callbackQueue;
    253254
    254255    Timer m_operationAndTransactionTimer;
Note: See TracChangeset for help on using the changeset viewer.