Title: [252381] trunk/Source/WebKit
Revision
252381
Author
[email protected]
Date
2019-11-12 17:24:28 -0800 (Tue, 12 Nov 2019)

Log Message

Add size file for CacheStorage
https://bugs.webkit.org/show_bug.cgi?id=204027
<rdar://problem/57100861>

Reviewed by Youenn Fablet.

Keep the CacheStorage size in a separate file so that we can get that value without waiting for Engine to
initialize and read caches from disk.

No behavior change as the file is not in use now.

* NetworkProcess/cache/CacheStorageEngine.cpp:
(WebKit::CacheStorage::Engine::writeSizeFile):
(WebKit::CacheStorage::Engine::readSizeFile):
(WebKit::CacheStorage::Engine::clearAllCachesFromDisk):
(WebKit::CacheStorage::Engine::deleteDirectoryRecursivelyOnBackgroundThread):
* NetworkProcess/cache/CacheStorageEngine.h:
* NetworkProcess/cache/CacheStorageEngineCaches.cpp:
(WebKit::CacheStorage::Caches::cachesSizeFilename):
(WebKit::CacheStorage::Caches::updateSizeFile):
(WebKit::CacheStorage::Caches::initializeSize):
(WebKit::CacheStorage::Caches::writeRecord):
(WebKit::CacheStorage::Caches::removeRecord):
(WebKit::CacheStorage::Caches::resetSpaceUsed):
* NetworkProcess/cache/CacheStorageEngineCaches.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (252380 => 252381)


--- trunk/Source/WebKit/ChangeLog	2019-11-13 01:08:08 UTC (rev 252380)
+++ trunk/Source/WebKit/ChangeLog	2019-11-13 01:24:28 UTC (rev 252381)
@@ -1,3 +1,31 @@
+2019-11-12  Sihui Liu  <[email protected]>
+
+        Add size file for CacheStorage
+        https://bugs.webkit.org/show_bug.cgi?id=204027
+        <rdar://problem/57100861>
+
+        Reviewed by Youenn Fablet.
+
+        Keep the CacheStorage size in a separate file so that we can get that value without waiting for Engine to 
+        initialize and read caches from disk.
+
+        No behavior change as the file is not in use now.
+
+        * NetworkProcess/cache/CacheStorageEngine.cpp:
+        (WebKit::CacheStorage::Engine::writeSizeFile):
+        (WebKit::CacheStorage::Engine::readSizeFile):
+        (WebKit::CacheStorage::Engine::clearAllCachesFromDisk):
+        (WebKit::CacheStorage::Engine::deleteDirectoryRecursivelyOnBackgroundThread):
+        * NetworkProcess/cache/CacheStorageEngine.h:
+        * NetworkProcess/cache/CacheStorageEngineCaches.cpp:
+        (WebKit::CacheStorage::Caches::cachesSizeFilename):
+        (WebKit::CacheStorage::Caches::updateSizeFile):
+        (WebKit::CacheStorage::Caches::initializeSize):
+        (WebKit::CacheStorage::Caches::writeRecord):
+        (WebKit::CacheStorage::Caches::removeRecord):
+        (WebKit::CacheStorage::Caches::resetSpaceUsed):
+        * NetworkProcess/cache/CacheStorageEngineCaches.h:
+
 2019-11-12  Wenson Hsieh  <[email protected]>
 
         [iOS] WKWebView does not respect system spellchecking preference

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp (252380 => 252381)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp	2019-11-13 01:08:08 UTC (rev 252380)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp	2019-11-13 01:24:28 UTC (rev 252381)
@@ -35,6 +35,7 @@
 #include <WebCore/SecurityOrigin.h>
 #include <wtf/CallbackAggregator.h>
 #include <wtf/NeverDestroyed.h>
+#include <wtf/Scope.h>
 #include <wtf/text/StringBuilder.h>
 #include <wtf/text/StringHash.h>
 
@@ -45,6 +46,8 @@
 using namespace WebCore::DOMCacheEngine;
 using namespace NetworkCache;
 
+static Lock globalSizeFileLock;
+
 String Engine::cachesRootPath(const WebCore::ClientOrigin& origin)
 {
     if (!shouldPersist() || !m_salt)
@@ -461,6 +464,54 @@
     });
 }
 
