зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1286798 - Part 37: Always preallocate quota when initializing a snapshot; r=asuth
Besides always preallocating quota we now also preallocate more. This mitigates number of additional sync calls.
This commit is contained in:
Родитель
5809f14bbd
Коммит
05662ca09e
|
@ -80,7 +80,9 @@ LSDatabaseChild::RecvRequestAllowToClose()
|
||||||
|
|
||||||
PBackgroundLSSnapshotChild*
|
PBackgroundLSSnapshotChild*
|
||||||
LSDatabaseChild::AllocPBackgroundLSSnapshotChild(const nsString& aDocumentURI,
|
LSDatabaseChild::AllocPBackgroundLSSnapshotChild(const nsString& aDocumentURI,
|
||||||
|
const bool& aIncreasePeakUsage,
|
||||||
const int64_t& aRequestedSize,
|
const int64_t& aRequestedSize,
|
||||||
|
const int64_t& aMinSize,
|
||||||
LSSnapshotInitInfo* aInitInfo)
|
LSSnapshotInitInfo* aInitInfo)
|
||||||
{
|
{
|
||||||
MOZ_CRASH("PBackgroundLSSnapshotChild actor should be manually constructed!");
|
MOZ_CRASH("PBackgroundLSSnapshotChild actor should be manually constructed!");
|
||||||
|
|
|
@ -68,7 +68,9 @@ private:
|
||||||
|
|
||||||
PBackgroundLSSnapshotChild*
|
PBackgroundLSSnapshotChild*
|
||||||
AllocPBackgroundLSSnapshotChild(const nsString& aDocumentURI,
|
AllocPBackgroundLSSnapshotChild(const nsString& aDocumentURI,
|
||||||
|
const bool& aIncreasePeakUsage,
|
||||||
const int64_t& aRequestedSize,
|
const int64_t& aRequestedSize,
|
||||||
|
const int64_t& aMinSize,
|
||||||
LSSnapshotInitInfo* aInitInfo) override;
|
LSSnapshotInitInfo* aInitInfo) override;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -1390,8 +1390,7 @@ public:
|
||||||
NoteInactiveDatabase(Database* aDatabase);
|
NoteInactiveDatabase(Database* aDatabase);
|
||||||
|
|
||||||
void
|
void
|
||||||
GetSnapshotInitInfo(int64_t aRequestedSize,
|
GetSnapshotInitInfo(nsTHashtable<nsStringHashKey>& aLoadedItems,
|
||||||
nsTHashtable<nsStringHashKey>& aLoadedItems,
|
|
||||||
nsTArray<LSItemInfo>& aItemInfos,
|
nsTArray<LSItemInfo>& aItemInfos,
|
||||||
uint32_t& aTotalLength,
|
uint32_t& aTotalLength,
|
||||||
int64_t& aInitialUsage,
|
int64_t& aInitialUsage,
|
||||||
|
@ -1430,8 +1429,9 @@ public:
|
||||||
void
|
void
|
||||||
EndUpdateBatch(int64_t aSnapshotPeakUsage);
|
EndUpdateBatch(int64_t aSnapshotPeakUsage);
|
||||||
|
|
||||||
bool
|
int64_t
|
||||||
UpdateUsage(int64_t aDelta);
|
RequestUpdateUsage(int64_t aRequestedSize,
|
||||||
|
int64_t aMinSize);
|
||||||
|
|
||||||
NS_INLINE_DECL_REFCOUNTING(Datastore)
|
NS_INLINE_DECL_REFCOUNTING(Datastore)
|
||||||
|
|
||||||
|
@ -1439,6 +1439,9 @@ private:
|
||||||
// Reference counted.
|
// Reference counted.
|
||||||
~Datastore();
|
~Datastore();
|
||||||
|
|
||||||
|
bool
|
||||||
|
UpdateUsage(int64_t aDelta);
|
||||||
|
|
||||||
void
|
void
|
||||||
MaybeClose();
|
MaybeClose();
|
||||||
|
|
||||||
|
@ -1651,13 +1654,17 @@ private:
|
||||||
|
|
||||||
PBackgroundLSSnapshotParent*
|
PBackgroundLSSnapshotParent*
|
||||||
AllocPBackgroundLSSnapshotParent(const nsString& aDocumentURI,
|
AllocPBackgroundLSSnapshotParent(const nsString& aDocumentURI,
|
||||||
|
const bool& aIncreasePeakUsage,
|
||||||
const int64_t& aRequestedSize,
|
const int64_t& aRequestedSize,
|
||||||
|
const int64_t& aMinSize,
|
||||||
LSSnapshotInitInfo* aInitInfo) override;
|
LSSnapshotInitInfo* aInitInfo) override;
|
||||||
|
|
||||||
mozilla::ipc::IPCResult
|
mozilla::ipc::IPCResult
|
||||||
RecvPBackgroundLSSnapshotConstructor(PBackgroundLSSnapshotParent* aActor,
|
RecvPBackgroundLSSnapshotConstructor(PBackgroundLSSnapshotParent* aActor,
|
||||||
const nsString& aDocumentURI,
|
const nsString& aDocumentURI,
|
||||||
|
const bool& aIncreasePeakUsage,
|
||||||
const int64_t& aRequestedSize,
|
const int64_t& aRequestedSize,
|
||||||
|
const int64_t& aMinSize,
|
||||||
LSSnapshotInitInfo* aInitInfo) override;
|
LSSnapshotInitInfo* aInitInfo) override;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -3757,8 +3764,7 @@ Datastore::NoteInactiveDatabase(Database* aDatabase)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Datastore::GetSnapshotInitInfo(int64_t aRequestedSize,
|
Datastore::GetSnapshotInitInfo(nsTHashtable<nsStringHashKey>& aLoadedItems,
|
||||||
nsTHashtable<nsStringHashKey>& aLoadedItems,
|
|
||||||
nsTArray<LSItemInfo>& aItemInfos,
|
nsTArray<LSItemInfo>& aItemInfos,
|
||||||
uint32_t& aTotalLength,
|
uint32_t& aTotalLength,
|
||||||
int64_t& aInitialUsage,
|
int64_t& aInitialUsage,
|
||||||
|
@ -3832,9 +3838,6 @@ Datastore::GetSnapshotInitInfo(int64_t aRequestedSize,
|
||||||
|
|
||||||
aInitialUsage = mUsage;
|
aInitialUsage = mUsage;
|
||||||
aPeakUsage = aInitialUsage;
|
aPeakUsage = aInitialUsage;
|
||||||
if (aRequestedSize && UpdateUsage(aRequestedSize)) {
|
|
||||||
aPeakUsage += aRequestedSize;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4078,6 +4081,25 @@ Datastore::EndUpdateBatch(int64_t aSnapshotPeakUsage)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t
|
||||||
|
Datastore::RequestUpdateUsage(int64_t aRequestedSize,
|
||||||
|
int64_t aMinSize)
|
||||||
|
{
|
||||||
|
AssertIsOnBackgroundThread();
|
||||||
|
MOZ_ASSERT(aRequestedSize > 0);
|
||||||
|
MOZ_ASSERT(aMinSize > 0);
|
||||||
|
|
||||||
|
if (UpdateUsage(aRequestedSize)) {
|
||||||
|
return aRequestedSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UpdateUsage(aMinSize)) {
|
||||||
|
return aMinSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Datastore::UpdateUsage(int64_t aDelta)
|
Datastore::UpdateUsage(int64_t aDelta)
|
||||||
{
|
{
|
||||||
|
@ -4411,12 +4433,19 @@ Database::RecvAllowToClose()
|
||||||
|
|
||||||
PBackgroundLSSnapshotParent*
|
PBackgroundLSSnapshotParent*
|
||||||
Database::AllocPBackgroundLSSnapshotParent(const nsString& aDocumentURI,
|
Database::AllocPBackgroundLSSnapshotParent(const nsString& aDocumentURI,
|
||||||
|
const bool& aIncreasePeakUsage,
|
||||||
const int64_t& aRequestedSize,
|
const int64_t& aRequestedSize,
|
||||||
|
const int64_t& aMinSize,
|
||||||
LSSnapshotInitInfo* aInitInfo)
|
LSSnapshotInitInfo* aInitInfo)
|
||||||
{
|
{
|
||||||
AssertIsOnBackgroundThread();
|
AssertIsOnBackgroundThread();
|
||||||
|
|
||||||
if (NS_WARN_IF(aRequestedSize < 0)) {
|
if (NS_WARN_IF(aIncreasePeakUsage && aRequestedSize <= 0)) {
|
||||||
|
ASSERT_UNLESS_FUZZING();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_WARN_IF(aIncreasePeakUsage && aMinSize <= 0)) {
|
||||||
ASSERT_UNLESS_FUZZING();
|
ASSERT_UNLESS_FUZZING();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -4436,11 +4465,14 @@ mozilla::ipc::IPCResult
|
||||||
Database::RecvPBackgroundLSSnapshotConstructor(
|
Database::RecvPBackgroundLSSnapshotConstructor(
|
||||||
PBackgroundLSSnapshotParent* aActor,
|
PBackgroundLSSnapshotParent* aActor,
|
||||||
const nsString& aDocumentURI,
|
const nsString& aDocumentURI,
|
||||||
|
const bool& aIncreasePeakUsage,
|
||||||
const int64_t& aRequestedSize,
|
const int64_t& aRequestedSize,
|
||||||
|
const int64_t& aMinSize,
|
||||||
LSSnapshotInitInfo* aInitInfo)
|
LSSnapshotInitInfo* aInitInfo)
|
||||||
{
|
{
|
||||||
AssertIsOnBackgroundThread();
|
AssertIsOnBackgroundThread();
|
||||||
MOZ_ASSERT(aRequestedSize >= 0);
|
MOZ_ASSERT_IF(aIncreasePeakUsage, aRequestedSize > 0);
|
||||||
|
MOZ_ASSERT_IF(aIncreasePeakUsage, aMinSize > 0);
|
||||||
MOZ_ASSERT(aInitInfo);
|
MOZ_ASSERT(aInitInfo);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
|
@ -4454,14 +4486,18 @@ Database::RecvPBackgroundLSSnapshotConstructor(
|
||||||
int64_t initialUsage;
|
int64_t initialUsage;
|
||||||
int64_t peakUsage;
|
int64_t peakUsage;
|
||||||
LSSnapshot::LoadState loadState;
|
LSSnapshot::LoadState loadState;
|
||||||
mDatastore->GetSnapshotInitInfo(aRequestedSize,
|
mDatastore->GetSnapshotInitInfo(loadedItems,
|
||||||
loadedItems,
|
|
||||||
itemInfos,
|
itemInfos,
|
||||||
totalLength,
|
totalLength,
|
||||||
initialUsage,
|
initialUsage,
|
||||||
peakUsage,
|
peakUsage,
|
||||||
loadState);
|
loadState);
|
||||||
|
|
||||||
|
if (aIncreasePeakUsage) {
|
||||||
|
int64_t size = mDatastore->RequestUpdateUsage(aRequestedSize, aMinSize);
|
||||||
|
peakUsage += size;
|
||||||
|
}
|
||||||
|
|
||||||
snapshot->Init(loadedItems, totalLength, initialUsage, peakUsage, loadState);
|
snapshot->Init(loadedItems, totalLength, initialUsage, peakUsage, loadState);
|
||||||
|
|
||||||
RegisterSnapshot(snapshot);
|
RegisterSnapshot(snapshot);
|
||||||
|
@ -4781,15 +4817,11 @@ Snapshot::RecvIncreasePeakUsage(const int64_t& aRequestedSize,
|
||||||
return IPC_FAIL_NO_REASON(this);
|
return IPC_FAIL_NO_REASON(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mDatastore->UpdateUsage(aRequestedSize)) {
|
int64_t size = mDatastore->RequestUpdateUsage(aRequestedSize, aMinSize);
|
||||||
mPeakUsage += aRequestedSize;
|
|
||||||
*aSize = aRequestedSize;
|
mPeakUsage += size;
|
||||||
} else if (mDatastore->UpdateUsage(aMinSize)) {
|
|
||||||
mPeakUsage += aMinSize;
|
*aSize = size;
|
||||||
*aSize = aMinSize;
|
|
||||||
} else {
|
|
||||||
*aSize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return IPC_OK();
|
return IPC_OK();
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ LSDatabase::GetLength(LSObject* aObject,
|
||||||
MOZ_ASSERT(mActor);
|
MOZ_ASSERT(mActor);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject, /* aRequestedBySetItem */ false);
|
nsresult rv = EnsureSnapshot(aObject);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ LSDatabase::GetKey(LSObject* aObject,
|
||||||
MOZ_ASSERT(mActor);
|
MOZ_ASSERT(mActor);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject, /* aRequestedBySetItem */ false);
|
nsresult rv = EnsureSnapshot(aObject);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ LSDatabase::GetItem(LSObject* aObject,
|
||||||
MOZ_ASSERT(mActor);
|
MOZ_ASSERT(mActor);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject, /* aRequestedBySetItem */ false);
|
nsresult rv = EnsureSnapshot(aObject);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ LSDatabase::GetKeys(LSObject* aObject,
|
||||||
MOZ_ASSERT(mActor);
|
MOZ_ASSERT(mActor);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject, /* aRequestedBySetItem */ false);
|
nsresult rv = EnsureSnapshot(aObject);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ LSDatabase::SetItem(LSObject* aObject,
|
||||||
MOZ_ASSERT(mActor);
|
MOZ_ASSERT(mActor);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject, /* aRequestedBySetItem */ true);
|
nsresult rv = EnsureSnapshot(aObject);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -216,7 +216,7 @@ LSDatabase::RemoveItem(LSObject* aObject,
|
||||||
MOZ_ASSERT(mActor);
|
MOZ_ASSERT(mActor);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject, /* aRequestedBySetItem */ false);
|
nsresult rv = EnsureSnapshot(aObject);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -238,7 +238,7 @@ LSDatabase::Clear(LSObject* aObject,
|
||||||
MOZ_ASSERT(mActor);
|
MOZ_ASSERT(mActor);
|
||||||
MOZ_ASSERT(!mAllowedToClose);
|
MOZ_ASSERT(!mAllowedToClose);
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject, /* aRequestedBySetItem */ false);
|
nsresult rv = EnsureSnapshot(aObject);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -263,9 +263,7 @@ LSDatabase::BeginExplicitSnapshot(LSObject* aObject)
|
||||||
return NS_ERROR_ALREADY_INITIALIZED;
|
return NS_ERROR_ALREADY_INITIALIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult rv = EnsureSnapshot(aObject,
|
nsresult rv = EnsureSnapshot(aObject, /* aExplicit */ true);
|
||||||
/* aRequestedBySetItem */ false,
|
|
||||||
/* aExplicit */ true);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -297,7 +295,6 @@ LSDatabase::EndExplicitSnapshot(LSObject* aObject)
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
LSDatabase::EnsureSnapshot(LSObject* aObject,
|
LSDatabase::EnsureSnapshot(LSObject* aObject,
|
||||||
bool aRequestedBySetItem,
|
|
||||||
bool aExplicit)
|
bool aExplicit)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aObject);
|
MOZ_ASSERT(aObject);
|
||||||
|
@ -313,13 +310,13 @@ LSDatabase::EnsureSnapshot(LSObject* aObject,
|
||||||
|
|
||||||
LSSnapshotChild* actor = new LSSnapshotChild(snapshot);
|
LSSnapshotChild* actor = new LSSnapshotChild(snapshot);
|
||||||
|
|
||||||
int64_t requestedSize = aRequestedBySetItem ? 4096 : 0;
|
|
||||||
|
|
||||||
LSSnapshotInitInfo initInfo;
|
LSSnapshotInitInfo initInfo;
|
||||||
bool ok =
|
bool ok =
|
||||||
mActor->SendPBackgroundLSSnapshotConstructor(actor,
|
mActor->SendPBackgroundLSSnapshotConstructor(actor,
|
||||||
aObject->DocumentURI(),
|
aObject->DocumentURI(),
|
||||||
requestedSize,
|
/* increasePeakUsage */ true,
|
||||||
|
/* requestedSize */ 131072,
|
||||||
|
/* minSize */ 4096,
|
||||||
&initInfo);
|
&initInfo);
|
||||||
if (NS_WARN_IF(!ok)) {
|
if (NS_WARN_IF(!ok)) {
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
|
@ -108,7 +108,6 @@ private:
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
EnsureSnapshot(LSObject* aObject,
|
EnsureSnapshot(LSObject* aObject,
|
||||||
bool aRequestedBySetItem,
|
|
||||||
bool aExplicit = false);
|
bool aExplicit = false);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -48,7 +48,9 @@ parent:
|
||||||
async AllowToClose();
|
async AllowToClose();
|
||||||
|
|
||||||
sync PBackgroundLSSnapshot(nsString documentURI,
|
sync PBackgroundLSSnapshot(nsString documentURI,
|
||||||
int64_t requestedSize)
|
bool increasePeakUsage,
|
||||||
|
int64_t requestedSize,
|
||||||
|
int64_t minSize)
|
||||||
returns (LSSnapshotInitInfo initInfo);
|
returns (LSSnapshotInitInfo initInfo);
|
||||||
|
|
||||||
child:
|
child:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче