Title: [266742] trunk/Source
Revision
266742
Author
[email protected]
Date
2020-09-08 12:37:42 -0700 (Tue, 08 Sep 2020)

Log Message

Remove storage WorkQueue in NetworkProcess
https://bugs.webkit.org/show_bug.cgi?id=216199

Reviewed by Youenn Fablet.

Source/WebCore:

Move origin fetching code from NetworkProcess to IDBServer.

* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::collectOriginsForVersion const):
(WebCore::IDBServer::IDBServer::getOrigins const):
* Modules/indexeddb/server/IDBServer.h:

Source/WebKit:

The only meaningful usage of this WorkQueue is iterating IndexedDB directories and collecting origins, while
there can be some IDB thread accessing the same directories. To remove the race, Let's just drop this WorkQueue
and fetch origins via WebIDBServer.

* NetworkProcess/IndexedDB/WebIDBServer.cpp:
(WebKit::WebIDBServer::getOrigins):
* NetworkProcess/IndexedDB/WebIDBServer.h:
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::addSessionStorageQuotaManager):
(WebKit::NetworkProcess::fetchWebsiteData):
(WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
(WebKit::NetworkProcess::registrableDomainsWithWebsiteData):
(WebKit::NetworkProcess::addIndexedDatabaseSession):
(WebKit::NetworkProcess::addServiceWorkerSession):
(WebKit::NetworkProcess::ensurePathExists): Deleted.
(WebKit::NetworkProcess::postStorageTask): Deleted.
(WebKit::NetworkProcess::performNextStorageTask): Deleted.
(WebKit::NetworkProcess::collectIndexedDatabaseOriginsForVersion): Deleted.
(WebKit::NetworkProcess::indexedDatabaseOrigins): Deleted.
* NetworkProcess/NetworkProcess.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (266741 => 266742)


--- trunk/Source/WebCore/ChangeLog	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebCore/ChangeLog	2020-09-08 19:37:42 UTC (rev 266742)
@@ -1,3 +1,17 @@
+2020-09-08  Sihui Liu  <[email protected]>
+
+        Remove storage WorkQueue in NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=216199
+
+        Reviewed by Youenn Fablet.
+
+        Move origin fetching code from NetworkProcess to IDBServer.
+
+        * Modules/indexeddb/server/IDBServer.cpp:
+        (WebCore::IDBServer::IDBServer::collectOriginsForVersion const):
+        (WebCore::IDBServer::IDBServer::getOrigins const):
+        * Modules/indexeddb/server/IDBServer.h:
+
 2020-09-08  Frank Yang  <[email protected]>
 
         CoreImage Implementation of CSS Filters invert(), opacity(), brightness(), contrast()

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (266741 => 266742)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-09-08 19:37:42 UTC (rev 266742)
@@ -541,6 +541,37 @@
     connection->didGetAllDatabaseNamesAndVersions(requestIdentifier, WTFMove(databases));
 }
 
+static void collectOriginsForVersion(const String& versionPath, HashSet<WebCore::SecurityOriginData>& securityOrigins)
+{
+    for (auto& topOriginPath : FileSystem::listDirectory(versionPath, "*")) {
+        auto databaseIdentifier = FileSystem::pathGetFileName(topOriginPath);
+        if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier)) {
+            securityOrigins.add(WTFMove(*securityOrigin));
+        
+            for (auto& originPath : FileSystem::listDirectory(topOriginPath, "*")) {
+                databaseIdentifier = FileSystem::pathGetFileName(originPath);
+                if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier))
+                    securityOrigins.add(WTFMove(*securityOrigin));
+            }
+        }
+    }
+}
+
+HashSet<SecurityOriginData> IDBServer::getOrigins() const
+{
+    ASSERT(!isMainThread());
+    ASSERT(m_lock.isHeld());
+
+    if (m_databaseDirectoryPath.isEmpty())
+        return { };
+
+    HashSet<WebCore::SecurityOriginData> securityOrigins;
+    collectOriginsForVersion(FileSystem::pathByAppendingComponent(m_databaseDirectoryPath, "v0"), securityOrigins);
+    collectOriginsForVersion(FileSystem::pathByAppendingComponent(m_databaseDirectoryPath, "v1"), securityOrigins);
+
+    return securityOrigins;
+}
+
 void IDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime)
 {
     ASSERT(!isMainThread());

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (266741 => 266742)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h	2020-09-08 19:37:42 UTC (rev 266742)
@@ -101,6 +101,7 @@
 
     std::unique_ptr<IDBBackingStore> createBackingStore(const IDBDatabaseIdentifier&);
 
+    WEBCORE_EXPORT HashSet<SecurityOriginData> getOrigins() const;
     WEBCORE_EXPORT void closeAndDeleteDatabasesModifiedSince(WallTime);
     WEBCORE_EXPORT void closeAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>&);
     void closeDatabasesForOrigins(const Vector<SecurityOriginData>&, Function<bool(const SecurityOriginData&, const ClientOrigin&)>&&);

