Changeset 242850 in webkit
- Timestamp:
- Mar 13, 2019, 1:24:17 AM (7 years ago)
- Location:
- branches/safari-607-branch/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
Modules/indexeddb/server/UniqueIDBDatabase.cpp (modified) (12 diffs)
-
Modules/indexeddb/server/UniqueIDBDatabase.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-607-branch/Source/WebCore/ChangeLog
r242846 r242850 1 2019-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 1 54 2019-03-12 Babak Shafiei <bshafiei@apple.com> 2 55 -
branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r242029 r242850 427 427 ASSERT(!m_errorCallbacks.contains(identifier)); 428 428 m_errorCallbacks.add(identifier, WTFMove(callback)); 429 m_callbackQueue.append(identifier); 429 430 return identifier; 430 431 } … … 440 441 ASSERT(!m_keyDataCallbacks.contains(identifier)); 441 442 m_keyDataCallbacks.add(identifier, WTFMove(callback)); 443 m_callbackQueue.append(identifier); 442 444 return identifier; 443 445 } … … 453 455 ASSERT(!m_getResultCallbacks.contains(identifier)); 454 456 m_getResultCallbacks.add(identifier, WTFMove(callback)); 457 m_callbackQueue.append(identifier); 455 458 return identifier; 456 459 } … … 466 469 ASSERT(!m_getAllResultsCallbacks.contains(identifier)); 467 470 m_getAllResultsCallbacks.add(identifier, WTFMove(callback)); 471 m_callbackQueue.append(identifier); 468 472 return identifier; 469 473 } … … 479 483 ASSERT(!m_countCallbacks.contains(identifier)); 480 484 m_countCallbacks.add(identifier, WTFMove(callback)); 485 m_callbackQueue.append(identifier); 481 486 return identifier; 482 487 } … … 1828 1833 IDBKeyData keyData; 1829 1834 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 } 1842 1852 1843 1853 // Error out all IDBOpenDBRequests … … 1880 1890 auto callback = m_errorCallbacks.take(callbackIdentifier); 1881 1891 ASSERT(callback || m_hardClosedForUserDelete); 1882 if (callback) 1892 if (callback) { 1883 1893 callback(error); 1894 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1895 m_callbackQueue.removeFirst(); 1896 } 1884 1897 } 1885 1898 … … 1888 1901 auto callback = m_keyDataCallbacks.take(callbackIdentifier); 1889 1902 ASSERT(callback || m_hardClosedForUserDelete); 1890 if (callback) 1903 if (callback) { 1891 1904 callback(error, resultKey); 1905 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1906 m_callbackQueue.removeFirst(); 1907 } 1892 1908 } 1893 1909 … … 1896 1912 auto callback = m_getResultCallbacks.take(callbackIdentifier); 1897 1913 ASSERT(callback || m_hardClosedForUserDelete); 1898 if (callback) 1914 if (callback) { 1899 1915 callback(error, resultData); 1916 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1917 m_callbackQueue.removeFirst(); 1918 } 1900 1919 } 1901 1920 … … 1904 1923 auto callback = m_getAllResultsCallbacks.take(callbackIdentifier); 1905 1924 ASSERT(callback || m_hardClosedForUserDelete); 1906 if (callback) 1925 if (callback) { 1907 1926 callback(error, resultData); 1927 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1928 m_callbackQueue.removeFirst(); 1929 } 1908 1930 } 1909 1931 … … 1912 1934 auto callback = m_countCallbacks.take(callbackIdentifier); 1913 1935 ASSERT(callback || m_hardClosedForUserDelete); 1914 if (callback) 1936 if (callback) { 1915 1937 callback(error, count); 1938 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1939 m_callbackQueue.removeFirst(); 1940 } 1916 1941 } 1917 1942 … … 1919 1944 { 1920 1945 ASSERT(m_errorCallbacks.contains(callbackIdentifier)); 1946 ASSERT(m_callbackQueue.last() == callbackIdentifier); 1947 m_callbackQueue.removeLast(); 1921 1948 m_errorCallbacks.remove(callbackIdentifier); 1922 1949 } -
branches/safari-607-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r242029 r242850 252 252 HashMap<uint64_t, GetAllResultsCallback> m_getAllResultsCallbacks; 253 253 HashMap<uint64_t, CountCallback> m_countCallbacks; 254 Deque<uint64_t> m_callbackQueue; 254 255 255 256 Timer m_operationAndTransactionTimer;
Note:
See TracChangeset
for help on using the changeset viewer.