Skip to content

Commit

Permalink
ApiListener::UpdateObjectAuthority(): distribute auth. by object's host
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Al2Klimov committed Sep 18, 2024
1 parent 47daa71 commit 45a5d2d
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 4 deletions.
27 changes: 24 additions & 3 deletions lib/remote/apilistener-authority.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ void ApiListener::UpdateObjectAuthority()

std::vector<Endpoint::Ptr> endpoints;
Endpoint::Ptr my_endpoint;
int hostChildrenInheritObjectAuthority = 0;

if (my_zone) {
my_endpoint = Endpoint::GetLocalEndpoint();
Expand All @@ -51,6 +52,12 @@ void ApiListener::UpdateObjectAuthority()
return a->GetName() < b->GetName();
}
);

for (auto& endpoint : endpoints) {
if (endpoint == my_endpoint || endpoint->GetCapabilities() & (uint_fast64_t)ApiCapabilities::HostChildrenInheritObjectAuthority) {
++hostChildrenInheritObjectAuthority;
}
}
}

for (const Type::Ptr& type : Type::GetAllTypes()) {
Expand All @@ -65,10 +72,24 @@ void ApiListener::UpdateObjectAuthority()

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 = name.SubStr(0, exclamation);
}
}

authority = endpoints[Utility::SDBM(name) % endpoints.size()] == my_endpoint;
} else {
authority = true;
else
authority = endpoints[Utility::SDBM(object->GetName()) % endpoints.size()] == my_endpoint;
}

#ifdef I2_DEBUG
// //Enable on demand, causes heavy logging on each run.
Expand Down
4 changes: 3 additions & 1 deletion lib/remote/apilistener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,9 @@ static const auto l_AppVersionInt (([]() -> unsigned long {
})());

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
);

/**
Expand Down
1 change: 1 addition & 0 deletions lib/remote/apilistener.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ enum class ApiCapabilities : uint_fast64_t
{
ExecuteArbitraryCommand = 1u << 0u,
IfwApiCheckCommand = 1u << 1u,
HostChildrenInheritObjectAuthority = 1u << 2u,
};

/**
Expand Down

0 comments on commit 45a5d2d

Please sign in to comment.