Title: [242850] branches/safari-607-branch/Source/WebCore
Revision
242850
Author
[email protected]
Date
2019-03-13 01:24:17 -0700 (Wed, 13 Mar 2019)

Log 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

Modified Paths

Diff

Modified: branches/safari-607-branch/Source/WebCore/ChangeLog (242849 => 242850)


--- branches/safari-607-branch/Source/WebCore/ChangeLog	2019-03-13 08:24:14 UTC (rev 242849)
+++ branches/safari-607-branch/Source/WebCore/ChangeLog	2019-03-13 08:24:17 UTC (rev 242850)
@@ -1,3 +1,56 @@
+2019-03-13  Babak Shafiei  <[email protected]>
+
+        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
+
+    2019-02-13  Sihui Liu  <[email protected]>
+
+            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:
+
 2019-03-12  Babak Shafiei  <[email protected]>
 
         Cherry-pick r242770. rdar://problem/48795265

Modified: branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (242849 => 242850)


--- branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2019-03-13 08:24:14 UTC (rev 242849)
+++ branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2019-03-13 08:24:17 UTC (rev 242850)
@@ -426,6 +426,7 @@
     uint64_t identifier = generateUniqueCallbackIdentifier();
     ASSERT(!m_errorCallbacks.contains(identifier));
     m_errorCallbacks.add(identifier, WTFMove(callback));
+    m_callbackQueue.append(identifier);
     return identifier;
 }
 
@@ -439,6 +440,7 @@
     uint64_t identifier = generateUniqueCallbackIdentifier();
     ASSERT(!m_keyDataCallbacks.contains(identifier));
     m_keyDataCallbacks.add(identifier, WTFMove(callback));
+    m_callbackQueue.append(identifier);
     return identifier;
 }
 
@@ -452,6 +454,7 @@
     uint64_t identifier = generateUniqueCallbackIdentifier();
     ASSERT(!m_getResultCallbacks.contains(identifier));
     m_getResultCallbacks.add(identifier, WTFMove(callback));
+    m_callbackQueue.append(identifier);
     return identifier;
 }
 
@@ -465,6 +468,7 @@
     uint64_t identifier = generateUniqueCallbackIdentifier();
     ASSERT(!m_getAllResultsCallbacks.contains(identifier));
     m_getAllResultsCallbacks.add(identifier, WTFMove(callback));
+    m_callbackQueue.append(identifier);
     return identifier;
 }
 
@@ -478,6 +482,7 @@
     uint64_t identifier = generateUniqueCallbackIdentifier();
     ASSERT(!m_countCallbacks.contains(identifier));
     m_countCallbacks.add(identifier, WTFMove(callback));
+    m_callbackQueue.append(identifier);
     return identifier;
 }
 
@@ -1827,19 +1832,24 @@
     IDBError error = IDBError::userDeleteError();
     IDBKeyData keyData;
     IDBGetResult getResult;
+    IDBGetAllResult getAllResult;
 
-    for (auto identifier : copyToVector(m_errorCallbacks.keys()))
-        performErrorCallback(identifier, error);
+    while (!m_callbackQueue.isEmpty()) {
+        auto identifier = m_callbackQueue.first();
+        if (m_errorCallbacks.contains(identifier))
+            performErrorCallback(identifier, error);
+        else if (m_keyDataCallbacks.contains(identifier))
+            performKeyDataCallback(identifier, error, keyData);
+        else if (m_getResultCallbacks.contains(identifier))
+            performGetResultCallback(identifier, error, getResult);
+        else if (m_countCallbacks.contains(identifier))
+            performCountCallback(identifier, error, 0);
+        else if (m_getAllResultsCallbacks.contains(identifier))
+            performGetAllResultsCallback(identifier, error, getAllResult);
+        else
+            ASSERT_NOT_REACHED();
+    }
 