Modified: trunk/Source/WebKit/ChangeLog (266741 => 266742)


--- trunk/Source/WebKit/ChangeLog	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/ChangeLog	2020-09-08 19:37:42 UTC (rev 266742)
@@ -1,3 +1,31 @@
+2020-09-08  Sihui Liu  <[email protected]>
+
+        Remove storage WorkQueue in NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=216199
+
+        Reviewed by Youenn Fablet.
+
+        The only meaningful usage of this WorkQueue is iterating IndexedDB directories and collecting origins, while
+        there can be some IDB thread accessing the same directories. To remove the race, Let's just drop this WorkQueue
+        and fetch origins via WebIDBServer.
+
+        * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+        (WebKit::WebIDBServer::getOrigins):
+        * NetworkProcess/IndexedDB/WebIDBServer.h:
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::addSessionStorageQuotaManager):
+        (WebKit::NetworkProcess::fetchWebsiteData):
+        (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
+        (WebKit::NetworkProcess::registrableDomainsWithWebsiteData):
+        (WebKit::NetworkProcess::addIndexedDatabaseSession):
+        (WebKit::NetworkProcess::addServiceWorkerSession):
+        (WebKit::NetworkProcess::ensurePathExists): Deleted.
+        (WebKit::NetworkProcess::postStorageTask): Deleted.
+        (WebKit::NetworkProcess::performNextStorageTask): Deleted.
+        (WebKit::NetworkProcess::collectIndexedDatabaseOriginsForVersion): Deleted.
+        (WebKit::NetworkProcess::indexedDatabaseOrigins): Deleted.
+        * NetworkProcess/NetworkProcess.h:
+
 2020-09-08  Peng Liu  <[email protected]>
 
         Clean up functions and state variables related to the picture-in-picture implementation

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (266741 => 266742)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2020-09-08 19:37:42 UTC (rev 266742)
@@ -59,6 +59,20 @@
     ASSERT(RunLoop::isMain());
 }
 
+void WebIDBServer::getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&& callback)
+{
+    ASSERT(RunLoop::isMain());
+
+    postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback)]() mutable {
+        ASSERT(!RunLoop::isMain());
+
+        LockHolder locker(m_server->lock());
+        postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
+            callback(WTFMove(origins));
+        }));
+    });
+}
+
 void WebIDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime, CompletionHandler<void()>&& callback)
 {
     ASSERT(RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (266741 => 266742)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-09-08 19:37:42 UTC (rev 266742)
@@ -47,6 +47,7 @@
 public:
     static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
 
+    void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&);
     void closeAndDeleteDatabasesModifiedSince(WallTime, CompletionHandler<void()>&& callback);
     void closeAndDeleteDatabasesForOrigins(const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&& callback);
     void renameOrigin(const WebCore::SecurityOriginData&, const WebCore::SecurityOriginData&, CompletionHandler<void()>&&);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (266741 => 266742)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-09-08 19:37:42 UTC (rev 266742)
@@ -465,11 +465,8 @@
     auto isNewEntry = m_sessionStorageQuotaManagers.ensure(sessionID, [defaultQuota, defaultThirdPartyQuota, &cacheRootPath] {
         return makeUnique<SessionStorageQuotaManager>(cacheRootPath, defaultQuota, defaultThirdPartyQuota);
     }).isNewEntry;
-    if (isNewEntry) {
+    if (isNewEntry)
         SandboxExtension::consumePermanently(cacheRootPathHandle);
-        if (!cacheRootPath.isEmpty())
-            postStorageTask(createCrossThreadTask(*this, &NetworkProcess::ensurePathExists, cacheRootPath));
-    }
 }
 
 void NetworkProcess::removeSessionStorageQuotaManager(PAL::SessionID sessionID)
@@ -1558,13 +1555,10 @@
 #if ENABLE(INDEXED_DATABASE)
     auto path = m_idbDatabasePaths.get(sessionID);
     if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
