Changeset 243270 in webkit
- Timestamp:
- Mar 20, 2019 6:24:52 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r243269 r243270 1 2019-03-20 Youenn Fablet <youenn@apple.com> 2 3 Include WAL and SHM file size in IDB database size computation 4 https://bugs.webkit.org/show_bug.cgi?id=195688 5 6 Reviewed by Brady Eidson. 7 8 * storage/websql/open-database-creation-callback.html: 9 Bump quota for this test since WAL files are not included in quota computation. 10 1 11 2019-03-20 Devin Rousso <drousso@apple.com> 2 12 -
trunk/LayoutTests/storage/websql/open-database-creation-callback.html
r120516 r243270 17 17 if (window.testRunner) { 18 18 testRunner.clearAllDatabases(); 19 testRunner.setDatabaseQuota(32768 );19 testRunner.setDatabaseQuota(327680); 20 20 testRunner.dumpDatabaseCallbacks(); 21 21 testRunner.dumpAsText(); -
trunk/Source/WebCore/ChangeLog
r243269 r243270 1 2019-03-20 Youenn Fablet <youenn@apple.com> 2 3 Include WAL and SHM file size in IDB database size computation 4 https://bugs.webkit.org/show_bug.cgi?id=195688 5 6 Reviewed by Brady Eidson. 7 8 Count WAL and SHM files as part of IDB quota checks. 9 This makes some IDB tests go over the testing quota which then 10 triggers some IDB tasks to happen sooner than other write IDB tasks. 11 The IDB implementation requires these tasks to remain ordered. 12 In case a write task is pending quota check, queue all tasks, 13 write or read, to keep the order. 14 15 This patch specials case aborting a transaction. 16 In case it is called as part of clearing a database, 17 the task should not be queued and all pending tasks are errored. 18 When transaction is aborted by the web page, queue the task. 19 20 When we can make a decision to run tasks with size 0, 21 do not check quota. This ensures that read operations 22 succeed even if we are above quota. 23 24 Covered by existing tests. 25 26 * Modules/indexeddb/server/UniqueIDBDatabase.cpp: 27 (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): 28 (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): 29 (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): 30 (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): 31 (WebCore::IDBServer::UniqueIDBDatabase::getRecord): 32 (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): 33 (WebCore::IDBServer::UniqueIDBDatabase::getCount): 34 (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): 35 (WebCore::IDBServer::UniqueIDBDatabase::openCursor): 36 (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): 37 (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): 38 * Modules/indexeddb/server/UniqueIDBDatabase.h: 39 * Modules/webdatabase/DatabaseTracker.cpp: 40 (WebCore::DatabaseTracker::usage): 41 * platform/sql/SQLiteFileSystem.cpp: 42 (WebCore::SQLiteFileSystem::getDatabaseFileSize): 43 * storage/StorageQuotaManager.h: 44 * storage/StorageQuotaManager.cpp: 45 (WebCore::StorageQuotaManager::requestSpace): 46 1 47 2019-03-20 Devin Rousso <drousso@apple.com> 2 48 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r243157 r243270 200 200 } 201 201 202 void UniqueIDBDatabase::waitForRequestSpaceCompletion(CompletionHandler<void(Optional<IDBError>&&)>&& callback) 203 { 204 requestSpace(0, "", WTFMove(callback)); 205 } 206 202 207 void UniqueIDBDatabase::performCurrentOpenOperation() 203 208 { … … 780 785 requestSpace(taskSize, "createObjectStore", [this, taskSize, transaction = makeRef(transaction), info, callback = WTFMove(callback)](auto error) mutable { 781 786 if (error) { 782 callback(WTFMove( error.value()));787 callback(WTFMove(*error)); 783 788 return; 784 789 } … … 824 829 LOG(IndexedDB, "(main) UniqueIDBDatabase::deleteObjectStore"); 825 830 831 waitForRequestSpaceCompletion([this, transaction = makeRef(transaction), objectStoreName, callback = WTFMove(callback)](auto error) mutable { 832 if (error) { 833 callback(WTFMove(*error)); 834 return; 835 } 836 this->deleteObjectStoreAfterQuotaCheck(transaction, objectStoreName, WTFMove(callback)); 837 }); 838 } 839 840 void UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck(UniqueIDBDatabaseTransaction& transaction, const String& objectStoreName, ErrorCallback callback) 841 { 826 842 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 827 843 if (!callbackID) … … 868 884 requestSpace(taskSize, "renameObjectStore", [this, taskSize, transaction = makeRef(transaction), objectStoreIdentifier, newName, callback = WTFMove(callback)](auto error) mutable { 869 885 if (error) { 870 callback(WTFMove( error.value()));886 callback(WTFMove(*error)); 871 887 return; 872 888 } … … 918 934 LOG(IndexedDB, "(main) UniqueIDBDatabase::clearObjectStore"); 919 935 936 waitForRequestSpaceCompletion([this, transaction = makeRef(transaction), objectStoreIdentifier, callback = WTFMove(callback)](auto error) mutable { 937 if (error) { 938 callback(WTFMove(*error)); 939 return; 940 } 941 this->clearObjectStoreAfetQuotaCheck(transaction, objectStoreIdentifier, WTFMove(callback)); 942 }); 943 } 944 945 void UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, ErrorCallback callback) 946 { 920 947 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 921 948 if (!callbackID) … … 952 979 requestSpace(taskSize, "createIndex", [this, taskSize, transaction = makeRef(transaction), info, callback = WTFMove(callback)](auto error) mutable { 953 980 if (error) { 954 callback(WTFMove( error.value()));981 callback(WTFMove(*error)); 955 982 return; 956 983 } … … 998 1025 LOG(IndexedDB, "(main) UniqueIDBDatabase::deleteIndex"); 999 1026 1027 waitForRequestSpaceCompletion([this, transaction = makeRef(transaction), objectStoreIdentifier, indexName, callback = WTFMove(callback)](auto error) mutable { 1028 if (error) { 1029 callback(WTFMove(*error)); 1030 return; 1031 } 1032 this->deleteIndexAfterQuotaCheck(transaction, objectStoreIdentifier, indexName, WTFMove(callback)); 1033 }); 1034 } 1035 1036 void UniqueIDBDatabase::deleteIndexAfterQuotaCheck(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, const String& indexName, ErrorCallback callback) 1037 { 1000 1038 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1001 1039 if (!callbackID) … … 1051 1089 requestSpace(taskSize, "renameIndex", [this, taskSize, transaction = makeRef(transaction), objectStoreIdentifier, indexIdentifier, newName, callback = WTFMove(callback)](auto error) mutable { 1052 1090 if (error) { 1053 callback(WTFMove( error.value()));1091 callback(WTFMove(*error)); 1054 1092 return; 1055 1093 } … … 1117 1155 requestSpace(taskSize, "putOrAdd", [this, taskSize, requestData, keyData, value, callback = WTFMove(callback), overwriteMode](auto error) mutable { 1118 1156 if (error) { 1119 callback(WTFMove( error.value()), { });1157 callback(WTFMove(*error), { }); 1120 1158 return; 1121 1159 } … … 1266 1304 LOG(IndexedDB, "(main) UniqueIDBDatabase::getRecord"); 1267 1305 1306 waitForRequestSpaceCompletion([this, requestData, getRecordData, callback = WTFMove(callback)](auto error) mutable { 1307 if (error) { 1308 callback(WTFMove(*error), { }); 1309 return; 1310 } 1311 this->getRecordAfterQuotaCheck(requestData, getRecordData, WTFMove(callback)); 1312 }); 1313 } 1314 1315 void UniqueIDBDatabase::getRecordAfterQuotaCheck(const IDBRequestData& requestData, const IDBGetRecordData& getRecordData, GetResultCallback callback) 1316 { 1268 1317 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1269 1318 if (!callbackID) … … 1281 1330 LOG(IndexedDB, "(main) UniqueIDBDatabase::getAllRecords"); 1282 1331 1332 waitForRequestSpaceCompletion([this, requestData, getAllRecordsData, callback = WTFMove(callback)](auto error) mutable { 1333 if (error) { 1334 callback(WTFMove(*error), { }); 1335 return; 1336 } 1337 this->getAllRecordsAfterQuotaCheck(requestData, getAllRecordsData, WTFMove(callback)); 1338 }); 1339 } 1340 1341 void UniqueIDBDatabase::getAllRecordsAfterQuotaCheck(const IDBRequestData& requestData, const IDBGetAllRecordsData& getAllRecordsData, GetAllResultsCallback callback) 1342 { 1283 1343 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1284 1344 if (!callbackID) … … 1348 1408 LOG(IndexedDB, "(main) UniqueIDBDatabase::getCount"); 1349 1409 1410 waitForRequestSpaceCompletion([this, requestData, range, callback = WTFMove(callback)](auto error) mutable { 1411 if (error) { 1412 callback(WTFMove(*error), { }); 1413 return; 1414 } 1415 this->getCountAfterQuotaCheck(requestData, range, WTFMove(callback)); 1416 }); 1417 } 1418 1419 void UniqueIDBDatabase::getCountAfterQuotaCheck(const IDBRequestData& requestData, const IDBKeyRangeData& range, CountCallback callback) 1420 { 1350 1421 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1351 1422 if (!callbackID) … … 1381 1452 LOG(IndexedDB, "(main) UniqueIDBDatabase::deleteRecord"); 1382 1453 1454 waitForRequestSpaceCompletion([this, requestData, keyRangeData, callback = WTFMove(callback)](auto error) mutable { 1455 if (error) { 1456 callback(WTFMove(*error)); 1457 return; 1458 } 1459 this->deleteRecordAfterQuotaCheck(requestData, keyRangeData, WTFMove(callback)); 1460 }); 1461 } 1462 1463 void UniqueIDBDatabase::deleteRecordAfterQuotaCheck(const IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData, ErrorCallback callback) 1464 { 1383 1465 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1384 1466 if (!callbackID) … … 1410 1492 LOG(IndexedDB, "(main) UniqueIDBDatabase::openCursor"); 1411 1493 1494 waitForRequestSpaceCompletion([this, requestData, info, callback = WTFMove(callback)](auto error) mutable { 1495 if (error) { 1496 callback(WTFMove(*error), { }); 1497 return; 1498 } 1499 this->openCursorAfterQuotaCheck(requestData, info, WTFMove(callback)); 1500 }); 1501 } 1502 1503 void UniqueIDBDatabase::openCursorAfterQuotaCheck(const IDBRequestData& requestData, const IDBCursorInfo& info, GetResultCallback callback) 1504 { 1412 1505 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1413 1506 if (!callbackID) … … 1440 1533 LOG(IndexedDB, "(main) UniqueIDBDatabase::iterateCursor"); 1441 1534 1535 waitForRequestSpaceCompletion([this, requestData, data, callback = WTFMove(callback)](auto error) mutable { 1536 if (error) { 1537 callback(WTFMove(*error), { }); 1538 return; 1539 } 1540 this->iterateCursorAfterQuotaCheck(requestData, data, WTFMove(callback)); 1541 }); 1542 } 1543 1544 void UniqueIDBDatabase::iterateCursorAfterQuotaCheck(const IDBRequestData& requestData, const IDBIterateCursorData& data, GetResultCallback callback) 1545 { 1442 1546 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1443 1547 if (!callbackID) … … 1502 1606 ASSERT(transaction.databaseConnection().database() == this); 1503 1607 1608 waitForRequestSpaceCompletion([this, transaction = makeRef(transaction), callback = WTFMove(callback)](auto error) mutable { 1609 if (error) { 1610 callback(WTFMove(*error)); 1611 return; 1612 } 1613 this->commitTransactionAfterQuotaCheck(transaction, WTFMove(callback)); 1614 }); 1615 } 1616 1617 void UniqueIDBDatabase::commitTransactionAfterQuotaCheck(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback) 1618 { 1504 1619 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); 1505 1620 if (!callbackID) … … 1539 1654 } 1540 1655 1541 void UniqueIDBDatabase::abortTransaction(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback)1656 void UniqueIDBDatabase::abortTransaction(UniqueIDBDatabaseTransaction& transaction, WaitForPendingTasks waitForPendingTasks, ErrorCallback callback) 1542 1657 { 1543 1658 ASSERT(isMainThread()); … … 1545 1660 1546 1661 ASSERT(transaction.databaseConnection().database() == this); 1662 1663 if (waitForPendingTasks == WaitForPendingTasks::Yes) { 1664 waitForRequestSpaceCompletion([this, transaction = makeRef(transaction), callback = WTFMove(callback)](auto&& error) mutable { 1665 if (error) { 1666 callback(WTFMove(*error)); 1667 return; 1668 } 1669 this->abortTransaction(transaction, WaitForPendingTasks::No, WTFMove(callback)); 1670 }); 1671 return; 1672 } 1547 1673 1548 1674 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r242911 r243270 102 102 void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&, GetResultCallback); 103 103 void commitTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback); 104 void abortTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback); 104 105 enum class WaitForPendingTasks { No, Yes }; 106 void abortTransaction(UniqueIDBDatabaseTransaction&, WaitForPendingTasks, ErrorCallback); 107 105 108 void didFinishHandlingVersionChange(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& transactionIdentifier); 106 109 void transactionDestroyed(UniqueIDBDatabaseTransaction&); … … 153 156 void renameIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback); 154 157 void putOrAddAfterQuotaCheck(uint64_t taskSize, const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode, KeyDataCallback); 158 void deleteRecordAfterQuotaCheck(const IDBRequestData&, const IDBKeyRangeData&, ErrorCallback); 159 160 void deleteObjectStoreAfterQuotaCheck(UniqueIDBDatabaseTransaction&, const String& objectStoreName, ErrorCallback); 161 void clearObjectStoreAfetQuotaCheck(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, ErrorCallback); 162 void deleteIndexAfterQuotaCheck(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String&, ErrorCallback); 163 void getRecordAfterQuotaCheck(const IDBRequestData&, const IDBGetRecordData&, GetResultCallback); 164 void getAllRecordsAfterQuotaCheck(const IDBRequestData&, const IDBGetAllRecordsData&, GetAllResultsCallback); 165 void getCountAfterQuotaCheck(const IDBRequestData&, const IDBKeyRangeData&, CountCallback); 166 void openCursorAfterQuotaCheck(const IDBRequestData&, const IDBCursorInfo&, GetResultCallback); 167 void iterateCursorAfterQuotaCheck(const IDBRequestData&, const IDBIterateCursorData&, GetResultCallback); 168 void commitTransactionAfterQuotaCheck(UniqueIDBDatabaseTransaction&, ErrorCallback); 155 169 156 170 // Database thread operations … … 241 255 242 256 void requestSpace(uint64_t taskSize, const char* errorMessage, CompletionHandler<void(Optional<IDBError>&&)>&&); 257 void waitForRequestSpaceCompletion(CompletionHandler<void(Optional<IDBError>&&)>&&); 243 258 void updateSpaceUsedIfNeeded(uint64_t callbackIdentifier); 244 259 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp
r240039 r243270 76 76 return; 77 77 78 m_database->abortTransaction(transaction, [this, protectedThis, transactionIdentifier](const IDBError&) {78 m_database->abortTransaction(transaction, UniqueIDBDatabase::WaitForPendingTasks::No, [this, protectedThis, transactionIdentifier](const IDBError&) { 79 79 ASSERT(m_transactionMap.contains(transactionIdentifier)); 80 80 m_transactionMap.remove(transactionIdentifier); -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp
r239266 r243270 82 82 ASSERT(database); 83 83 84 database->abortTransaction(*this, [this, protectedThis](const IDBError& error) {84 database->abortTransaction(*this, UniqueIDBDatabase::WaitForPendingTasks::Yes, [this, protectedThis](const IDBError& error) { 85 85 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::abort (callback)"); 86 86 m_databaseConnection->didAbortTransaction(*this, error); -
trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp
r243219 r243270 656 656 String originPath = this->originPath(origin); 657 657 unsigned long long diskUsage = 0; 658 for (auto& fileName : FileSystem::listDirectory(originPath, "*.db"_s)) { 659 long long size; 660 FileSystem::getFileSize(fileName, size); 661 diskUsage += size; 662 } 658 for (auto& fileName : FileSystem::listDirectory(originPath, "*.db"_s)) 659 diskUsage += SQLiteFileSystem::getDatabaseFileSize(fileName); 663 660 return diskUsage; 664 661 } -
trunk/Source/WebCore/platform/sql/SQLiteFileSystem.cpp
r243019 r243270 101 101 long long SQLiteFileSystem::getDatabaseFileSize(const String& fileName) 102 102 { 103 long long size; 104 return FileSystem::getFileSize(fileName, size) ? size : 0; 103 long long fileSize = 0; 104 long long totalSize = 0; 105 106 if (FileSystem::getFileSize(fileName, fileSize)) 107 totalSize += fileSize; 108 109 if (FileSystem::getFileSize(makeString(fileName, "-wal"_s), fileSize)) 110 totalSize += fileSize; 111 112 if (FileSystem::getFileSize(makeString(fileName, "-shm"_s), fileSize)) 113 totalSize += fileSize; 114 115 return totalSize; 105 116 } 106 117 -
trunk/Source/WebCore/storage/StorageQuotaManager.cpp
r242911 r243270 59 59 } 60 60 61 bool StorageQuotaManager::shouldAskForMoreSpace(uint64_t spaceIncrease) const 62 { 63 if (!spaceIncrease) 64 return false; 65 66 return spaceUsage() + spaceIncrease > m_quota; 67 } 68 61 69 void StorageQuotaManager::requestSpace(uint64_t spaceIncrease, RequestCallback&& callback) 62 70 { … … 66 74 } 67 75 68 auto spaceUsage = this->spaceUsage(); 69 if (spaceUsage + spaceIncrease > m_quota) { 76 if (shouldAskForMoreSpace(spaceIncrease)) { 70 77 m_pendingRequests.append({ spaceIncrease, WTFMove(callback) }); 71 askForMoreSpace(space Usage, spaceIncrease);78 askForMoreSpace(spaceIncrease); 72 79 return; 73 80 } … … 75 82 } 76 83 77 void StorageQuotaManager::askForMoreSpace(uint64_t space Usage, uint64_t spaceIncrease)84 void StorageQuotaManager::askForMoreSpace(uint64_t spaceIncrease) 78 85 { 79 ASSERT(s paceUsage + spaceIncrease > m_quota);80 m_spaceIncreaseRequester(m_quota, spaceUsage , spaceIncrease, [this, weakThis = makeWeakPtr(*this)](Optional<uint64_t> newQuota) {86 ASSERT(shouldAskForMoreSpace(spaceIncrease)); 87 m_spaceIncreaseRequester(m_quota, spaceUsage(), spaceIncrease, [this, weakThis = makeWeakPtr(*this)](Optional<uint64_t> newQuota) { 81 88 if (!weakThis) 82 89 return; … … 94 101 95 102 auto request = m_pendingRequests.takeFirst(); 96 auto decision = m_quota >= (spaceUsage() + request.spaceIncrease) ? Decision::Grant : Decision::Deny;103 auto decision = shouldAskForMoreSpace(request.spaceIncrease) ? Decision::Deny : Decision::Grant; 97 104 request.callback(decision); 98 105 … … 100 107 auto& request = m_pendingRequests.first(); 101 108 102 auto spaceUsage = this->spaceUsage(); 103 if (m_quota < spaceUsage + request.spaceIncrease) { 109 if (shouldAskForMoreSpace(request.spaceIncrease)) { 104 110 uint64_t spaceIncrease = 0; 105 111 for (auto& request : m_pendingRequests) 106 112 spaceIncrease += request.spaceIncrease; 107 askForMoreSpace(space Usage, spaceIncrease);113 askForMoreSpace(spaceIncrease); 108 114 return; 109 115 } -
trunk/Source/WebCore/storage/StorageQuotaManager.h
r243247 r243270 65 65 private: 66 66 uint64_t spaceUsage() const; 67 void askForMoreSpace(uint64_t spaceUsage, uint64_t spaceIncrease); 67 bool shouldAskForMoreSpace(uint64_t spaceIncrease) const; 68 void askForMoreSpace(uint64_t spaceIncrease); 68 69 void processPendingRequests(Optional<uint64_t>); 69 70
Note: See TracChangeset
for help on using the changeset viewer.