Commit 56ff77b4 authored by Eric Seckler's avatar Eric Seckler Committed by Commit Bot

perfetto: TrackEvent exporter: Skip only relevant fields if incomplete

Some TracePackets (e.g. service-emitted or metadata ones) don't use
incremental state, so shouldn't be skipped even if the
incremental_state_cleared flag wasn't yet seen.

Bug: 928738
Change-Id: Iadc649e5460b00fb4af5a8f30c03ed9b17aace9c
TBR: oysteine@chromium.org
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1541163Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Reviewed-by: default avataroysteine <oysteine@chromium.org>
Commit-Queue: Eric Seckler <eseckler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#644892}
parent 05664850
...@@ -63,10 +63,6 @@ void TrackEventJSONExporter::ProcessPackets( ...@@ -63,10 +63,6 @@ void TrackEventJSONExporter::ProcessPackets(
current_state_.incomplete = true; current_state_.incomplete = true;
} }
if (current_state_.incomplete) {
continue;
}
// Now we process the data from the packet. First by getting the interned // Now we process the data from the packet. First by getting the interned
// strings out and processed. // strings out and processed.
if (packet.has_interned_data()) { if (packet.has_interned_data()) {
...@@ -85,10 +81,9 @@ void TrackEventJSONExporter::ProcessPackets( ...@@ -85,10 +81,9 @@ void TrackEventJSONExporter::ProcessPackets(
} else if (packet.has_trace_stats()) { } else if (packet.has_trace_stats()) {
SetTraceStatsMetadata(packet.trace_stats()); SetTraceStatsMetadata(packet.trace_stats());
} else { } else {
// If none of the above matched, this packet was emitted by the service
// and has no equivalent in the old trace format. We thus ignore it.
} }
// If none of the above matched this packet was emitted by the service or
// some other producer. And as a result has no equivalent in the old trace
// format so we ignore it.
} }
} }
...@@ -154,6 +149,12 @@ base::Optional<int64_t> TrackEventJSONExporter::ComputeThreadTimeUs( ...@@ -154,6 +149,12 @@ base::Optional<int64_t> TrackEventJSONExporter::ComputeThreadTimeUs(
void TrackEventJSONExporter::HandleInternedData( void TrackEventJSONExporter::HandleInternedData(
const ChromeTracePacket& packet) { const ChromeTracePacket& packet) {
DCHECK(packet.has_interned_data()); DCHECK(packet.has_interned_data());
// InternedData is only emitted on sequences with incremental state.
if (current_state_.incomplete) {
return;
}
const auto& data = packet.interned_data(); const auto& data = packet.interned_data();
// Even if the interned data was reset we should not change the values in the // Even if the interned data was reset we should not change the values in the
// interned data. // interned data.
...@@ -189,6 +190,11 @@ void TrackEventJSONExporter::HandleProcessDescriptor( ...@@ -189,6 +190,11 @@ void TrackEventJSONExporter::HandleProcessDescriptor(
// Save the current state we need for future packets. // Save the current state we need for future packets.
current_state_.pid = process.pid(); current_state_.pid = process.pid();
// ProcessDescriptor is only emitted on sequences with incremental state.
if (current_state_.incomplete) {
return;
}
// If we aren't outputting traceEvents then we don't need to look at the // If we aren't outputting traceEvents then we don't need to look at the
// metadata that might need to be emitted. // metadata that might need to be emitted.
if (!ShouldOutputTraceEvents()) { if (!ShouldOutputTraceEvents()) {
...@@ -259,6 +265,12 @@ void TrackEventJSONExporter::HandleProcessDescriptor( ...@@ -259,6 +265,12 @@ void TrackEventJSONExporter::HandleProcessDescriptor(
void TrackEventJSONExporter::HandleThreadDescriptor( void TrackEventJSONExporter::HandleThreadDescriptor(
const ChromeTracePacket& packet) { const ChromeTracePacket& packet) {
DCHECK(packet.has_thread_descriptor()); DCHECK(packet.has_thread_descriptor());
// ThreadDescriptor is only emitted on sequences with incremental state.
if (current_state_.incomplete) {
return;
}
const auto& thread = packet.thread_descriptor(); const auto& thread = packet.thread_descriptor();
// Save the current state we need for future packets. // Save the current state we need for future packets.
current_state_.pid = thread.pid(); current_state_.pid = thread.pid();
...@@ -334,6 +346,11 @@ void TrackEventJSONExporter::HandleChromeEvents( ...@@ -334,6 +346,11 @@ void TrackEventJSONExporter::HandleChromeEvents(
void TrackEventJSONExporter::HandleTrackEvent(const ChromeTracePacket& packet) { void TrackEventJSONExporter::HandleTrackEvent(const ChromeTracePacket& packet) {
DCHECK(packet.has_track_event()); DCHECK(packet.has_track_event());
// TrackEvents need incremental state.
if (current_state_.incomplete) {
return;
}
// If we aren't outputting traceEvents nothing in a TrackEvent currently will // If we aren't outputting traceEvents nothing in a TrackEvent currently will
// be needed so just return early. // be needed so just return early.
if (!ShouldOutputTraceEvents()) { if (!ShouldOutputTraceEvents()) {
......
...@@ -1582,7 +1582,6 @@ TEST_F(TrackEventJsonExporterTest, TestMetadata) { ...@@ -1582,7 +1582,6 @@ TEST_F(TrackEventJsonExporterTest, TestMetadata) {
std::vector<perfetto::protos::TracePacket> trace_packet_protos; std::vector<perfetto::protos::TracePacket> trace_packet_protos;
trace_packet_protos.emplace_back(); trace_packet_protos.emplace_back();
trace_packet_protos.back().set_incremental_state_cleared(true);
{ {
auto* new_metadata = auto* new_metadata =
trace_packet_protos.back().mutable_chrome_events()->add_metadata(); trace_packet_protos.back().mutable_chrome_events()->add_metadata();
...@@ -1630,7 +1629,6 @@ TEST_F(TrackEventJsonExporterTest, TestLegacySystemFtrace) { ...@@ -1630,7 +1629,6 @@ TEST_F(TrackEventJsonExporterTest, TestLegacySystemFtrace) {
trace_packet_protos.emplace_back(); trace_packet_protos.emplace_back();
trace_packet_protos.back().mutable_chrome_events()->add_legacy_ftrace_output( trace_packet_protos.back().mutable_chrome_events()->add_legacy_ftrace_output(
ftrace); ftrace);
trace_packet_protos.back().set_incremental_state_cleared(true);
FinalizePackets(trace_packet_protos); FinalizePackets(trace_packet_protos);
auto* sys_trace = parsed_trace_data()->FindKey("systemTraceEvents"); auto* sys_trace = parsed_trace_data()->FindKey("systemTraceEvents");
...@@ -1642,7 +1640,6 @@ TEST_F(TrackEventJsonExporterTest, TestLegacySystemTraceEvents) { ...@@ -1642,7 +1640,6 @@ TEST_F(TrackEventJsonExporterTest, TestLegacySystemTraceEvents) {
std::vector<perfetto::protos::TracePacket> trace_packet_protos; std::vector<perfetto::protos::TracePacket> trace_packet_protos;
trace_packet_protos.emplace_back(); trace_packet_protos.emplace_back();
trace_packet_protos.back().set_incremental_state_cleared(true);
auto* json_trace = trace_packet_protos.back() auto* json_trace = trace_packet_protos.back()
.mutable_chrome_events() .mutable_chrome_events()
->add_legacy_json_trace(); ->add_legacy_json_trace();
...@@ -1669,7 +1666,6 @@ TEST_F(TrackEventJsonExporterTest, TestLegacyUserTrace) { ...@@ -1669,7 +1666,6 @@ TEST_F(TrackEventJsonExporterTest, TestLegacyUserTrace) {
std::vector<perfetto::protos::TracePacket> trace_packet_protos; std::vector<perfetto::protos::TracePacket> trace_packet_protos;
trace_packet_protos.emplace_back(); trace_packet_protos.emplace_back();
trace_packet_protos.back().set_incremental_state_cleared(true);
auto* json_trace = trace_packet_protos.back() auto* json_trace = trace_packet_protos.back()
.mutable_chrome_events() .mutable_chrome_events()
->add_legacy_json_trace(); ->add_legacy_json_trace();
...@@ -1699,7 +1695,6 @@ TEST_F(TrackEventJsonExporterTest, TestTraceStats) { ...@@ -1699,7 +1695,6 @@ TEST_F(TrackEventJsonExporterTest, TestTraceStats) {
std::vector<perfetto::protos::TracePacket> trace_packet_protos; std::vector<perfetto::protos::TracePacket> trace_packet_protos;
trace_packet_protos.emplace_back(); trace_packet_protos.emplace_back();
trace_packet_protos.back().set_incremental_state_cleared(true);
// We are just checking that we correctly called the function provided by the // We are just checking that we correctly called the function provided by the
// base class. See json_trace_exporter_unittest for a more complete test. // base class. See json_trace_exporter_unittest for a more complete test.
trace_packet_protos.back().mutable_trace_stats(); trace_packet_protos.back().mutable_trace_stats();
...@@ -1757,9 +1752,16 @@ TEST_F(TrackEventJsonExporterTest, ComplexLongSequenceWithDroppedPackets) { ...@@ -1757,9 +1752,16 @@ TEST_F(TrackEventJsonExporterTest, ComplexLongSequenceWithDroppedPackets) {
track_event->set_thread_time_delta_us(3); track_event->set_thread_time_delta_us(3);
*track_event->mutable_legacy_event() = *track_event->mutable_legacy_event() =
CreateLegacyEvent(/* name_iid = */ 2, kLegacyFlags, kLegacyPhase); CreateLegacyEvent(/* name_iid = */ 2, kLegacyFlags, kLegacyPhase);
// This event will be dropped. // This event will be dropped.
trace_packet_protos.push_back(trace_packet_protos.back()); trace_packet_protos.push_back(trace_packet_protos.back());
trace_packet_protos.back().set_previous_packet_dropped(true); trace_packet_protos.back().set_previous_packet_dropped(true);
// Add a TraceStats packet, which shouldn't be dropped even though the
// incremental state was not cleared yet.
trace_packet_protos.emplace_back();
trace_packet_protos.back().mutable_trace_stats();
// Reset the state. // Reset the state.
AddThreadDescriptorPacket( AddThreadDescriptorPacket(
/* sort_index = */ base::nullopt, ThreadDescriptor::THREAD_UNSPECIFIED, /* sort_index = */ base::nullopt, ThreadDescriptor::THREAD_UNSPECIFIED,
...@@ -1823,6 +1825,10 @@ TEST_F(TrackEventJsonExporterTest, ComplexLongSequenceWithDroppedPackets) { ...@@ -1823,6 +1825,10 @@ TEST_F(TrackEventJsonExporterTest, ComplexLongSequenceWithDroppedPackets) {
&events)); &events));
EXPECT_EQ(kReferenceTimeUs + 4, events[0]->timestamp); EXPECT_EQ(kReferenceTimeUs + 4, events[0]->timestamp);
EXPECT_EQ(kReferenceThreadTimeUs + 3, events[0]->thread_timestamp); EXPECT_EQ(kReferenceThreadTimeUs + 3, events[0]->thread_timestamp);
// We only verify that the TraceStats packet was not dropped.
EXPECT_THAT(unparsed_trace_data_,
testing::HasSubstr("\"perfetto_trace_stats\""));
} }
} // namespace } // namespace
} // namespace tracing } // namespace tracing
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