зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
935a26e070
Коммит
8193fe19be
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче