mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-27 07:34:15 +02:00
ApiListener::UpdateObjectAuthority(): distribute auth. by object's host
Pin child objects of hosts (HOST!...) to the same endpoint as the host. This reduces cross-object action latency withing the same host. If all endpoints know this algorithm, we can use it.
This commit is contained in:
parent
18f810a1ea
commit
6cd83ba2b8
@ -25,6 +25,7 @@ void ApiListener::UpdateObjectAuthority()
|
|||||||
|
|
||||||
std::vector<Endpoint::Ptr> endpoints;
|
std::vector<Endpoint::Ptr> endpoints;
|
||||||
Endpoint::Ptr my_endpoint;
|
Endpoint::Ptr my_endpoint;
|
||||||
|
int hostChildrenInheritObjectAuthority = 0;
|
||||||
|
|
||||||
if (my_zone) {
|
if (my_zone) {
|
||||||
my_endpoint = Endpoint::GetLocalEndpoint();
|
my_endpoint = Endpoint::GetLocalEndpoint();
|
||||||
@ -38,6 +39,10 @@ void ApiListener::UpdateObjectAuthority()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
endpoints.push_back(endpoint);
|
endpoints.push_back(endpoint);
|
||||||
|
|
||||||
|
if (endpoint == my_endpoint || endpoint->GetCapabilities() & static_cast<uint_fast64_t>(ApiCapabilities::HostChildrenInheritObjectAuthority)) {
|
||||||
|
++hostChildrenInheritObjectAuthority;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double startTime = Application::GetStartTime();
|
double startTime = Application::GetStartTime();
|
||||||
@ -65,10 +70,24 @@ void ApiListener::UpdateObjectAuthority()
|
|||||||
|
|
||||||
bool authority;
|
bool authority;
|
||||||
|
|
||||||
if (!my_zone)
|
if (my_zone) {
|
||||||
|
auto name (object->GetName());
|
||||||
|
|
||||||
|
// If all endpoints know this algorithm, we can use it.
|
||||||
|
if (hostChildrenInheritObjectAuthority == endpoints.size()) {
|
||||||
|
auto exclamation (name.FindFirstOf('!'));
|
||||||
|
|
||||||
|
// Pin child objects of hosts (HOST!...) to the same endpoint as the host.
|
||||||
|
// This reduces cross-object action latency withing the same host.
|
||||||
|
if (exclamation != String::NPos) {
|
||||||
|
name.erase(name.Begin() + exclamation, name.End());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
authority = endpoints[Utility::SDBM(name) % endpoints.size()] == my_endpoint;
|
||||||
|
} else {
|
||||||
authority = true;
|
authority = true;
|
||||||
else
|
}
|
||||||
authority = endpoints[Utility::SDBM(object->GetName()) % endpoints.size()] == my_endpoint;
|
|
||||||
|
|
||||||
#ifdef I2_DEBUG
|
#ifdef I2_DEBUG
|
||||||
// //Enable on demand, causes heavy logging on each run.
|
// //Enable on demand, causes heavy logging on each run.
|
||||||
|
@ -640,7 +640,9 @@ static const auto l_AppVersionInt (([]() -> unsigned long {
|
|||||||
})());
|
})());
|
||||||
|
|
||||||
static const auto l_MyCapabilities (
|
static const auto l_MyCapabilities (
|
||||||
(uint_fast64_t)ApiCapabilities::ExecuteArbitraryCommand | (uint_fast64_t)ApiCapabilities::IfwApiCheckCommand
|
(uint_fast64_t)ApiCapabilities::ExecuteArbitraryCommand
|
||||||
|
| (uint_fast64_t)ApiCapabilities::IfwApiCheckCommand
|
||||||
|
| (uint_fast64_t)ApiCapabilities::HostChildrenInheritObjectAuthority
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -69,6 +69,7 @@ enum class ApiCapabilities : uint_fast64_t
|
|||||||
{
|
{
|
||||||
ExecuteArbitraryCommand = 1u << 0u,
|
ExecuteArbitraryCommand = 1u << 0u,
|
||||||
IfwApiCheckCommand = 1u << 1u,
|
IfwApiCheckCommand = 1u << 1u,
|
||||||
|
HostChildrenInheritObjectAuthority = 1u << 2u,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user