- 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 };