-    for (auto identifier : copyToVector(m_keyDataCallbacks.keys()))
-        performKeyDataCallback(identifier, error, keyData);
-
-    for (auto identifier : copyToVector(m_getResultCallbacks.keys()))
-        performGetResultCallback(identifier, error, getResult);
-
-    for (auto identifier : copyToVector(m_countCallbacks.keys()))
-        performCountCallback(identifier, error, 0);
-
     // Error out all IDBOpenDBRequests
     if (m_currentOpenDBRequest) {
         errorOpenDBRequestForUserDelete(*m_currentOpenDBRequest);
@@ -1879,8 +1889,11 @@
 {
     auto callback = m_errorCallbacks.take(callbackIdentifier);
     ASSERT(callback || m_hardClosedForUserDelete);
-    if (callback)
+    if (callback) {
         callback(error);
+        ASSERT(m_callbackQueue.first() == callbackIdentifier);
+        m_callbackQueue.removeFirst();
+    }
 }
 
 void UniqueIDBDatabase::performKeyDataCallback(uint64_t callbackIdentifier, const IDBError& error, const IDBKeyData& resultKey)
@@ -1887,8 +1900,11 @@
 {
     auto callback = m_keyDataCallbacks.take(callbackIdentifier);
     ASSERT(callback || m_hardClosedForUserDelete);
-    if (callback)
+    if (callback) {
         callback(error, resultKey);
+        ASSERT(m_callbackQueue.first() == callbackIdentifier);
+        m_callbackQueue.removeFirst();
+    }
 }
 
 void UniqueIDBDatabase::performGetResultCallback(uint64_t callbackIdentifier, const IDBError& error, const IDBGetResult& resultData)
@@ -1895,8 +1911,11 @@
 {
     auto callback = m_getResultCallbacks.take(callbackIdentifier);
     ASSERT(callback || m_hardClosedForUserDelete);
-    if (callback)
+    if (callback) {
         callback(error, resultData);
+        ASSERT(m_callbackQueue.first() == callbackIdentifier);
+        m_callbackQueue.removeFirst();
+    }
 }
 
 void UniqueIDBDatabase::performGetAllResultsCallback(uint64_t callbackIdentifier, const IDBError& error, const IDBGetAllResult& resultData)
@@ -1903,8 +1922,11 @@
 {
     auto callback = m_getAllResultsCallbacks.take(callbackIdentifier);
     ASSERT(callback || m_hardClosedForUserDelete);
-    if (callback)
+    if (callback) {
         callback(error, resultData);
+        ASSERT(m_callbackQueue.first() == callbackIdentifier);
+        m_callbackQueue.removeFirst();
+    }
 }
 
 void UniqueIDBDatabase::performCountCallback(uint64_t callbackIdentifier, const IDBError& error, uint64_t count)
@@ -1911,13 +1933,18 @@
 {
     auto callback = m_countCallbacks.take(callbackIdentifier);
     ASSERT(callback || m_hardClosedForUserDelete);
-    if (callback)
+    if (callback) {
         callback(error, count);
+        ASSERT(m_callbackQueue.first() == callbackIdentifier);
+        m_callbackQueue.removeFirst();
+    }
 }
 
 void UniqueIDBDatabase::forgetErrorCallback(uint64_t callbackIdentifier)
 {
     ASSERT(m_errorCallbacks.contains(callbackIdentifier));
+    ASSERT(m_callbackQueue.last() == callbackIdentifier);
+    m_callbackQueue.removeLast();
     m_errorCallbacks.remove(callbackIdentifier);
 }
 

Modified: branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (242849 => 242850)


--- branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2019-03-13 08:24:14 UTC (rev 242849)
+++ branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2019-03-13 08:24:17 UTC (rev 242850)
@@ -251,6 +251,7 @@
     HashMap<uint64_t, GetResultCallback> m_getResultCallbacks;
     HashMap<uint64_t, GetAllResultsCallback> m_getAllResultsCallbacks;
     HashMap<uint64_t, CountCallback> m_countCallbacks;
+    Deque<uint64_t> m_callbackQueue;
 
     Timer m_operationAndTransactionTimer;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to