Bug 1641512 - Use distinct types for file and database usage. r=dom-workers-and-storage-reviewers,janv

Differential Revision: https://phabricator.services.mozilla.com/D77462
This commit is contained in:
Simon Giesecke 2020-06-25 09:30:06 +00:00
Родитель 935a26e070
Коммит 8193fe19be
6 изменённых файлов: 81 добавлений и 85 удалений

10
dom/cache/QuotaClient.cpp поставляемый
Просмотреть файл

@ -32,6 +32,8 @@ using mozilla::dom::cache::Manager;
using mozilla::dom::cache::QuotaInfo;
using mozilla::dom::quota::AssertIsOnIOThread;
using mozilla::dom::quota::Client;
using mozilla::dom::quota::DatabaseUsageType;
using mozilla::dom::quota::FileUsageType;
using mozilla::dom::quota::PERSISTENCE_TYPE_DEFAULT;
using mozilla::dom::quota::PersistenceType;
using mozilla::dom::quota::QuotaManager;
@ -83,7 +85,7 @@ static nsresult GetBodyUsage(nsIFile* aMorgueDir, const Atomic<bool>& aCanceled,
return rv;
}
MOZ_DIAGNOSTIC_ASSERT(fileSize >= 0);
aUsageInfo->IncrementFileUsage(Some(fileSize));
*aUsageInfo += FileUsageType(Some(fileSize));
fileDeleted = false;
@ -424,13 +426,13 @@ Result<UsageInfo, nsresult> CacheQuotaClient::GetUsageForOriginInternal(
uint64_t usage;
if (qm->GetUsageForClient(PERSISTENCE_TYPE_DEFAULT, aGroup, aOrigin,
Client::DOMCACHE, usage)) {
usageInfo.IncrementDatabaseUsage(Some(usage));
usageInfo += DatabaseUsageType(Some(usage));
}
return usageInfo;
}
usageInfo.IncrementFileUsage(Some(paddingSize));
usageInfo += FileUsageType(Some(paddingSize));
nsCOMPtr<nsIDirectoryEnumerator> entries;
rv = dir->GetDirectoryEntries(getter_AddRefs(entries));
@ -500,7 +502,7 @@ Result<UsageInfo, nsresult> CacheQuotaClient::GetUsageForOriginInternal(
}
MOZ_DIAGNOSTIC_ASSERT(fileSize >= 0);
usageInfo.IncrementDatabaseUsage(Some(fileSize));
usageInfo += DatabaseUsageType(Some(fileSize));
continue;
}

Просмотреть файл

