trace_to_text: Verify filesystem scanning numbers
Add sanity checks in trace to text by comparing inodes seen in
ftrace events to the inodes resolved in InodeFileMap trace packets.
Bug: 73625480
Bug: 74584014
Change-Id: I82e2081b46c03375e907342578626874efda1f20
diff --git a/tools/trace_to_text/main.cc b/tools/trace_to_text/main.cc
index 7f352b8..2f0c96b 100644
--- a/tools/trace_to_text/main.cc
+++ b/tools/trace_to_text/main.cc
@@ -255,15 +255,47 @@
}
void PrintInodeStats(std::ostream* output,
- const std::set<uint64_t>& inode_numbers,
- const uint64_t& events_with_inodes) {
+ const std::set<uint64_t>& ftrace_inodes,
+ const uint64_t& ftrace_inode_count,
+ const std::set<uint64_t>& resolved_map_inodes,
+ const std::set<uint64_t>& resolved_scan_inodes) {
*output << "--------------------Inode Stats-------------------\n";
char line[2048];
- sprintf(line, "Unique inodes: %zu\n", inode_numbers.size());
+
+ sprintf(line, "Events with inodes: %" PRIu64 "\n", ftrace_inode_count);
*output << std::string(line);
- sprintf(line, "Events with inodes: %" PRIu64 "\n", events_with_inodes);
+ sprintf(line, "Unique inodes from events: %zu\n", ftrace_inodes.size());
*output << std::string(line);
+
+ sprintf(line, "Resolved inodes from static map: %zu\n",
+ resolved_map_inodes.size());
+ *output << std::string(line);
+
+ sprintf(line, "Resolved inodes from scan and cache: %zu\n",
+ resolved_scan_inodes.size());
+ *output << std::string(line);
+
+ std::set<uint64_t> resolved_inodes;
+ set_union(resolved_map_inodes.begin(), resolved_map_inodes.end(),
+ resolved_scan_inodes.begin(), resolved_scan_inodes.end(),
+ std::inserter(resolved_inodes, resolved_inodes.begin()));
+
+ sprintf(line, "Total resolved inodes: %zu\n", resolved_inodes.size());
+ *output << std::string(line);
+
+ std::set<uint64_t> intersect;
+ set_intersection(resolved_inodes.begin(), resolved_inodes.end(),
+ ftrace_inodes.begin(), ftrace_inodes.end(),
+ std::inserter(intersect, intersect.begin()));
+
+ sprintf(line, "Unresolved inodes: %" PRIu64 "\n",
+ ftrace_inodes.size() - intersect.size());
+
+ sprintf(line, "Unexpected inodes from filesystem: %" PRIu64 "\n",
+ resolved_inodes.size() - intersect.size());
+ *output << std::string(line);
+
*output << "\n";
}
@@ -300,13 +332,15 @@
std::multiset<uint64_t> ftrace_timestamps;
std::set<pid_t> tids_in_tree;
std::set<pid_t> tids_in_events;
- std::set<uint64_t> inode_numbers;
- uint64_t events_with_inodes = 0;
+ std::set<uint64_t> ftrace_inodes;
+ uint64_t ftrace_inode_count = 0;
+ std::set<uint64_t> resolved_map_inodes;
+ std::set<uint64_t> resolved_scan_inodes;
ForEachPacketInTrace(
- input,
- [&start, &end, &ftrace_timestamps, &tids_in_tree, &tids_in_events,
- &inode_numbers, &events_with_inodes](const protos::TracePacket& packet) {
+ input, [&start, &end, &ftrace_timestamps, &tids_in_tree, &tids_in_events,
+ &ftrace_inodes, &ftrace_inode_count, &resolved_map_inodes,
+ &resolved_scan_inodes](const protos::TracePacket& packet) {
if (packet.has_process_tree()) {
const ProcessTree& tree = packet.process_tree();
@@ -317,6 +351,18 @@
}
}
+ if (packet.has_inode_file_map()) {
+ const InodeFileMap& inode_file_map = packet.inode_file_map();
+ const auto& mount_points = inode_file_map.mount_points();
+ bool from_scan = std::find(mount_points.begin(), mount_points.end(),
+ "/data") != mount_points.end();
+ for (const auto& entry : inode_file_map.entries())
+ if (from_scan)
+ resolved_scan_inodes.insert(entry.inode_number());
+ else
+ resolved_map_inodes.insert(entry.inode_number());
+ }
+
if (!packet.has_ftrace_events())
return;
@@ -324,8 +370,8 @@
uint64_t inode_number = 0;
for (const FtraceEvent& event : bundle.event()) {
if (ParseInode(event, &inode_number)) {
- inode_numbers.insert(inode_number);
- events_with_inodes++;
+ ftrace_inodes.insert(inode_number);
+ ftrace_inode_count++;
}
if (event.pid()) {
tids_in_events.insert(event.pid());
@@ -346,7 +392,8 @@
PrintFtraceTrack(output, start, end, ftrace_timestamps);
PrintProcessStats(output, tids_in_tree, tids_in_events);
- PrintInodeStats(output, inode_numbers, events_with_inodes);
+ PrintInodeStats(output, ftrace_inodes, ftrace_inode_count,
+ resolved_map_inodes, resolved_scan_inodes);
return 0;
}