processor: Support TrackDescriptor's parent_uuid + pid/tid reuse
Refactors tokenization and parsing of TrackDescriptors so that:
- Only a single ProcessDescriptor track is supported per process.
- Only a single ThreadDescriptor track is supported per thread.
- Such a process/thread track is merged with slice-type system events
into a single track.
- Other tracks (e.g. async tracks) can be associated with a thread
or process using the "parent_uuid" field.
- pid/tid reuse (i.e. new process/thread spawns with same pid/tid
after old process/thread terminates) is detected based on changing
uuids of Process/ThreadDescriptor tracks.
To accomplish this, tokenization now only makes reservations for tracks
without actually inserting anything into the track table - since
TrackDescriptors may appear in any order in the file, and we cannot
know the track's type/context until we see its parent's descriptor.
During parsing, the reservations will be resolved and inserted into the
track table. If the uuid of a process's or thread's track changes, we
assume that the pid/tid of the process/thread was reused.
Change-Id: Iec1d019db211773eb15ee517ae0dac1ce87553c9
diff --git a/src/trace_processor/export_json_unittest.cc b/src/trace_processor/export_json_unittest.cc
index e572d67..a0050df 100644
--- a/src/trace_processor/export_json_unittest.cc
+++ b/src/trace_processor/export_json_unittest.cc
@@ -119,8 +119,7 @@
const char* kName = "name";
UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -166,8 +165,7 @@
const char* kName = "name";
UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -225,13 +223,14 @@
EXPECT_EQ(event["args"]["name"].asString(), kName);
}
-TEST_F(ExportJsonTest, WrongTrackTypeIgnored) {
+TEST_F(ExportJsonTest, SystemEventsIgnored) {
constexpr int64_t kCookie = 22;
TrackId track = context_.track_tracker->InternAndroidAsyncTrack(
/*name=*/0, /*upid=*/0, kCookie);
context_.args_tracker->Flush(); // Flush track args.
- StringId cat_id = context_.storage->InternString("cat");
+ // System events have no category.
+ StringId cat_id = kNullStringId;
StringId name_id = context_.storage->InternString("name");
context_.storage->mutable_slice_table()->Insert(
{0, 0, track.value, cat_id, name_id, 0, 0, 0});
@@ -406,8 +405,7 @@
const char* kSrc = "source_file.cc";
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -451,8 +449,7 @@
TraceStorage* storage = context_.storage.get();
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = storage->InternString(base::StringView(kCategory));
StringId name_id = storage->InternString(base::StringView(kName));
@@ -501,8 +498,7 @@
double kValues[] = {1.234, 2.345};
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -550,8 +546,7 @@
uint64_t kValue1 = std::numeric_limits<uint64_t>::max();
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -595,8 +590,7 @@
int kValues[] = {123, 234};
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -643,8 +637,7 @@
int kValues[] = {123, 234};
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -691,8 +684,7 @@
const char* kName = "name";
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -761,8 +753,7 @@
const char* kName = "name";
UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -1241,8 +1232,7 @@
TEST_F(ExportJsonTest, ArgumentFilter) {
UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView("cat"));
@@ -1354,8 +1344,7 @@
const char* kName = "name";
UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
- TrackId track =
- context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+ TrackId track = context_.track_tracker->InternThreadTrack(utid);
context_.args_tracker->Flush(); // Flush track args.
StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
StringId name_id = context_.storage->InternString(base::StringView(kName));