@ -9565,10 +9565,11 @@ nsresult RemoveDatabaseFilesAndDirectory(nsIFile& aBaseDirectory,
uint64_t usage;
if (aQuotaManager) {
rv = FileManager::GetUsage(fmDirectory, usage);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
auto fileUsageOrErr = FileManager::GetUsage(fmDirectory);
if (NS_WARN_IF(fileUsageOrErr.isErr())) {
return fileUsageOrErr.unwrapErr();
}
usage = fileUsageOrErr.inspect().GetValue().valueOr(0);
}
rv = fmDirectory->Remove(true);
@ -9576,10 +9577,12 @@ nsresult RemoveDatabaseFilesAndDirectory(nsIFile& aBaseDirectory,
// We may have deleted some files, check if we can and update quota
// information before returning the error.
if (aQuotaManager) {
uint64_t newUsage;
if (NS_SUCCEEDED(FileManager::GetUsage(fmDirectory, newUsage))) {
MOZ_ASSERT(newUsage <= usage);
usage = usage - newUsage;
auto newFileUsageOrErr = FileManager::GetUsage(fmDirectory);
if (newFileUsageOrErr.isOk()) {
const auto newFileUsage =
newFileUsageOrErr.inspect().GetValue().valueOr(0);
MOZ_ASSERT(newFileUsage <= usage);
usage -= newFileUsage;
}
}
}
@ -16807,28 +16810,27 @@ nsresult FileManager::InitDirectory(nsIFile& aDirectory, nsIFile& aDatabaseFile,
}
// static
nsresult FileManager::GetUsage(nsIFile* aDirectory, Maybe<uint64_t>& aUsage) {
Result<FileUsageType, nsresult> FileManager::GetUsage(nsIFile* aDirectory) {
AssertIsOnIOThread();
MOZ_ASSERT(aDirectory);
bool exists;
nsresult rv = aDirectory->Exists(&exists);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
return Err(rv);
}
if (!exists) {
aUsage.reset();
return NS_OK;
return FileUsageType{};
}
nsCOMPtr<nsIDirectoryEnumerator> entries;
rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
return Err(rv);
}
UsageInfo::Usage usage;
FileUsageType usage;
nsCOMPtr<nsIFile> file;
while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
@ -16836,7 +16838,7 @@ nsresult FileManager::GetUsage(nsIFile* aDirectory, Maybe<uint64_t>& aUsage) {
nsString leafName;
rv = file->GetLeafName(leafName);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
return Err(rv);
}
if (leafName.Equals(kJournalDirectoryName)) {
@ -16848,10 +16850,10 @@ nsresult FileManager::GetUsage(nsIFile* aDirectory, Maybe<uint64_t>& aUsage) {
int64_t fileSize;
rv = file->GetFileSize(&fileSize);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
return Err(rv);
}
usage += Some(uint64_t(fileSize));
usage += FileUsageType(Some(uint64_t(fileSize)));
continue;
}
@ -16860,26 +16862,10 @@ nsresult FileManager::GetUsage(nsIFile* aDirectory, Maybe<uint64_t>& aUsage) {
}
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
return Err(rv);
}
aUsage = usage;
return NS_OK;
}
// static
nsresult FileManager::GetUsage(nsIFile* aDirectory, uint64_t& aUsage) {
AssertIsOnIOThread();
MOZ_ASSERT(aDirectory);
Maybe<uint64_t> usage;
nsresult rv = GetUsage(aDirectory, usage);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
aUsage = usage.valueOr(0);
return NS_OK;
return usage;
}
nsresult FileManager::SyncDeleteFile(const int64_t aId) {
@ -17367,26 +17353,25 @@ nsresult QuotaClient::GetUsageForOriginInternal(
MOZ_ASSERT(fileSize >= 0);
aUsageInfo->IncrementDatabaseUsage(Some(uint64_t(fileSize)));
*aUsageInfo += DatabaseUsageType(Some(uint64_t(fileSize)));
rv = walFile->GetFileSize(&fileSize);
if (NS_SUCCEEDED(rv)) {
MOZ_ASSERT(fileSize >= 0);
aUsageInfo->IncrementDatabaseUsage(Some(uint64_t(fileSize)));
*aUsageInfo += DatabaseUsageType(Some(uint64_t(fileSize)));
} else if (NS_WARN_IF(rv != NS_ERROR_FILE_NOT_FOUND &&
rv != NS_ERROR_FILE_TARGET_DOES_NOT_EXIST)) {
REPORT_TELEMETRY_INIT_ERR(kQuotaExternalError, IDB_GetWalFileSize);
return rv;
}
Maybe<uint64_t> usage;
rv = FileManager::GetUsage(fmDirectory, usage);
if (NS_WARN_IF(NS_FAILED(rv))) {
auto fileUsageOrErr = FileManager::GetUsage(fmDirectory);
if (NS_WARN_IF(fileUsageOrErr.isErr())) {
REPORT_TELEMETRY_INIT_ERR(kQuotaExternalError, IDB_GetUsage);
return rv;
return fileUsageOrErr.inspectErr();
}
aUsageInfo->IncrementFileUsage(usage);
*aUsageInfo += fileUsageOrErr.inspect();
}
}

Просмотреть файл

@ -8,6 +8,7 @@
#define mozilla_dom_indexeddb_filemanager_h__
#include "mozilla/dom/quota/PersistenceType.h"
#include "mozilla/dom/quota/UsageInfo.h"
#include "mozilla/InitializedOnce.h"
#include "FileManagerBase.h"
@ -50,9 +51,7 @@ class FileManager final : public FileManagerBase<FileManager>,
const nsACString& aOrigin,
uint32_t aTelemetryId);
static nsresult GetUsage(nsIFile* aDirectory, Maybe<uint64_t>& aUsage);
static nsresult GetUsage(nsIFile* aDirectory, uint64_t& aUsage);
static Result<quota::FileUsageType, nsresult> GetUsage(nsIFile* aDirectory);
FileManager(PersistenceType aPersistenceType, const nsACString& aGroup,
const nsACString& aOrigin, const nsAString& aDatabaseName,

Просмотреть файл

@ -8991,7 +8991,7 @@ Result<UsageInfo, nsresult> QuotaClient::InitOrigin(
MOZ_ASSERT(usage >= 0);
res.IncrementDatabaseUsage(Some(uint64_t(usage)));
res += DatabaseUsageType(Some(uint64_t(usage)));
} else if (usageFileExists) {
rv = usageFile->Remove(false);
if (NS_WARN_IF(NS_FAILED(rv))) {
@ -9094,7 +9094,7 @@ Result<UsageInfo, nsresult> QuotaClient::GetUsageForOrigin(
uint64_t usage;
if (quotaManager->GetUsageForClient(PERSISTENCE_TYPE_DEFAULT, aGroup, aOrigin,
Client::LS, usage)) {
res.IncrementDatabaseUsage(Some(usage));
res += DatabaseUsageType(Some(usage));
}
return res;

Просмотреть файл

@ -13,6 +13,39 @@
BEGIN_QUOTA_NAMESPACE
enum struct UsageKind { Database, File };
template <UsageKind Kind>
struct Usage {
explicit Usage(Maybe<uint64_t> aValue = Nothing{}) : mValue(aValue) {}
Maybe<uint64_t> GetValue() const { return mValue; }
Usage& operator+=(const Usage aDelta) {
if (aDelta.mValue.isSome()) {
CheckedUint64 value = mValue.valueOr(0);
value += aDelta.mValue.value();
mValue = Some(value.isValid() ? value.value() : UINT64_MAX);
}
return *this;
}
Usage operator+(const Usage aDelta) const {
Usage res = *this;
res += aDelta;
return res;
}
private:
Maybe<uint64_t> mValue;
};
using DatabaseUsageType = Usage<UsageKind::Database>;
using FileUsageType = Usage<UsageKind::File>;
class UsageInfo final {
public:
UsageInfo& operator+=(const UsageInfo& aUsageInfo) {
@ -21,50 +54,27 @@ class UsageInfo final {
return *this;
}
void IncrementDatabaseUsage(const Maybe<uint64_t>& aUsage) {
UsageInfo& operator+=(const DatabaseUsageType aUsage) {
mDatabaseUsage += aUsage;
return *this;
}
void IncrementFileUsage(const Maybe<uint64_t>& aUsage) {
UsageInfo& operator+=(const FileUsageType aUsage) {
mFileUsage += aUsage;
return *this;
}
Maybe<uint64_t> FileUsage() const { return mFileUsage.GetValue(); }
Maybe<uint64_t> TotalUsage() const { return mDatabaseUsage + mFileUsage; }
struct Usage {
MOZ_IMPLICIT Usage(Maybe<uint64_t> aValue = Nothing{}) : mValue(aValue) {}
MOZ_IMPLICIT operator Maybe<uint64_t>() const { return mValue; }
Maybe<uint64_t> GetValue() const { return mValue; }
Usage& operator+=(const Usage aDelta) {
if (aDelta.mValue.isSome()) {
CheckedUint64 value = mValue.valueOr(0);
value += aDelta.mValue.value();
mValue = Some(value.isValid() ? value.value() : UINT64_MAX);
}
return *this;
}
Usage operator+(const Usage aDelta) const {
Usage res = *this;
res += aDelta;
return res;
}
private:
Maybe<uint64_t> mValue;
};
Maybe<uint64_t> TotalUsage() const {
const uint64_t res =
mDatabaseUsage.GetValue().valueOr(0) + FileUsage().valueOr(0);
return res ? Some(res) : Nothing();
}
private:
Usage mDatabaseUsage;
Usage mFileUsage;
DatabaseUsageType mDatabaseUsage;
FileUsageType mFileUsage;
};
END_QUOTA_NAMESPACE

Просмотреть файл

@ -1703,7 +1703,7 @@ Result<UsageInfo, nsresult> QuotaClient::GetUsageForOrigin(
MOZ_ASSERT(fileSize >= 0);
res.IncrementDatabaseUsage(Some(uint64_t(fileSize)));
res += DatabaseUsageType(Some(uint64_t(fileSize)));
continue;
}