Skip to content

Commit 84aa746

Browse files
Treehugger RobotGerrit Code Review
authored andcommitted
Merge changes I07f322b8,I9ab3c4be,I26ed486e into main
* changes: tracing_service_impl: Emit lifecycle event when flush starts tracing_service_impl_unittest: Test slow to flush data sources tracing_service_impl_unittest: Test slow to start data sources
2 parents 90886fd + 6e7483a commit 84aa746

File tree

4 files changed

+166
-5
lines changed

4 files changed

+166
-5
lines changed

protos/perfetto/trace/perfetto/tracing_service_event.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ message TracingServiceEvent {
4646
// sources have been recording events.
4747
bool all_data_sources_started = 1;
4848

49+
// Emitted when a flush is started.
50+
bool flush_started = 9;
51+
4952
// Emitted when all data sources have been flushed successfully or with an
5053
// error (including timeouts). This can generally happen many times over the
5154
// course of the trace.

protos/perfetto/trace/perfetto_trace.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13442,6 +13442,9 @@ message TracingServiceEvent {
1344213442
// sources have been recording events.
1344313443
bool all_data_sources_started = 1;
1344413444

13445+
// Emitted when a flush is started.
13446+
bool flush_started = 9;
13447+
1344513448
// Emitted when all data sources have been flushed successfully or with an
1344613449
// error (including timeouts). This can generally happen many times over the
1344713450
// course of the trace.

src/tracing/service/tracing_service_impl.cc

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,6 +1901,11 @@ void TracingServiceImpl::Flush(TracingSessionID tsid,
19011901
return;
19021902
}
19031903

1904+
SnapshotLifecyleEvent(
1905+
tracing_session,
1906+
protos::pbzero::TracingServiceEvent::kFlushStartedFieldNumber,
1907+
false /* snapshot_clocks */);
1908+
19041909
std::map<ProducerID, std::vector<DataSourceInstanceID>> data_source_instances;
19051910
for (const auto& [producer_id, ds_inst] :
19061911
tracing_session->data_source_instances) {
@@ -4021,6 +4026,9 @@ base::Status TracingServiceImpl::FlushAndCloneSession(
40214026
}
40224027
}
40234028

4029+
SnapshotLifecyleEvent(
4030+
session, protos::pbzero::TracingServiceEvent::kFlushStartedFieldNumber,
4031+
false /* snapshot_clocks */);
40244032
clone_op.pending_flush_cnt = bufs_groups.size();
40254033
for (const std::set<BufferID>& buf_group : bufs_groups) {
40264034
FlushDataSourceInstances(
@@ -4963,12 +4971,15 @@ TracingServiceImpl::TracingSession::TracingSession(
49634971
config(new_config),
49644972
snapshot_periodic_task(task_runner),
49654973
timed_stop_task(task_runner) {
4966-
// all_data_sources_flushed is special because we store up to 64 events of
4967-
// this type. Other events will go through the default case in
4974+
// all_data_sources_flushed (and flush_started) is special because we store up
4975+
// to 64 events of this type. Other events will go through the default case in
49684976
// SnapshotLifecycleEvent() where they will be given a max history of 1.
49694977
lifecycle_events.emplace_back(
49704978
protos::pbzero::TracingServiceEvent::kAllDataSourcesFlushedFieldNumber,
49714979
64 /* max_size */);
4980+
lifecycle_events.emplace_back(
4981+
protos::pbzero::TracingServiceEvent::kFlushStartedFieldNumber,
4982+
64 /* max_size */);
49724983
}
49734984

49744985
////////////////////////////////////////////////////////////////////////////////

src/tracing/service/tracing_service_impl_unittest.cc

Lines changed: 147 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4171,11 +4171,14 @@ TEST_F(TracingServiceImplTest, LifecycleMultipleFlushEventsQueued) {
41714171
ASSERT_TRUE(flush_request.WaitForReply());
41724172

41734173
auto packets = consumer->ReadBuffers();
4174-
uint32_t count = 0;
4174+
uint32_t flush_started_count = 0;
4175+
uint32_t flush_done_count = 0;
41754176
for (const auto& packet : packets) {
4176-
count += packet.service_event().all_data_sources_flushed();
4177+
flush_started_count += packet.service_event().flush_started();
4178+
flush_done_count += packet.service_event().all_data_sources_flushed();
41774179
}
4178-
ASSERT_EQ(count, 2u);
4180+
EXPECT_EQ(flush_started_count, 2u);
4181+
EXPECT_EQ(flush_done_count, 2u);
41794182

41804183
consumer->DisableTracing();
41814184
producer->WaitForDataSourceStop("data_source");
@@ -5809,4 +5812,145 @@ TEST_F(TracingServiceImplTest, DetachDurationTimeoutFreeBuffers) {
58095812
task_runner.RunUntilCheckpoint(on_attach_name);
58105813
}
58115814

5815+
TEST_F(TracingServiceImplTest, SlowStartingDataSources) {
5816+
std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
5817+
consumer->Connect(svc.get());
5818+
5819+
std::unique_ptr<MockProducer> producer = CreateMockProducer();
5820+
producer->Connect(svc.get(), "mock_producer");
5821+
producer->RegisterDataSource("data_source1", /*ack_stop=*/false,
5822+
/*ack_start=*/true);
5823+
producer->RegisterDataSource("data_source2", /*ack_stop=*/false,
5824+
/*ack_start=*/true);
5825+
producer->RegisterDataSource("data_source3", /*ack_stop=*/false,
5826+
/*ack_start=*/true);
5827+
5828+
TraceConfig trace_config;
5829+
trace_config.add_buffers()->set_size_kb(128);
5830+
trace_config.add_data_sources()->mutable_config()->set_name("data_source1");
5831+
trace_config.add_data_sources()->mutable_config()->set_name("data_source2");
5832+
trace_config.add_data_sources()->mutable_config()->set_name("data_source3");
5833+
consumer->EnableTracing(trace_config);
5834+
5835+
producer->WaitForTracingSetup();
5836+
producer->WaitForDataSourceSetup("data_source1");
5837+
producer->WaitForDataSourceSetup("data_source2");
5838+
producer->WaitForDataSourceSetup("data_source3");
5839+
5840+
producer->WaitForDataSourceStart("data_source1");
5841+
producer->WaitForDataSourceStart("data_source2");
5842+
producer->WaitForDataSourceStart("data_source3");
5843+
5844+
DataSourceInstanceID id1 = producer->GetDataSourceInstanceId("data_source1");
5845+
DataSourceInstanceID id3 = producer->GetDataSourceInstanceId("data_source3");
5846+
5847+
producer->endpoint()->NotifyDataSourceStarted(id1);
5848+
producer->endpoint()->NotifyDataSourceStarted(id3);
5849+
5850+
// This matches kAllDataSourceStartedTimeout.
5851+
AdvanceTimeAndRunUntilIdle(20000);
5852+
5853+
consumer->DisableTracing();
5854+
producer->WaitForDataSourceStop("data_source1");
5855+
producer->WaitForDataSourceStop("data_source2");
5856+
producer->WaitForDataSourceStop("data_source3");
5857+
consumer->WaitForTracingDisabled();
5858+
5859+
std::vector<protos::gen::TracePacket> packets = consumer->ReadBuffers();
5860+
EXPECT_THAT(
5861+
packets,
5862+
Contains(Property(
5863+
&protos::gen::TracePacket::service_event,
5864+
Property(
5865+
&protos::gen::TracingServiceEvent::slow_starting_data_sources,
5866+
Property(
5867+
&protos::gen::TracingServiceEvent::DataSources::data_source,
5868+
ElementsAre(
5869+
Property(&protos::gen::TracingServiceEvent::DataSources::
5870+
DataSource::data_source_name,
5871+
"data_source2")))))));
5872+
}
5873+
5874+
TEST_F(TracingServiceImplTest, FlushTimeoutEventsEmitted) {
5875+
std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
5876+
consumer->Connect(svc.get());
5877+
5878+
std::unique_ptr<MockProducer> producer = CreateMockProducer();
5879+
producer->Connect(svc.get(), "mock_producer1");
5880+
producer->RegisterDataSource("ds_1");
5881+
5882+
TraceConfig trace_config;
5883+
trace_config.add_buffers()->set_size_kb(1024); // Buf 0.
5884+
auto* ds_cfg = trace_config.add_data_sources()->mutable_config();
5885+
ds_cfg->set_name("ds_1");
5886+
ds_cfg->set_target_buffer(0);
5887+
5888+
consumer->EnableTracing(trace_config);
5889+
producer->WaitForTracingSetup();
5890+
producer->WaitForDataSourceSetup("ds_1");
5891+
producer->WaitForDataSourceStart("ds_1");
5892+
5893+
std::unique_ptr<TraceWriter> writer1 = producer->CreateTraceWriter("ds_1");
5894+
5895+
// Do not reply to Flush.
5896+
std::string producer_flush1_checkpoint_name = "producer_flush1_requested";
5897+
auto flush1_requested =
5898+
task_runner.CreateCheckpoint(producer_flush1_checkpoint_name);
5899+
EXPECT_CALL(*producer, Flush).WillOnce(Invoke(flush1_requested));
5900+
consumer->Flush(5000, FlushFlags(FlushFlags::Initiator::kTraced,
5901+
FlushFlags::Reason::kTraceStop));
5902+
5903+
task_runner.RunUntilCheckpoint(producer_flush1_checkpoint_name);
5904+
5905+
AdvanceTimeAndRunUntilIdle(5000);
5906+
5907+
// ReadBuffers returns a last_flush_slow_data_source event.
5908+
std::vector<protos::gen::TracePacket> packets = consumer->ReadBuffers();
5909+
EXPECT_THAT(
5910+
packets,
5911+
Contains(Property(
5912+
&protos::gen::TracePacket::service_event,
5913+
Property(
5914+
&protos::gen::TracingServiceEvent::last_flush_slow_data_sources,
5915+
Property(
5916+
&protos::gen::TracingServiceEvent::DataSources::data_source,
5917+
ElementsAre(
5918+
Property(&protos::gen::TracingServiceEvent::DataSources::
5919+
DataSource::data_source_name,
5920+
"ds_1")))))));
5921+
5922+
// Reply to Flush.
5923+
std::string producer_flush2_checkpoint_name = "producer_flush2_requested";
5924+
auto flush2_requested =
5925+
task_runner.CreateCheckpoint(producer_flush2_checkpoint_name);
5926+
FlushRequestID flush2_req_id;
5927+
EXPECT_CALL(*producer, Flush(_, _, _, _))
5928+
.WillOnce([&](FlushRequestID req_id, const DataSourceInstanceID*, size_t,
5929+
FlushFlags) {
5930+
flush2_req_id = req_id;
5931+
flush2_requested();
5932+
});
5933+
consumer->Flush(5000, FlushFlags(FlushFlags::Initiator::kTraced,
5934+
FlushFlags::Reason::kTraceStop));
5935+
5936+
task_runner.RunUntilCheckpoint(producer_flush2_checkpoint_name);
5937+
5938+
producer->endpoint()->NotifyFlushComplete(flush2_req_id);
5939+
5940+
AdvanceTimeAndRunUntilIdle(5000);
5941+
5942+
// ReadBuffers returns a last_flush_slow_data_source event.
5943+
packets = consumer->ReadBuffers();
5944+
EXPECT_THAT(
5945+
packets,
5946+
Not(Contains(Property(&protos::gen::TracePacket::service_event,
5947+
Property(&protos::gen::TracingServiceEvent::
5948+
has_last_flush_slow_data_sources,
5949+
Eq(true))))));
5950+
5951+
consumer->DisableTracing();
5952+
producer->WaitForDataSourceStop("ds_1");
5953+
consumer->WaitForTracingDisabled();
5954+
}
5955+
58125956
} // namespace perfetto

0 commit comments

Comments
 (0)