mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 1824075 - Add telemetry for time spent in quota manager shutdown; r=dom-storage-reviewers,jari
Differential Revision: https://phabricator.services.mozilla.com/D186603
This commit is contained in:
parent
5782b1504f
commit
df72361673
@ -1744,8 +1744,15 @@ void QuotaManager::ShutdownInstance() {
|
||||
AssertIsOnBackgroundThread();
|
||||
|
||||
if (gInstance) {
|
||||
auto recordTimeDeltaHelper =
|
||||
MakeRefPtr<RecordTimeDeltaHelper>(Telemetry::QM_SHUTDOWN_TIME_V0);
|
||||
|
||||
recordTimeDeltaHelper->Start();
|
||||
|
||||
gInstance->Shutdown();
|
||||
|
||||
recordTimeDeltaHelper->End();
|
||||
|
||||
gInstance = nullptr;
|
||||
} else {
|
||||
// If we were never initialized, just set the flag to avoid late creation.
|
||||
@ -2357,6 +2364,7 @@ void QuotaManager::Shutdown() {
|
||||
};
|
||||
|
||||
// Body of the function
|
||||
|
||||
ScopedLogExtraInfo scope{ScopedLogExtraInfo::kTagContext,
|
||||
"dom::quota::QuotaManager::Shutdown"_ns};
|
||||
|
||||
@ -6561,7 +6569,7 @@ RecordTimeDeltaHelper::Run() {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
if (mInitializedTime.isSome()) {
|
||||
// Keys for QM_QUOTA_INFO_LOAD_TIME_V0:
|
||||
// Keys for QM_QUOTA_INFO_LOAD_TIME_V0 and QM_SHUTDOWN_TIME_V0:
|
||||
// Normal: Normal conditions.
|
||||
// WasSuspended: There was a OS sleep so that it was suspended.
|
||||
// TimeStampErr1: The recorded start time is unexpectedly greater than the
|
||||
|
@ -17,9 +17,7 @@ namespace mozilla::dom::quota::test {
|
||||
|
||||
class QuotaManagerDependencyFixture : public testing::Test {
|
||||
public:
|
||||
protected:
|
||||
static void InitializeFixture();
|
||||
|
||||
static void ShutdownFixture();
|
||||
|
||||
static void InitializeStorage();
|
||||
|
185
dom/quota/test/gtest/TestTelemetry.cpp
Normal file
185
dom/quota/test/gtest/TestTelemetry.cpp
Normal file
@ -0,0 +1,185 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "mozilla/dom/ScriptSettings.h"
|
||||
#include "mozilla/dom/SimpleGlobalObject.h"
|
||||
#include "mozilla/gtest/MozAssertions.h"
|
||||
#include "nsITelemetry.h"
|
||||
#include "QuotaManagerDependencyFixture.h"
|
||||
|
||||
namespace mozilla::dom::quota::test {
|
||||
|
||||
namespace {
|
||||
|
||||
namespace js_helpers {
|
||||
|
||||
void CallFunction(JSContext* aCx, JS::Handle<JS::Value> aValue,
|
||||
const char* aName, JS::MutableHandle<JS::Value> aResult) {
|
||||
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
|
||||
|
||||
JS::Rooted<JS::Value> result(aCx);
|
||||
ASSERT_TRUE(JS_CallFunctionName(aCx, obj, aName,
|
||||
JS::HandleValueArray::empty(), &result));
|
||||
|
||||
aResult.set(result);
|
||||
}
|
||||
|
||||
void HasProperty(JSContext* aCx, JS::Handle<JS::Value> aValue,
|
||||
const char* aName, bool* aResult) {
|
||||
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
|
||||
|
||||
bool result;
|
||||
ASSERT_TRUE(JS_HasProperty(aCx, obj, aName, &result));
|
||||
|
||||
*aResult = result;
|
||||
}
|
||||
|
||||
void GetProperty(JSContext* aCx, JS::Handle<JS::Value> aValue,
|
||||
const char* aName, JS::MutableHandle<JS::Value> aResult) {
|
||||
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
|
||||
|
||||
JS::Rooted<JS::Value> result(aCx);
|
||||
ASSERT_TRUE(JS_GetProperty(aCx, obj, aName, &result));
|
||||
|
||||
aResult.set(result);
|
||||
}
|
||||
|
||||
void Enumerate(JSContext* aCx, JS::Handle<JS::Value> aValue,
|
||||
JS::MutableHandle<JS::IdVector> aResult) {
|
||||
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
|
||||
ASSERT_TRUE(JS_Enumerate(aCx, obj, aResult));
|
||||
}
|
||||
|
||||
void GetElement(JSContext* aCx, JS::Handle<JS::Value> aValue, uint32_t aIndex,
|
||||
JS::MutableHandle<JS::Value> aResult) {
|
||||
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
|
||||
|
||||
JS::Rooted<JS::Value> result(aCx);
|
||||
ASSERT_TRUE(JS_GetElement(aCx, obj, aIndex, &result));
|
||||
|
||||
aResult.set(result);
|
||||
}
|
||||
|
||||
void GetIndexValue(JSContext* aCx, JS::Handle<JS::Value> aValues,
|
||||
JS::PropertyKey aIndexId, uint32_t* aResult) {
|
||||
nsAutoJSString indexId;
|
||||
ASSERT_TRUE(indexId.init(aCx, aIndexId));
|
||||
|
||||
nsresult rv;
|
||||
const auto index = indexId.ToInteger64(&rv);
|
||||
ASSERT_NS_SUCCEEDED(rv);
|
||||
|
||||
JS::Rooted<JS::Value> element(aCx);
|
||||
GetElement(aCx, aValues, index, &element);
|
||||
|
||||
uint32_t value = 0;
|
||||
ASSERT_TRUE(JS::ToUint32(aCx, element, &value));
|
||||
|
||||
*aResult = value;
|
||||
}
|
||||
|
||||
} // namespace js_helpers
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(DOM_Quota_Telemetry, ShutdownTime)
|
||||
{
|
||||
nsCOMPtr<nsITelemetry> telemetry =
|
||||
do_GetService("@mozilla.org/base/telemetry;1");
|
||||
|
||||
JSObject* simpleGlobal = dom::SimpleGlobalObject::Create(
|
||||
dom::SimpleGlobalObject::GlobalType::BindingDetail);
|
||||
|
||||
JS::Rooted<JSObject*> global(dom::RootingCx(), simpleGlobal);
|
||||
|
||||
AutoJSAPI jsapi;
|
||||
ASSERT_TRUE(jsapi.Init(global));
|
||||
|
||||
JSContext* cx = jsapi.cx();
|
||||
|
||||
JS::Rooted<JS::Value> histogram(cx);
|
||||
ASSERT_NS_SUCCEEDED(telemetry->GetKeyedHistogramById("QM_SHUTDOWN_TIME_V0"_ns,
|
||||
cx, &histogram));
|
||||
|
||||
JS::Rooted<JS::Value> dummy(cx);
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::CallFunction(cx, histogram, "clear", &dummy));
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(QuotaManagerDependencyFixture::InitializeFixture());
|
||||
ASSERT_NO_FATAL_FAILURE(QuotaManagerDependencyFixture::ShutdownFixture());
|
||||
|
||||
JS::Rooted<JS::Value> snapshot(cx);
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::CallFunction(cx, histogram, "snapshot", &snapshot));
|
||||
|
||||
{
|
||||
bool hasKey = false;
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::HasProperty(cx, snapshot, "Normal", &hasKey));
|
||||
ASSERT_TRUE(hasKey);
|
||||
|
||||
JS::Rooted<JS::Value> key(cx);
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::GetProperty(cx, snapshot, "Normal", &key));
|
||||
|
||||
JS::Rooted<JS::Value> values(cx);
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::GetProperty(cx, key, "values", &values));
|
||||
|
||||
JS::Rooted<JS::IdVector> indexIds(cx, JS::IdVector(cx));
|
||||
ASSERT_NO_FATAL_FAILURE(js_helpers::Enumerate(cx, values, &indexIds));
|
||||
ASSERT_TRUE(indexIds.length() == 2u || indexIds.length() == 3u);
|
||||
|
||||
if (indexIds.length() == 2) {
|
||||
uint32_t value = 0u;
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::GetIndexValue(cx, values, indexIds[0], &value));
|
||||
ASSERT_EQ(value, 1u);
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::GetIndexValue(cx, values, indexIds[1], &value));
|
||||
ASSERT_EQ(value, 0u);
|
||||
} else {
|
||||
uint32_t value = 1u;
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::GetIndexValue(cx, values, indexIds[0], &value));
|
||||
ASSERT_EQ(value, 0u);
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::GetIndexValue(cx, values, indexIds[1], &value));
|
||||
ASSERT_EQ(value, 1u);
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::GetIndexValue(cx, values, indexIds[2], &value));
|
||||
ASSERT_EQ(value, 0u);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
bool hasKey = true;
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::HasProperty(cx, snapshot, "WasSuspended", &hasKey));
|
||||
ASSERT_FALSE(hasKey);
|
||||
}
|
||||
|
||||
{
|
||||
bool hasKey = true;
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::HasProperty(cx, snapshot, "TimeStampErr1", &hasKey));
|
||||
ASSERT_FALSE(hasKey);
|
||||
}
|
||||
|
||||
{
|
||||
bool hasKey = true;
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
js_helpers::HasProperty(cx, snapshot, "TimeStampErr2", &hasKey));
|
||||
ASSERT_FALSE(hasKey);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace mozilla::dom::quota::test
|
@ -30,6 +30,7 @@ UNIFIED_SOURCES = [
|
||||
"TestQuotaManager.cpp",
|
||||
"TestResultExtensions.cpp",
|
||||
"TestScopedLogExtraInfo.cpp",
|
||||
"TestTelemetry.cpp",
|
||||
"TestUsageInfo.cpp",
|
||||
]
|
||||
|
||||
|
@ -17296,6 +17296,19 @@
|
||||
"alert_emails": ["ttung@mozilla.com", "storage-telemetry@mozilla.com"],
|
||||
"description": "True if the first initialization attempt succeeded, keyed by the initialization type."
|
||||
},
|
||||
"QM_SHUTDOWN_TIME_V0": {
|
||||
"record_in_processes": ["main"],
|
||||
"products": ["firefox", "fennec"],
|
||||
"expires_in_version": "never",
|
||||
"bug_numbers": [1824075],
|
||||
"kind": "exponential",
|
||||
"keyed": true,
|
||||
"high": 60000,
|
||||
"n_buckets": 60,
|
||||
"releaseChannelCollection": "opt-out",
|
||||
"alert_emails": ["jvarga@mozilla.com", "storage-telemetry@mozilla.com"],
|
||||
"description": "Time (ms) for the QuotaManager to shutdown. Keyed by conditions during shutdown, see RecordTimeDeltaHelper::Run in https://searchfox.org/mozilla-central/source/dom/quota/ActorsParent.cpp"
|
||||
},
|
||||
"GV_CONTENT_PROCESS_LIFETIME_MS": {
|
||||
"record_in_processes": ["main"],
|
||||
"products": ["geckoview_streaming"],
|
||||
|
Loading…
Reference in New Issue
Block a user