forked from ClickHouse/ClickHouse
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCloudPlacementInfo.cpp
More file actions
102 lines (80 loc) · 2.27 KB
/
CloudPlacementInfo.cpp
File metadata and controls
102 lines (80 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <Server/CloudPlacementInfo.h>
#include <Common/logger_useful.h>
#include <IO/ReadBufferFromFile.h>
#include <IO/ReadHelpers.h>
#include <IO/S3/Credentials.h>
#include <Poco/String.h>
#include <fmt/core.h>
#include <filesystem>
namespace DB
{
namespace ErrorCodes
{
extern const int LOGICAL_ERROR;
}
namespace PlacementInfo
{
namespace
{
std::string getConfigPath(std::string_view path)
{
return fmt::format("{}.{}", PLACEMENT_CONFIG_PREFIX, path);
}
String loadAvailabilityZoneFromFile(const Poco::Util::AbstractConfiguration & config)
{
auto az_file = config.getString(getConfigPath("availability_zone_from_file"), DEFAULT_AZ_FILE_PATH);
if (!std::filesystem::exists(az_file))
return "";
String availability_zone_from_file;
ReadBufferFromFile in(az_file);
readStringUntilEOF(availability_zone_from_file, in);
Poco::trimInPlace(availability_zone_from_file);
return availability_zone_from_file;
}
}
PlacementInfo & PlacementInfo::instance()
{
static PlacementInfo instance;
return instance;
}
void PlacementInfo::initialize(const Poco::Util::AbstractConfiguration & config)
try
{
if (initialized)
return;
if (!config.has(DB::PlacementInfo::PLACEMENT_CONFIG_PREFIX))
{
availability_zone = "";
initialized = true;
return;
}
use_imds = config.getBool(getConfigPath("use_imds"), false);
if (use_imds)
{
availability_zone = S3::getRunningAvailabilityZone();
}
else
{
availability_zone = config.getString(getConfigPath("availability_zone"), "");
if (availability_zone.empty())
availability_zone = loadAvailabilityZoneFromFile(config);
if (availability_zone.empty())
LOG_WARNING(log, "Availability zone info not found");
}
LOG_DEBUG(log, "Loaded info: availability_zone: {}", availability_zone);
initialized = true;
}
catch (...)
{
tryLogCurrentException("Failed to get availability zone");
availability_zone = "";
initialized = true;
}
std::string PlacementInfo::getAvailabilityZone() const
{
if (!initialized)
throw Exception(ErrorCodes::LOGICAL_ERROR, "Placement info has not been loaded");
return availability_zone;
}
}
}