+void Engine::writeSizeFile(const String& path, uint64_t size)
+{
+    if (!shouldPersist())
+        return;
+
+    m_ioQueue->dispatch([path = path.isolatedCopy(), size]() {
+        LockHolder locker(globalSizeFileLock);
+        auto fileHandle = FileSystem::openFile(path, FileSystem::FileOpenMode::Write);
+        auto closeFileHandler = makeScopeExit([&] {
+            FileSystem::closeFile(fileHandle);
+        });
+        if (!FileSystem::isHandleValid(fileHandle))
+            return;
+
+        FileSystem::truncateFile(fileHandle, 0);
+        FileSystem::writeToFile(fileHandle, String::number(size).utf8().data(), String::number(size).utf8().length());
+    });
+}
+
+Optional<uint64_t> Engine::readSizeFile(const String& path)
+{
+    ASSERT(!RunLoop::isMain());
+
+    LockHolder locker(globalSizeFileLock);
+    auto fileHandle = FileSystem::openFile(path, FileSystem::FileOpenMode::Read);
+    auto closeFileHandle = makeScopeExit([&] {
+        FileSystem::closeFile(fileHandle);
+    });
+
+    if (!FileSystem::isHandleValid(fileHandle))
+        return WTF::nullopt;
+
+    long long fileSize = 0;
+    if (!FileSystem::getFileSize(path, fileSize) || !fileSize)
+        return WTF::nullopt;
+
+    size_t bytesToRead;
+    if (!WTF::convertSafely(fileSize, bytesToRead))
+        return WTF::nullopt;
+
+    Vector<char> buffer(bytesToRead);
+    size_t totalBytesRead = FileSystem::readFromFile(fileHandle, buffer.data(), buffer.size());
+    if (totalBytesRead != bytesToRead)
+        return WTF::nullopt;
+
+    return String::fromUTF8(buffer.data()).toUInt64Strict();
+}
+
 class ReadOriginsTaskCounter : public RefCounted<ReadOriginsTaskCounter> {
 public:
     static Ref<ReadOriginsTaskCounter> create(CompletionHandler<void(Vector<WebsiteData::Entry>)>&& callback)
@@ -565,6 +616,7 @@
     ASSERT(RunLoop::isMain());
 
     m_ioQueue->dispatch([path = m_rootPath.isolatedCopy(), completionHandler = WTFMove(completionHandler)]() mutable {
+        LockHolder locker(globalSizeFileLock);
         for (auto& filename : FileSystem::listDirectory(path, "*")) {
             if (FileSystem::fileIsDirectory(filename, FileSystem::ShouldFollowSymbolicLinks::No))
                 deleteDirectoryRecursively(filename);
@@ -623,6 +675,7 @@
     ASSERT(RunLoop::isMain());
 
     m_ioQueue->dispatch([path = path.isolatedCopy(), completionHandler = WTFMove(completionHandler)]() mutable {
+        LockHolder locker(globalSizeFileLock);
         deleteDirectoryRecursively(path);
 
         RunLoop::main().dispatch(WTFMove(completionHandler));

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h (252380 => 252381)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h	2019-11-13 01:08:08 UTC (rev 252380)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h	2019-11-13 01:24:28 UTC (rev 252381)
@@ -84,6 +84,8 @@
     void writeFile(const String& filename, NetworkCache::Data&&, WebCore::DOMCacheEngine::CompletionCallback&&);
     void readFile(const String& filename, CompletionHandler<void(const NetworkCache::Data&, int error)>&&);
     void removeFile(const String& filename);
+    void writeSizeFile(const String&, uint64_t size);
+    static Optional<uint64_t> readSizeFile(const String&);
 
     const String& rootPath() const { return m_rootPath; }
     const NetworkCache::Salt& salt() const { return m_salt.value(); }

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp (252380 => 252381)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp	2019-11-13 01:08:08 UTC (rev 252380)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp	2019-11-13 01:24:28 UTC (rev 252381)
@@ -51,6 +51,11 @@
     return FileSystem::pathByAppendingComponent(cachesRootPath, "origin"_s);
 }
 
+String Caches::cachesSizeFilename(const String& cachesRootsPath)
+{
+    return FileSystem::pathByAppendingComponent(cachesRootsPath, "estimatedsize"_s);
+}
+
 Ref<Caches> Caches::create(Engine& engine, WebCore::ClientOrigin&& origin, String&& rootPath, WebCore::StorageQuotaManager& quotaManager)
 {
     auto caches = adoptRef(*new Caches { engine, WTFMove(origin), WTFMove(rootPath), quotaManager });
@@ -203,6 +208,12 @@
     });
 }
 
+void Caches::updateSizeFile()
+{
+    if (m_engine)
+        m_engine->writeSizeFile(cachesSizeFilename(m_rootPath), m_size);
+}
+
 void Caches::initializeSize()
 {
     if (!m_storage) {
@@ -221,6 +232,8 @@
                 return;
             }
             m_size = size;
+            updateSizeFile();
+
             m_isInitialized = true;
             auto pendingCallbacks = WTFMove(m_pendingInitializationCallbacks);
             for (auto& callback : pendingCallbacks)
@@ -535,6 +548,7 @@
     ASSERT(m_size >= previousRecordSize);
     m_size += recordInformation.size;
     m_size -= previousRecordSize;
+    updateSizeFile();
 
     if (!shouldPersist()) {
         m_volatileStorage.set(recordInformation.key, WTFMove(record));
@@ -591,6 +605,8 @@
 
     ASSERT(m_size >= record.size);
     m_size -= record.size;
+    updateSizeFile();
+
     removeCacheEntry(record.key);
 }
 
@@ -608,6 +624,8 @@
 void Caches::resetSpaceUsed()
 {
     m_size = 0;
+    updateSizeFile();
+
     if (m_quotaManager) {
         m_quotaManager->removeUser(*this);
         m_quotaManager->addUser(*this);

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h (252380 => 252381)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h	2019-11-13 01:08:08 UTC (rev 252380)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h	2019-11-13 01:24:28 UTC (rev 252381)
@@ -44,6 +44,7 @@
 
 class Caches final : public RefCounted<Caches>, private WebCore::StorageQuotaUser {
 public:
+    static String cachesSizeFilename(const String&);
     static Ref<Caches> create(Engine&, WebCore::ClientOrigin&&, String&& rootPath, WebCore::StorageQuotaManager&);
     ~Caches();
 
@@ -105,6 +106,8 @@
 
     bool hasActiveCache() const;
 
+    void updateSizeFile();
+
     bool m_isInitialized { false };
     Engine* m_engine { nullptr };
     uint64_t m_updateCounter { 0 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to