Commit b260308f authored by leon.han's avatar leon.han Committed by Commit bot

[ServiceWorker] Integrate trace events in embedded worker instance

Currently all the TRACE_EVENT* do not manage well in
embedded_worker_instance.cc, this CL integrates them to track
duration for every step throughout one complete starting worker process.

Also uses TRACE_EVENT_NESTABLE_ASYNC_* to replace deprecated
TRACE_EVENT_ASYNC*.

BUG=none

Review-Url: https://codereview.chromium.org/2821253002
Cr-Commit-Position: refs/heads/master@{#466888}
parent 702de0ad
...@@ -244,14 +244,16 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -244,14 +244,16 @@ class EmbeddedWorkerInstance::StartTask {
is_installed_(false), is_installed_(false),
started_during_browser_startup_(false), started_during_browser_startup_(false),
weak_factory_(this) { weak_factory_(this) {
TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("ServiceWorker",
this, "Script", script_url.spec()); "EmbeddedWorkerInstance::Start",
instance_, "Script", script_url.spec());
} }
~StartTask() { ~StartTask() {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
TRACE_EVENT_ASYNC_END0("ServiceWorker", "EmbeddedWorkerInstance::Start", TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker",
this); "EmbeddedWorkerInstance::Start", instance_);
if (!instance_->context_) if (!instance_->context_)
return; return;
...@@ -293,6 +295,8 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -293,6 +295,8 @@ class EmbeddedWorkerInstance::StartTask {
GURL scope(params->scope); GURL scope(params->scope);
GURL script_url(params->script_url); GURL script_url(params->script_url);
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", "ALLOCATING_PROCESS",
instance_);
bool can_use_existing_process = bool can_use_existing_process =
instance_->context_->GetVersionFailureCount( instance_->context_->GetVersionFailureCount(
params->service_worker_version_id) < kMaxSameProcessFailureCount; params->service_worker_version_id) < kMaxSameProcessFailureCount;
...@@ -323,9 +327,9 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -323,9 +327,9 @@ class EmbeddedWorkerInstance::StartTask {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (status != SERVICE_WORKER_OK) { if (status != SERVICE_WORKER_OK) {
TRACE_EVENT_ASYNC_STEP_PAST1( TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", "ALLOCATING_PROCESS",
"ServiceWorker", "EmbeddedWorkerInstance::Start", this, instance_, "Error",
"OnProcessAllocated", "Error", ServiceWorkerStatusToString(status)); ServiceWorkerStatusToString(status));
DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, process_id); DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, process_id);
StatusCallback callback = start_callback_; StatusCallback callback = start_callback_;
start_callback_.Reset(); start_callback_.Reset();
...@@ -334,9 +338,9 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -334,9 +338,9 @@ class EmbeddedWorkerInstance::StartTask {
return; return;
} }
TRACE_EVENT_ASYNC_STEP_PAST1( TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", "ALLOCATING_PROCESS",
"ServiceWorker", "EmbeddedWorkerInstance::Start", this, instance_, "Is New Process",
"OnProcessAllocated", "Is New Process", is_new_process); is_new_process);
if (is_installed_) if (is_installed_)
ServiceWorkerMetrics::RecordProcessCreated(is_new_process); ServiceWorkerMetrics::RecordProcessCreated(is_new_process);
...@@ -361,6 +365,8 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -361,6 +365,8 @@ class EmbeddedWorkerInstance::StartTask {
// is running. // is running.
params->settings.data_saver_enabled = settings.data_saver_enabled; params->settings.data_saver_enabled = settings.data_saver_enabled;
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker",
"REGISTERING_TO_DEVTOOLS", instance_);
// Register the instance to DevToolsManager on UI thread. // Register the instance to DevToolsManager on UI thread.
const int64_t service_worker_version_id = params->service_worker_version_id; const int64_t service_worker_version_id = params->service_worker_version_id;
const GURL& scope = params->scope; const GURL& scope = params->scope;
...@@ -381,16 +387,14 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -381,16 +387,14 @@ class EmbeddedWorkerInstance::StartTask {
std::unique_ptr<EmbeddedWorkerInstance::DevToolsProxy> devtools_proxy, std::unique_ptr<EmbeddedWorkerInstance::DevToolsProxy> devtools_proxy,
bool wait_for_debugger) { bool wait_for_debugger) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker",
"EmbeddedWorkerInstance::Start", this,
"OnSetupOnUICompleted");
params->worker_devtools_agent_route_id = devtools_proxy->agent_route_id(); params->worker_devtools_agent_route_id = devtools_proxy->agent_route_id();
params->wait_for_debugger = wait_for_debugger; params->wait_for_debugger = wait_for_debugger;
// Notify the instance that it is registered to the devtools manager. // Notify the instance that it is registered to the devtools manager.
instance_->OnRegisteredToDevToolsManager( instance_->OnRegisteredToDevToolsManager(
is_new_process, std::move(devtools_proxy), wait_for_debugger); is_new_process, std::move(devtools_proxy), wait_for_debugger);
TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "REGISTERING_TO_DEVTOOLS",
instance_);
ServiceWorkerStatusCode status = ServiceWorkerStatusCode status =
instance_->SendStartWorker(std::move(params)); instance_->SendStartWorker(std::move(params));
...@@ -594,9 +598,11 @@ ServiceWorkerStatusCode EmbeddedWorkerInstance::SendStartWorker( ...@@ -594,9 +598,11 @@ ServiceWorkerStatusCode EmbeddedWorkerInstance::SendStartWorker(
client_->StartWorker(*params, std::move(pending_dispatcher_request_), client_->StartWorker(*params, std::move(pending_dispatcher_request_),
std::move(host_ptr_info)); std::move(host_ptr_info));
registry_->BindWorkerToProcess(process_id(), embedded_worker_id()); registry_->BindWorkerToProcess(process_id(), embedded_worker_id());
TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "EmbeddedWorkerInstance::Start",
this, "SendStartWorker");
OnStartWorkerMessageSent(); OnStartWorkerMessageSent();
// Once the start worker message is received, renderer side will prepare a
// shadow page for getting worker script.
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", "PREPARING_SCRIPT_LOAD",
this);
return SERVICE_WORKER_OK; return SERVICE_WORKER_OK;
} }
...@@ -615,22 +621,24 @@ void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { ...@@ -615,22 +621,24 @@ void EmbeddedWorkerInstance::OnStartWorkerMessageSent() {
} }
void EmbeddedWorkerInstance::OnReadyForInspection() { void EmbeddedWorkerInstance::OnReadyForInspection() {
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnReadyForInspection");
if (devtools_proxy_) if (devtools_proxy_)
devtools_proxy_->NotifyWorkerReadyForInspection(); devtools_proxy_->NotifyWorkerReadyForInspection();
} }
void EmbeddedWorkerInstance::OnScriptReadStarted() { void EmbeddedWorkerInstance::OnScriptReadStarted() {
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", "SCRIPT_READING_CACHE",
this);
starting_phase_ = SCRIPT_READ_STARTED; starting_phase_ = SCRIPT_READ_STARTED;
} }
void EmbeddedWorkerInstance::OnScriptReadFinished() { void EmbeddedWorkerInstance::OnScriptReadFinished() {
TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "SCRIPT_READING_CACHE",
this);
starting_phase_ = SCRIPT_READ_FINISHED; starting_phase_ = SCRIPT_READ_FINISHED;
} }
void EmbeddedWorkerInstance::OnScriptLoaded() { void EmbeddedWorkerInstance::OnScriptLoaded() {
using LoadSource = ServiceWorkerMetrics::LoadSource; using LoadSource = ServiceWorkerMetrics::LoadSource;
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnScriptLoaded");
if (!inflight_start_task_) if (!inflight_start_task_)
return; return;
...@@ -643,9 +651,14 @@ void EmbeddedWorkerInstance::OnScriptLoaded() { ...@@ -643,9 +651,14 @@ void EmbeddedWorkerInstance::OnScriptLoaded() {
} else { } else {
source = LoadSource::HTTP_CACHE; source = LoadSource::HTTP_CACHE;
} }
TRACE_EVENT_ASYNC_STEP_PAST1(
"ServiceWorker", "EmbeddedWorkerInstance::Start", // starting_phase_ may be SCRIPT_READ_FINISHED in case of reading from cache.
inflight_start_task_.get(), "OnScriptLoaded", "Source", if (starting_phase_ == SCRIPT_DOWNLOADING) {
TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "SCRIPT_DOWNLOADING",
this);
}
TRACE_EVENT_NESTABLE_ASYNC_END1(
"ServiceWorker", "SCRIPT_LOADING", this, "Source",
ServiceWorkerMetrics::LoadSourceToString(source)); ServiceWorkerMetrics::LoadSourceToString(source));
if (!step_time_.is_null()) { if (!step_time_.is_null()) {
...@@ -653,6 +666,9 @@ void EmbeddedWorkerInstance::OnScriptLoaded() { ...@@ -653,6 +666,9 @@ void EmbeddedWorkerInstance::OnScriptLoaded() {
ServiceWorkerMetrics::RecordTimeToLoad(duration, source, start_situation_); ServiceWorkerMetrics::RecordTimeToLoad(duration, source, start_situation_);
} }
// Renderer side has started to launch the worker thread.
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", "LAUNCHING_WORKER_THREAD",
this);
starting_phase_ = SCRIPT_LOADED; starting_phase_ = SCRIPT_LOADED;
for (auto& observer : listener_list_) for (auto& observer : listener_list_)
observer.OnScriptLoaded(); observer.OnScriptLoaded();
...@@ -660,10 +676,14 @@ void EmbeddedWorkerInstance::OnScriptLoaded() { ...@@ -660,10 +676,14 @@ void EmbeddedWorkerInstance::OnScriptLoaded() {
} }
void EmbeddedWorkerInstance::OnURLJobCreatedForMainScript() { void EmbeddedWorkerInstance::OnURLJobCreatedForMainScript() {
// Indicates that the shadow page has been created in renderer side and starts
// to get the worker script.
TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "PREPARING_SCRIPT_LOAD",
this);
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", "SCRIPT_LOADING", this);
if (!inflight_start_task_) if (!inflight_start_task_)
return; return;
TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "EmbeddedWorkerInstance::Start",
inflight_start_task_.get(), "OnURLJobCreated");
if (!step_time_.is_null()) { if (!step_time_.is_null()) {
base::TimeDelta duration = UpdateStepTime(); base::TimeDelta duration = UpdateStepTime();
if (inflight_start_task_->is_installed()) if (inflight_start_task_->is_installed())
...@@ -682,8 +702,7 @@ void EmbeddedWorkerInstance::OnWorkerVersionDoomed() { ...@@ -682,8 +702,7 @@ void EmbeddedWorkerInstance::OnWorkerVersionDoomed() {
} }
void EmbeddedWorkerInstance::OnThreadStarted(int thread_id, int provider_id) { void EmbeddedWorkerInstance::OnThreadStarted(int thread_id, int provider_id) {
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnThreadStarted"); if (!context_ || !inflight_start_task_)
if (!context_)
return; return;
ServiceWorkerProviderHost* provider_host = ServiceWorkerProviderHost* provider_host =
...@@ -696,11 +715,10 @@ void EmbeddedWorkerInstance::OnThreadStarted(int thread_id, int provider_id) { ...@@ -696,11 +715,10 @@ void EmbeddedWorkerInstance::OnThreadStarted(int thread_id, int provider_id) {
provider_host->SetReadyToSendMessagesToWorker(thread_id); provider_host->SetReadyToSendMessagesToWorker(thread_id);
if (!inflight_start_task_) TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "LAUNCHING_WORKER_THREAD",
return; this);
TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "EmbeddedWorkerInstance::Start", // Renderer side has started to evaluate the loaded worker script.
inflight_start_task_.get(), "OnThreadStarted"); TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", "EVALUATING_SCRIPT", this);
starting_phase_ = THREAD_STARTED; starting_phase_ = THREAD_STARTED;
if (!step_time_.is_null()) { if (!step_time_.is_null()) {
base::TimeDelta duration = UpdateStepTime(); base::TimeDelta duration = UpdateStepTime();
...@@ -714,25 +732,30 @@ void EmbeddedWorkerInstance::OnThreadStarted(int thread_id, int provider_id) { ...@@ -714,25 +732,30 @@ void EmbeddedWorkerInstance::OnThreadStarted(int thread_id, int provider_id) {
} }
void EmbeddedWorkerInstance::OnScriptLoadFailed() { void EmbeddedWorkerInstance::OnScriptLoadFailed() {
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnScriptLoadFailed");
if (!inflight_start_task_) if (!inflight_start_task_)
return; return;
TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "EmbeddedWorkerInstance::Start",
inflight_start_task_.get(), // starting_phase_ may be SCRIPT_READ_FINISHED in case of reading from cache.
"OnScriptLoadFailed"); if (starting_phase_ == SCRIPT_DOWNLOADING) {
TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "SCRIPT_DOWNLOADING",
this);
}
TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", "SCRIPT_LOADING", this,
"Error", "Script load failed.");
for (auto& observer : listener_list_) for (auto& observer : listener_list_)
observer.OnScriptLoadFailed(); observer.OnScriptLoadFailed();
} }
void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) { void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) {
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnScriptEvaluated");
if (!inflight_start_task_) if (!inflight_start_task_)
return; return;
DCHECK_EQ(EmbeddedWorkerStatus::STARTING, status_); DCHECK_EQ(EmbeddedWorkerStatus::STARTING, status_);
TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", // Renderer side has completed evaluating the loaded worker script.
inflight_start_task_.get(), "OnScriptEvaluated", TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", "EVALUATING_SCRIPT", this,
"Success", success); "Success", success);
starting_phase_ = SCRIPT_EVALUATED; starting_phase_ = SCRIPT_EVALUATED;
if (!step_time_.is_null()) { if (!step_time_.is_null()) {
base::TimeDelta duration = UpdateStepTime(); base::TimeDelta duration = UpdateStepTime();
...@@ -741,6 +764,12 @@ void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) { ...@@ -741,6 +764,12 @@ void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) {
start_situation_); start_situation_);
} }
if (success) {
// Renderer side has started the final preparations to complete the start
// process.
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker",
"WAITING_FOR_START_COMPLETE", this);
}
base::WeakPtr<EmbeddedWorkerInstance> weak_this = weak_factory_.GetWeakPtr(); base::WeakPtr<EmbeddedWorkerInstance> weak_this = weak_factory_.GetWeakPtr();
StartTask::RunStartCallback( StartTask::RunStartCallback(
inflight_start_task_.get(), inflight_start_task_.get(),
...@@ -750,12 +779,14 @@ void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) { ...@@ -750,12 +779,14 @@ void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) {
} }
void EmbeddedWorkerInstance::OnStarted() { void EmbeddedWorkerInstance::OnStarted() {
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnStarted");
if (!registry_->OnWorkerStarted(process_id(), embedded_worker_id_)) if (!registry_->OnWorkerStarted(process_id(), embedded_worker_id_))
return; return;
// Stop is requested before OnStarted is sent back from the worker. // Stop is requested before OnStarted is sent back from the worker.
if (status_ == EmbeddedWorkerStatus::STOPPING) if (status_ == EmbeddedWorkerStatus::STOPPING)
return; return;
TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "WAITING_FOR_START_COMPLETE",
this);
DCHECK(status_ == EmbeddedWorkerStatus::STARTING); DCHECK(status_ == EmbeddedWorkerStatus::STARTING);
status_ = EmbeddedWorkerStatus::RUNNING; status_ = EmbeddedWorkerStatus::RUNNING;
inflight_start_task_.reset(); inflight_start_task_.reset();
...@@ -851,6 +882,8 @@ void EmbeddedWorkerInstance::SetDevToolsAttached(bool attached) { ...@@ -851,6 +882,8 @@ void EmbeddedWorkerInstance::SetDevToolsAttached(bool attached) {
} }
void EmbeddedWorkerInstance::OnNetworkAccessedForScriptLoad() { void EmbeddedWorkerInstance::OnNetworkAccessedForScriptLoad() {
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", "SCRIPT_DOWNLOADING",
this);
starting_phase_ = SCRIPT_DOWNLOADING; starting_phase_ = SCRIPT_DOWNLOADING;
network_accessed_for_script_ = true; network_accessed_for_script_ = true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment