Skip to content

Commit 0b617de

Browse files
committed
Only load fetcher_config.json files once.
`FetcherConfigs` now keeps track of which directory a `FetcherConfig` came from, as that uniquely distinguishes `FetcherConfig` instances. To avoid symlinks making directory paths looks different, symlinks are resolved before loading `FetcherConfig`. This has the behavioral change that absolute paths reported by `FetcherConfig` now are based on the resolved symlink path rather than the input path. Bug: b/469552996
1 parent 4d477fc commit 0b617de

File tree

3 files changed

+49
-24
lines changed

3 files changed

+49
-24
lines changed

base/cvd/cuttlefish/host/libs/config/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ cf_cc_library(
228228
"//cuttlefish/host/libs/config:fetcher_config",
229229
"//libbase",
230230
"@abseil-cpp//absl/strings",
231+
"@abseil-cpp//absl/types:span",
231232
],
232233
)
233234

base/cvd/cuttlefish/host/libs/config/fetcher_configs.cc

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020

2121
#include <string>
2222
#include <string_view>
23-
#include <utility>
24-
#include <vector>
2523

2624
#include "absl/strings/str_cat.h"
25+
#include "absl/types/span.h"
26+
#include "android-base/file.h"
2727
#include "android-base/logging.h"
2828

2929
#include "cuttlefish/host/libs/config/fetcher_config.h"
@@ -33,34 +33,52 @@ namespace cuttlefish {
3333
static constexpr std::string_view kFetcherConfigFile = "fetcher_config.json";
3434

3535
FetcherConfigs FetcherConfigs::ReadFromDirectories(
36-
const std::vector<std::string>& directories) {
37-
std::vector<FetcherConfig> configs;
38-
configs.reserve(directories.size());
36+
absl::Span<const std::string> directories) {
37+
FetcherConfigs configs;
3938

40-
for (std::string_view directory : directories) {
41-
FetcherConfig& config = configs.emplace_back();
39+
configs.directories_.reserve(directories.size());
4240

43-
std::string config_path = absl::StrCat(directory, "/", kFetcherConfigFile);
44-
if (!config.LoadFromFile(config_path)) {
45-
LOG(DEBUG) << "No valid fetcher_config in '" << config_path
41+
for (const std::string& dir : directories) {
42+
std::string real;
43+
if (!android::base::Realpath(dir, &real)) {
44+
LOG(WARNING) << "Failed to resolve real path for '" << dir << "'";
45+
real = dir;
46+
}
47+
48+
auto [it, inserted] =
49+
configs.directory_to_config_.emplace(real, FetcherConfig());
50+
51+
configs.directories_.emplace_back(real);
52+
53+
if (!inserted) {
54+
continue;
55+
}
56+
57+
std::string path = absl::StrCat(real, "/", kFetcherConfigFile);
58+
59+
if (!it->second.LoadFromFile(path)) {
60+
LOG(DEBUG) << "No valid fetcher_config in '" << path
4661
<< "', falling back to default";
4762
}
4863
}
49-
if (configs.empty()) {
50-
configs.emplace_back();
51-
}
5264

53-
return FetcherConfigs(std::move(configs));
65+
return configs;
5466
}
5567

56-
FetcherConfigs::FetcherConfigs(std::vector<FetcherConfig> configs)
57-
: fetcher_configs_(std::move(configs)) {}
58-
5968
const FetcherConfig& FetcherConfigs::ForInstance(size_t instance_index) const {
60-
if (instance_index < fetcher_configs_.size()) {
61-
return fetcher_configs_[instance_index];
69+
// If there is no matching member in the map, either this FetcherConfig is a
70+
// moved-from instance without any members, or there is a mistake in
71+
// `FetcherConfigs::ReadFromDirectories`.
72+
static FetcherConfig* kFallback = new FetcherConfig();
73+
74+
if (directories_.empty()) {
75+
return *kFallback;
6276
}
63-
return fetcher_configs_[0];
77+
78+
instance_index = instance_index < directories_.size() ? instance_index : 0;
79+
80+
auto it = directory_to_config_.find(directories_[instance_index]);
81+
return it == directory_to_config_.end() ? *kFallback : it->second;
6482
}
6583

6684
} // namespace cuttlefish

base/cvd/cuttlefish/host/libs/config/fetcher_configs.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,32 @@
1717

1818
#include <stddef.h>
1919

20+
#include <map>
2021
#include <string>
2122
#include <vector>
2223

24+
#include "absl/types/span.h"
25+
2326
#include "cuttlefish/host/libs/config/fetcher_config.h"
2427

2528
namespace cuttlefish {
2629

2730
class FetcherConfigs {
2831
public:
29-
static FetcherConfigs ReadFromDirectories(const std::vector<std::string>&);
32+
static FetcherConfigs ReadFromDirectories(absl::Span<const std::string>);
33+
3034
FetcherConfigs(FetcherConfigs&&) = default;
3135
~FetcherConfigs() = default;
3236

33-
size_t Size() const { return fetcher_configs_.size(); }
37+
size_t Size() const { return directories_.size(); }
3438

3539
const FetcherConfig& ForInstance(size_t instance_index) const;
3640

3741
private:
38-
FetcherConfigs(std::vector<FetcherConfig> configs);
39-
std::vector<FetcherConfig> fetcher_configs_;
42+
FetcherConfigs() = default;
43+
44+
std::vector<std::string> directories_;
45+
std::map<std::string, FetcherConfig> directory_to_config_;
4046
};
4147

4248
} // namespace cuttlefish

0 commit comments

Comments
 (0)