Title: [252351] trunk/Source/WebKit
Revision
252351
Author
[email protected]
Date
2019-11-11 17:49:26 -0800 (Mon, 11 Nov 2019)

Log Message

Add size file for CacheStorage
https://bugs.webkit.org/show_bug.cgi?id=204027

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):
* NetworkProcess/cache/CacheStorageEngine.h:
* NetworkProcess/cache/CacheStorageEngineCaches.cpp:
(WebKit::CacheStorage::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 (252350 => 252351)


--- trunk/Source/WebKit/ChangeLog	2019-11-12 01:47:50 UTC (rev 252350)
+++ trunk/Source/WebKit/ChangeLog	2019-11-12 01:49:26 UTC (rev 252351)
@@ -1,3 +1,28 @@
+2019-11-11  Sihui Liu  <[email protected]>
+
+        Add size file for CacheStorage
+        https://bugs.webkit.org/show_bug.cgi?id=204027
+
+        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):
+        * NetworkProcess/cache/CacheStorageEngine.h:
+        * NetworkProcess/cache/CacheStorageEngineCaches.cpp:
+        (WebKit::CacheStorage::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-11  Youenn Fablet  <[email protected]>
 
         Fail cross-origin redirection loads in case of CORS with redirection URLs having credentials

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp (252350 => 252351)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp	2019-11-12 01:47:50 UTC (rev 252350)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp	2019-11-12 01:49:26 UTC (rev 252351)
@@ -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>
 
@@ -461,6 +462,55 @@
     });
 }
 
+void Engine::writeSizeFile(const String& path, uint64_t size)
+{
+    if (!shouldPersist())
+        return;
+
+    m_ioQueue->dispatch([path = path.isolatedCopy(), size]() {
+        auto fileHandle = FileSystem::openAndLockFile(path, FileSystem::FileOpenMode::Write, { FileSystem::FileLockMode::Exclusive });
+        auto closeFileHandle = makeScopeExit([&] {
+            FileSystem::unlockAndCloseFile(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());
+    ASSERT(FileSystem::fileExists(path));
+
+    auto fileHandle = FileSystem::openAndLockFile(path, FileSystem::FileOpenMode::Read, { FileSystem::FileLockMode::Exclusive });
+    auto closeFileHandle = makeScopeExit([&] {
+        FileSystem::unlockAndCloseFile(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)

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h (252350 => 252351)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h	2019-11-12 01:47:50 UTC (rev 252350)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h	2019-11-12 01:49:26 UTC (rev 252351)
@@ -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 (252350 => 252351)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp	2019-11-12 01:47:50 UTC (rev 252350)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp	2019-11-12 01:49:26 UTC (rev 252351)
@@ -51,6 +51,11 @@
     return FileSystem::pathByAppendingComponent(cachesRootPath, "origin"_s);
 }
 
+static inline String 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 (252350 => 252351)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h	2019-11-12 01:47:50 UTC (rev 252350)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h	2019-11-12 01:49:26 UTC (rev 252351)
@@ -105,6 +105,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