probes_producer: Convert block_device_ids for maps to align
Currently pretending they are all uint32_t and will update all
to uint64_t in separate CL that will be much larger.
Bug: 73625480
Change-Id: Ic1c1271dac892deee80bbedc08a2fa336111a44e
diff --git a/src/traced/probes/filesystem/inode_file_data_source.cc b/src/traced/probes/filesystem/inode_file_data_source.cc
index 0bdf781..49e1147 100644
--- a/src/traced/probes/filesystem/inode_file_data_source.cc
+++ b/src/traced/probes/filesystem/inode_file_data_source.cc
@@ -17,6 +17,7 @@
#include "src/traced/probes/filesystem/inode_file_data_source.h"
#include <dirent.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <queue>
@@ -29,8 +30,6 @@
namespace perfetto {
-using BlockDeviceID = decltype(stat::st_dev);
-
void CreateDeviceToInodeMap(
const std::string& root_directory,
std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* block_device_map) {
@@ -48,13 +47,11 @@
std::string filename = entry->d_name;
if (filename == "." || filename == "..")
continue;
- Inode inode_number = entry->d_ino;
+ Inode inode_number = static_cast<Inode>(entry->d_ino);
struct stat buf;
if (lstat(filepath.c_str(), &buf) != 0)
continue;
- BlockDeviceID block_device_id = buf.st_dev;
- std::map<Inode, InodeMapValue>& inode_map =
- (*block_device_map)[block_device_id];
+ BlockDeviceID block_device_id = static_cast<BlockDeviceID>(buf.st_dev);
// Default
protos::pbzero::InodeFileMap_Entry_Type type =
protos::pbzero::InodeFileMap_Entry_Type_UNKNOWN;
@@ -66,6 +63,10 @@
} else if (entry->d_type == DT_REG || S_ISREG(buf.st_mode)) {
type = protos::pbzero::InodeFileMap_Entry_Type_FILE;
}
+
+ // Update map
+ std::map<Inode, InodeMapValue>& inode_map =
+ (*block_device_map)[block_device_id];
inode_map[inode_number].SetType(type);
inode_map[inode_number].AddPath(filepath + filename);
}
@@ -75,55 +76,80 @@
InodeFileDataSource::InodeFileDataSource(
TracingSessionID id,
- std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* file_system_inodes,
+ std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>*
+ system_partition_files,
std::unique_ptr<TraceWriter> writer)
: session_id_(id),
- file_system_inodes_(file_system_inodes),
+ system_partition_files_(system_partition_files),
writer_(std::move(writer)),
weak_factory_(this) {}
-void InodeFileDataSource::WriteInodes(
- const std::vector<std::pair<uint64_t, uint32_t>>& inodes) {
- PERFETTO_DLOG("Write Inodes start");
+bool InodeFileDataSource::AddInodeFileMapEntry(
+ InodeFileMap* inode_file_map,
+ BlockDeviceID block_device_id,
+ Inode inode_number,
+ const std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>&
+ current_partition_map) {
+ auto block_device_entry = current_partition_map.find(block_device_id);
+ if (block_device_entry != current_partition_map.end()) {
+ auto inode_map = block_device_entry->second.find(inode_number);
+ if (inode_map != block_device_entry->second.end()) {
+ auto* entry = inode_file_map->add_entries();
+ entry->set_inode_number(inode_number);
+ entry->set_type(inode_map->second.type());
+ for (const auto& path : inode_map->second.paths())
+ entry->add_paths(path.c_str());
+ return true;
+ }
+ }
+ return false;
+}
+
+void InodeFileDataSource::OnInodes(
+ const std::vector<std::pair<Inode, BlockDeviceID>>& inodes) {
+ PERFETTO_DLOG("Saw FtraceBundle with %zu inodes.", inodes.size());
if (mount_points_.empty()) {
mount_points_ = ParseMounts();
}
// Group inodes from FtraceMetadata by block device
std::map<BlockDeviceID, std::set<Inode>> inode_file_maps;
- for (const auto& inode : inodes) {
- BlockDeviceID block_device_id = inode.first;
- Inode inode_number = inode.second;
+ for (const auto& inodes_pair : inodes) {
+ Inode inode_number = inodes_pair.first;
+ BlockDeviceID block_device_id = inodes_pair.second;
inode_file_maps[block_device_id].emplace(inode_number);
}
// Write a TracePacket with an InodeFileMap proto for each block device id
for (const auto& inode_file_map_data : inode_file_maps) {
+ BlockDeviceID block_device_id = inode_file_map_data.first;
+ std::set<Inode> inode_numbers = inode_file_map_data.second;
+
+ // New TracePacket for each InodeFileMap
auto trace_packet = writer_->NewTracePacket();
auto inode_file_map = trace_packet->set_inode_file_map();
+
// Add block device id
- BlockDeviceID block_device_id = inode_file_map_data.first;
inode_file_map->set_block_device_id(block_device_id);
+
// Add mount points
auto range = mount_points_.equal_range(block_device_id);
for (std::multimap<BlockDeviceID, std::string>::iterator it = range.first;
- it != range.second; ++it) {
+ it != range.second; ++it)
inode_file_map->add_mount_points(it->second.c_str());
- }
- // Add entries for each inode number
- std::set<Inode> inode_numbers = inode_file_map_data.second;
+
+ // Add entries for inodes in system
+ std::map<BlockDeviceID, std::set<Inode>> data_partition_inodes;
for (const auto& inode_number : inode_numbers) {
- auto* entry = inode_file_map->add_entries();
- entry->set_inode_number(inode_number);
- auto block_device_map = file_system_inodes_->find(block_device_id);
- if (block_device_map != file_system_inodes_->end()) {
- auto inode_map = block_device_map->second.find(inode_number);
- if (inode_map != block_device_map->second.end()) {
- entry->set_type(inode_map->second.type());
- for (const auto& path : inode_map->second.paths())
- entry->add_paths(path.c_str());
- }
+ // Search in /system partition and add to InodeFileMap if found
+ bool in_system =
+ AddInodeFileMapEntry(inode_file_map, block_device_id, inode_number,
+ *system_partition_files_);
+ if (!in_system) {
+ // TODO(fmayer): Add LRU and check before adding inode for full scan
+ data_partition_inodes[block_device_id].emplace(inode_number);
}
}
+
trace_packet->Finalize();
}
}
@@ -132,9 +158,4 @@
return weak_factory_.GetWeakPtr();
}
-void InodeFileDataSource::OnInodes(
- const std::vector<std::pair<uint64_t, uint32_t>>& inodes) {
- PERFETTO_DLOG("Saw FtraceBundle with %zu inodes.", inodes.size());
-}
-
} // namespace perfetto