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

Changeset 242850 in webkit


Ignore:
Timestamp:
Mar 13, 2019, 1:24:17 AM (7 years ago)
Author:
bshafiei@apple.com
Message:

Cherry-pick r241468. rdar://problem/48839280

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:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241468 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Location:
branches/safari-607-branch/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-607-branch/Source/WebCore/ChangeLog

    r242846 r242850  
     12019-03-13  Babak Shafiei  <bshafiei@apple.com>
     2
     3        Cherry-pick r241468. rdar://problem/48839280
     4
     5    REGRESSION: [ Mac Debug WK2 ] Layout Test storage/indexeddb/key-type-infinity-private.html is a flaky crash
     6    https://bugs.webkit.org/show_bug.cgi?id=194413
     7    <rdar://problem/47897254>
     8   
     9    Reviewed by Brady Eidson.
     10   
     11    IDB clients expected transaction operations to be executed in order, but in
     12    UniqueIDBDatabase::immediateCloseForUserDelete, callbacks in callback map were errored out randomly.
     13    This patch added a callback queue to UniqueIDBDatabase to make sure callbacks will be called in the same order
     14    as IDB Server receives the request.
     15   
     16    * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     17    (WebCore::IDBServer::UniqueIDBDatabase::storeCallbackOrFireError):
     18    (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete):
     19    (WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback):
     20    (WebCore::IDBServer::UniqueIDBDatabase::performKeyDataCallback):
     21    (WebCore::IDBServer::UniqueIDBDatabase::performGetResultCallback):
     22    (WebCore::IDBServer::UniqueIDBDatabase::performGetAllResultsCallback):
     23    (WebCore::IDBServer::UniqueIDBDatabase::performCountCallback):
     24    (WebCore::IDBServer::UniqueIDBDatabase::forgetErrorCallback):
     25    * Modules/indexeddb/server/UniqueIDBDatabase.h:
     26   
     27   
     28    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241468 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     29
     30    2019-02-13  Sihui Liu  <sihui_liu@apple.com>
     31
     32            REGRESSION: [ Mac Debug WK2 ] Layout Test storage/indexeddb/key-type-infinity-private.html is a flaky crash
     33            https://bugs.webkit.org/show_bug.cgi?id=194413
     34            <rdar://problem/47897254>
     35
     36            Reviewed by Brady Eidson.
     37
     38            IDB clients expected transaction operations to be executed in order, but in
     39            UniqueIDBDatabase::immediateCloseForUserDelete, callbacks in callback map were errored out randomly.
     40            This patch added a callback queue to UniqueIDBDatabase to make sure callbacks will be called in the same order
     41            as IDB Server receives the request.
     42
     43            * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     44            (WebCore::IDBServer::UniqueIDBDatabase::storeCallbackOrFireError):
     45            (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete):
     46            (WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback):
     47            (WebCore::IDBServer::UniqueIDBDatabase::performKeyDataCallback):
     48            (WebCore::IDBServer::UniqueIDBDatabase::performGetResultCallback):
     49            (WebCore::IDBServer::UniqueIDBDatabase::performGetAllResultsCallback):
     50            (WebCore::IDBServer::UniqueIDBDatabase::performCountCallback):
     51            (WebCore::IDBServer::UniqueIDBDatabase::forgetErrorCallback):
     52            * Modules/indexeddb/server/UniqueIDBDatabase.h:
     53
    1542019-03-12  Babak Shafiei  <bshafiei@apple.com>
    255
  • branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r242029 r242850  
    427427    ASSERT(!m_errorCallbacks.contains(identifier));
    428428    m_errorCallbacks.add(identifier, WTFMove(callback));
     429    m_callbackQueue.append(identifier);
    429430    return identifier;
    430431}
     
    440441    ASSERT(!m_keyDataCallbacks.contains(identifier));
    441442    m_keyDataCallbacks.add(identifier, WTFMove(callback));
     443    m_callbackQueue.append(identifier);
    442444    return identifier;
    443445}
     
    453455    ASSERT(!m_getResultCallbacks.contains(identifier));
    454456    m_getResultCallbacks.add(identifier, WTFMove(callback));
     457    m_callbackQueue.append(identifier);
    455458    return identifier;
    456459}
     
    466469    ASSERT(!m_getAllResultsCallbacks.contains(identifier));
    467470    m_getAllResultsCallbacks.add(identifier, WTFMove(callback));
     471    m_callbackQueue.append(identifier);
    468472    return identifier;
    469473}
     
    479483    ASSERT(!m_countCallbacks.contains(identifier));
    480484    m_countCallbacks.add(identifier, WTFMove(callback));
     485    m_callbackQueue.append(identifier);
    481486    return identifier;
    482487}
     
    18281833    IDBKeyData keyData;
    18291834    IDBGetResult getResult;
    1830 
    1831     for (auto identifier : copyToVector(m_errorCallbacks.keys()))
    1832         performErrorCallback(identifier, error);
    1833 
    1834     for (auto identifier : copyToVector(m_keyDataCallbacks.keys()))
    1835         performKeyDataCallback(identifier, error, keyData);
    1836 
    1837     for (auto identifier : copyToVector(m_getResultCallbacks.keys()))
    1838         performGetResultCallback(identifier, error, getResult);
    1839 
    1840     for (auto identifier : copyToVector(m_countCallbacks.keys()))
    1841         performCountCallback(identifier, error, 0);
     1835    IDBGetAllResult getAllResult;
     1836
     1837    while (!m_callbackQueue.isEmpty()) {
     1838        auto identifier = m_callbackQueue.first();
     1839        if (m_errorCallbacks.contains(identifier))
     1840            performErrorCallback(identifier, error);
     1841        else if (m_keyDataCallbacks.contains(identifier))
     1842            performKeyDataCallback(identifier, error, keyData);
     1843        else if (m_getResultCallbacks.contains(identifier))
     1844            performGetResultCallback(identifier, error, getResult);
     1845        else if (m_countCallbacks.contains(identifier))
     1846            performCountCallback(identifier, error, 0);
     1847        else if (m_getAllResultsCallbacks.contains(identifier))
     1848            performGetAllResultsCallback(identifier, error, getAllResult);
     1849        else
     1850            ASSERT_NOT_REACHED();
     1851    }
    18421852
    18431853    // Error out all IDBOpenDBRequests
     
    18801890    auto callback = m_errorCallbacks.take(callbackIdentifier);
    18811891    ASSERT(callback || m_hardClosedForUserDelete);
    1882     if (callback)
     1892    if (callback) {
    18831893        callback(error);
     1894        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1895        m_callbackQueue.removeFirst();
     1896    }
    18841897}
    18851898
     
    18881901    auto callback = m_keyDataCallbacks.take(callbackIdentifier);
    18891902    ASSERT(callback || m_hardClosedForUserDelete);
    1890     if (callback)
     1903    if (callback) {
    18911904        callback(error, resultKey);
     1905        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1906        m_callbackQueue.removeFirst();
     1907    }
    18921908}
    18931909
     
    18961912    auto callback = m_getResultCallbacks.take(callbackIdentifier);
    18971913    ASSERT(callback || m_hardClosedForUserDelete);
    1898     if (callback)
     1914    if (callback) {
    18991915        callback(error, resultData);
     1916        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1917        m_callbackQueue.removeFirst();
     1918    }
    19001919}
    19011920
     
    19041923    auto callback = m_getAllResultsCallbacks.take(callbackIdentifier);
    19051924    ASSERT(callback || m_hardClosedForUserDelete);
    1906     if (callback)
     1925    if (callback) {
    19071926        callback(error, resultData);
     1927        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1928        m_callbackQueue.removeFirst();
     1929    }
    19081930}
    19091931
     
    19121934    auto callback = m_countCallbacks.take(callbackIdentifier);
    19131935    ASSERT(callback || m_hardClosedForUserDelete);
    1914     if (callback)
     1936    if (callback) {
    19151937        callback(error, count);
     1938        ASSERT(m_callbackQueue.first() == callbackIdentifier);
     1939        m_callbackQueue.removeFirst();
     1940    }
    19161941}
    19171942
     
    19191944{
    19201945    ASSERT(m_errorCallbacks.contains(callbackIdentifier));
     1946    ASSERT(m_callbackQueue.last() == callbackIdentifier);
     1947    m_callbackQueue.removeLast();
    19211948    m_errorCallbacks.remove(callbackIdentifier);
    19221949}
  • branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h

    r242029 r242850  
    252252    HashMap<uint64_t, GetAllResultsCallback> m_getAllResultsCallbacks;
    253253    HashMap<uint64_t, CountCallback> m_countCallbacks;
     254    Deque<uint64_t> m_callbackQueue;
    254255
    255256    Timer m_operationAndTransactionTimer;
Note: See TracChangeset for help on using the changeset viewer.