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:
Alexander A. Klimov 2025-05-16 15:02:56 +02:00
parent 18f810a1ea
commit 6cd83ba2b8
3 changed files with 26 additions and 4 deletions

View File

@ -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.

View File

@ -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
); );
/** /**

View File

@ -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,
}; };
/** /**