-        // FIXME: Pick the right database store based on the session ID.
-        postStorageTask(CrossThreadTask([this, callbackAggregator, path = crossThreadCopy(path)]() mutable {
-            RunLoop::main().dispatch([callbackAggregator = WTFMove(callbackAggregator), securityOrigins = indexedDatabaseOrigins(path)] {
-                for (const auto& securityOrigin : securityOrigins)
-                    callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::IndexedDBDatabases, 0 });
-            });
-        }));
+        webIDBServer(sessionID).getOrigins([callbackAggregator](auto&& origins) {
+            while (!origins.isEmpty())
+                callbackAggregator->m_websiteData.entries.append({ origins.takeAny(), WebsiteDataType::IndexedDBDatabases, 0 });
+        });
     }
 #endif
 
@@ -1956,22 +1950,13 @@
 #if ENABLE(INDEXED_DATABASE)
     auto path = m_idbDatabasePaths.get(sessionID);
     if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
-        // FIXME: Pick the right database store based on the session ID.
-        postStorageTask(CrossThreadTask([this, sessionID, callbackAggregator, path = crossThreadCopy(path), domainsToDeleteAllNonCookieWebsiteDataFor = crossThreadCopy(domainsToDeleteAllNonCookieWebsiteDataFor)]() mutable {
-            RunLoop::main().dispatch([this, sessionID, domainsToDeleteAllNonCookieWebsiteDataFor = WTFMove(domainsToDeleteAllNonCookieWebsiteDataFor), callbackAggregator, securityOrigins = indexedDatabaseOrigins(path)] {
-                Vector<SecurityOriginData> entriesToDelete;
-                for (const auto& securityOrigin : securityOrigins) {
-                    auto domain = RegistrableDomain::uncheckedCreateFromHost(securityOrigin.host);
-                    if (!domainsToDeleteAllNonCookieWebsiteDataFor.contains(domain))
-                        continue;
+        webIDBServer(sessionID).getOrigins([this, protectedThis = makeRef(*this), sessionID, callbackAggregator, domainsToDeleteAllNonCookieWebsiteDataFor](auto&& origins) {
+            if (!m_webIDBServers.contains(sessionID))
+                return;
 
-                    entriesToDelete.append(securityOrigin);
-                    callbackAggregator->m_domains.add(domain);
-                }
-
-                webIDBServer(sessionID).closeAndDeleteDatabasesForOrigins(entriesToDelete, [callbackAggregator] { });
-            });
-        }));
+            auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator->m_domains);
+            webIDBServer(sessionID).closeAndDeleteDatabasesForOrigins(originsToDelete, [callbackAggregator] { });
+        });
     }
 #endif
     
@@ -2101,13 +2086,10 @@
 #if ENABLE(INDEXED_DATABASE)
     auto path = m_idbDatabasePaths.get(sessionID);
     if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
-        // FIXME: Pick the right database store based on the session ID.
-        postStorageTask(CrossThreadTask([this, callbackAggregator, path = crossThreadCopy(path)]() mutable {
-            RunLoop::main().dispatch([callbackAggregator, securityOrigins = indexedDatabaseOrigins(path)] {
-                for (const auto& securityOrigin : securityOrigins)
-                    callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::IndexedDBDatabases, 0 });
-            });
-        }));
+        webIDBServer(sessionID).getOrigins([callbackAggregator](auto&& origins) {
+            while (!origins.isEmpty())
+                callbackAggregator->m_websiteData.entries.append({ origins.takeAny(), WebsiteDataType::IndexedDBDatabases, 0 });
+        });
     }
 #endif
     
@@ -2425,72 +2407,6 @@
     }).iterator->value;
 }
 
