From 1c67110e4b8bb1a9c4c87ba19dbf2789a20e4cd0 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Fri, 21 Jun 2024 11:48:01 +0000 Subject: [PATCH] Bug 1903985 - Add some information about pending ClearRequestBase operations to quota manager shutdown crash annotation; r=dom-storage-reviewers,jstutte For now, we only report how many directory iterations have been done. Differential Revision: https://phabricator.services.mozilla.com/D214521 --- dom/quota/ActorsParent.cpp | 10 ++++++++-- dom/quota/OriginOperationBase.h | 7 ++++++- dom/quota/OriginOperations.cpp | 21 +++++++++++++++++++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index ea5bbd5e60f0..e6ae93608ddd 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -2268,11 +2268,17 @@ void QuotaManager::Shutdown() { if (gNormalOriginOps) { annotation.AppendPrintf("QM: %zu normal origin ops pending\n", gNormalOriginOps->Length()); -#ifdef QM_COLLECTING_OPERATION_TELEMETRY + for (const auto& op : *gNormalOriginOps) { +#ifdef QM_COLLECTING_OPERATION_TELEMETRY annotation.AppendPrintf("Op: %s pending\n", op->Name()); - } #endif + + nsCString data; + op->Stringify(data); + + annotation.AppendPrintf("Op details:\n%s\n", data.get()); + } } { MutexAutoLock lock(quotaManager->mQuotaMutex); diff --git a/dom/quota/OriginOperationBase.h b/dom/quota/OriginOperationBase.h index b3a8f9eb6762..d0f31f6ba748 100644 --- a/dom/quota/OriginOperationBase.h +++ b/dom/quota/OriginOperationBase.h @@ -13,13 +13,15 @@ #include "mozilla/dom/quota/Config.h" #include "mozilla/dom/quota/ForwardDecls.h" #include "mozilla/dom/quota/QuotaCommon.h" +#include "mozilla/dom/quota/StringifyUtils.h" #include "nsISupportsImpl.h" namespace mozilla::dom::quota { class QuotaManager; -class OriginOperationBase : public BackgroundThreadObject { +class OriginOperationBase : public BackgroundThreadObject, + public Stringifyable { protected: const NotNull> mQuotaManager; nsresult mResultCode; @@ -70,6 +72,9 @@ class OriginOperationBase : public BackgroundThreadObject { virtual nsresult DoDirectoryWork(QuotaManager& aQuotaManager) = 0; virtual void UnblockOpen() = 0; + + private: + void DoStringify(nsACString& aData) override {} }; } // namespace mozilla::dom::quota diff --git a/dom/quota/OriginOperations.cpp b/dom/quota/OriginOperations.cpp index 48b66b19d61c..31336bff46bb 100644 --- a/dom/quota/OriginOperations.cpp +++ b/dom/quota/OriginOperations.cpp @@ -506,10 +506,13 @@ class ClearStorageOp final class ClearRequestBase : public OpenStorageDirectoryHelper> { + Atomic mIterations; + protected: ClearRequestBase(MovingNotNull> aQuotaManager, const char* aName) - : OpenStorageDirectoryHelper(std::move(aQuotaManager), aName) { + : OpenStorageDirectoryHelper(std::move(aQuotaManager), aName), + mIterations(0) { AssertIsOnOwningThread(); } @@ -529,6 +532,17 @@ class ClearRequestBase const OriginScope& aOriginScope, const Nullable& aClientType, const FileCollector& aFileCollector); + + void DoStringify(nsACString& aData) override { + aData.Append("ClearRequestBase "_ns + + // + kStringifyStartInstance + + // + "Iterations:"_ns + + IntToCString(static_cast(mIterations)) + + // + kStringifyEndInstance); + } }; class ClearOriginOp final : public ClearRequestBase { @@ -1975,7 +1989,8 @@ void ClearRequestBase::DeleteFilesInternal( QM_TRY( aFileCollector([&aClientType, &originScope = aOriginScope, aPersistenceType, &aQuotaManager, - &directoriesForRemovalRetry](nsCOMPtr&& file) + &directoriesForRemovalRetry, + this](nsCOMPtr&& file) -> mozilla::Result { QM_TRY_INSPECT(const auto& dirEntryKind, GetDirEntryKind(*file)); @@ -2078,6 +2093,8 @@ void ClearRequestBase::DeleteFilesInternal( break; } + mIterations++; + return Ok{}; }), QM_VOID);