-void NetworkProcess::ensurePathExists(const String& path)
-{
-    ASSERT(!RunLoop::isMain());
-    
-    if (!FileSystem::makeAllDirectories(path))
-        LOG_ERROR("Failed to make all directories for path '%s'", path.utf8().data());
-}
-
-void NetworkProcess::postStorageTask(CrossThreadTask&& task)
-{
-    ASSERT(RunLoop::isMain());
-    
-    LockHolder locker(m_storageTaskMutex);
-    
-    m_storageTasks.append(WTFMove(task));
-    
-    m_storageTaskQueue->dispatch([this] {
-        performNextStorageTask();
-    });
-}
-
-void NetworkProcess::performNextStorageTask()
-{
-    ASSERT(!RunLoop::isMain());
-    
-    CrossThreadTask task;
-    {
-        LockHolder locker(m_storageTaskMutex);
-        ASSERT(!m_storageTasks.isEmpty());
-        task = m_storageTasks.takeFirst();
-    }
-    
-    task.performTask();
-}
-
-void NetworkProcess::collectIndexedDatabaseOriginsForVersion(const String& path, HashSet<WebCore::SecurityOriginData>& securityOrigins)
-{
-    if (path.isEmpty())
-        return;
-
-    for (auto& topOriginPath : FileSystem::listDirectory(path, "*")) {
-        auto databaseIdentifier = FileSystem::pathGetFileName(topOriginPath);
-        if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier)) {
-            securityOrigins.add(WTFMove(*securityOrigin));
-        
-            for (auto& originPath : FileSystem::listDirectory(topOriginPath, "*")) {
-                databaseIdentifier = FileSystem::pathGetFileName(originPath);
-                if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier))
-                    securityOrigins.add(WTFMove(*securityOrigin));
-            }
-        }
-    }
-}
-
-HashSet<WebCore::SecurityOriginData> NetworkProcess::indexedDatabaseOrigins(const String& path)
-{
-    if (path.isEmpty())
-        return { };
-    
-    HashSet<WebCore::SecurityOriginData> securityOrigins;
-    collectIndexedDatabaseOriginsForVersion(FileSystem::pathByAppendingComponent(path, "v0"), securityOrigins);
-    collectIndexedDatabaseOriginsForVersion(FileSystem::pathByAppendingComponent(path, "v1"), securityOrigins);
-
-    return securityOrigins;
-}
-
 void NetworkProcess::addIndexedDatabaseSession(PAL::SessionID sessionID, String& indexedDatabaseDirectory, SandboxExtension::Handle& handle)
 {
     // *********
@@ -2499,8 +2415,6 @@
     auto addResult = m_idbDatabasePaths.add(sessionID, indexedDatabaseDirectory);
     if (addResult.isNewEntry) {
         SandboxExtension::consumePermanently(handle);
-        if (!indexedDatabaseDirectory.isEmpty())
-            postStorageTask(createCrossThreadTask(*this, &NetworkProcess::ensurePathExists, indexedDatabaseDirectory));
         setSessionStorageQuotaManagerIDBRootPath(sessionID, indexedDatabaseDirectory);
     }
 }
@@ -2635,11 +2549,8 @@
         processTerminationDelayEnabled
     };
     auto addResult = m_serviceWorkerInfo.add(sessionID, WTFMove(info));
-    if (addResult.isNewEntry) {
+    if (addResult.isNewEntry)
         SandboxExtension::consumePermanently(handle);
-        if (!addResult.iterator->value.databasePath.isEmpty())
-            postStorageTask(createCrossThreadTask(*this, &NetworkProcess::ensurePathExists, addResult.iterator->value.databasePath));
-    }
 }
 #endif // ENABLE(SERVICE_WORKER)
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (266741 => 266742)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-09-08 19:37:42 UTC (rev 266742)
@@ -466,8 +466,6 @@
 
 #if ENABLE(INDEXED_DATABASE)
     void addIndexedDatabaseSession(PAL::SessionID, String&, SandboxExtension::Handle&);
-    void collectIndexedDatabaseOriginsForVersion(const String&, HashSet<WebCore::SecurityOriginData>&);
-    HashSet<WebCore::SecurityOriginData> indexedDatabaseOrigins(const String& path);
     Ref<WebIDBServer> createWebIDBServer(PAL::SessionID);
     void setSessionStorageQuotaManagerIDBRootPath(PAL::SessionID, const String& idbRootPath);
     void removeWebIDBServerIfPossible(PAL::SessionID);
@@ -485,11 +483,6 @@
     void addServiceWorkerSession(PAL::SessionID, bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle&);
 #endif
 
-    void postStorageTask(CrossThreadTask&&);
-    // For execution on work queue thread only.
-    void performNextStorageTask();
-    void ensurePathExists(const String& path);
-
     class SessionStorageQuotaManager {
         WTF_MAKE_FAST_ALLOCATED;
     public:
@@ -570,15 +563,10 @@
     WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
 #endif
 
-    Ref<WorkQueue> m_storageTaskQueue { WorkQueue::create("com.apple.WebKit.StorageTask") };
-
 #if ENABLE(INDEXED_DATABASE)
     HashMap<PAL::SessionID, String> m_idbDatabasePaths;
     HashMap<PAL::SessionID, RefPtr<WebIDBServer>> m_webIDBServers;
 #endif
-
-    Deque<CrossThreadTask> m_storageTasks;
-    Lock m_storageTaskMutex;
     
 #if ENABLE(SERVICE_WORKER)
     struct ServiceWorkerInfo {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to