diff --git a/src/CraneCtld/AccountManager.cpp b/src/CraneCtld/AccountManager.cpp index 62c6298b..4d21cbfa 100644 --- a/src/CraneCtld/AccountManager.cpp +++ b/src/CraneCtld/AccountManager.cpp @@ -588,7 +588,7 @@ CraneExpected AccountManager::AddUserAllowedPartition( CraneExpectedRich AccountManager::SetUserAllowedPartition( uint32_t uid, const std::string& username, const std::string& account, - const std::vector& partition_list) { + const std::unordered_set& partition_list) { util::write_lock_guard user_guard(m_rw_user_mutex_); util::read_lock_guard account_guard(m_rw_account_mutex_); @@ -639,8 +639,8 @@ CraneExpected AccountManager::AddUserAllowedQos( CraneExpectedRich AccountManager::SetUserAllowedQos( uint32_t uid, const std::string& username, const std::string& partition, - const std::string& account, std::vector&& qos_list, - bool force) { + const std::string& account, const std::string& default_qos, + std::unordered_set&& qos_list, bool force) { util::write_lock_guard user_guard(m_rw_user_mutex_); util::read_lock_guard account_guard(m_rw_account_mutex_); util::read_lock_guard qos_guard(m_rw_qos_mutex_); @@ -663,8 +663,8 @@ CraneExpectedRich AccountManager::SetUserAllowedQos( CheckSetUserAllowedQosNoLock_(p, account_ptr, partition, qos_list, force); if (!rich_result) return rich_result; - return SetUserAllowedQos_(*p, *account_ptr, partition, std::move(qos_list), - force); + return SetUserAllowedQos_(*p, *account_ptr, partition, default_qos, + std::move(qos_list), force); } CraneExpected AccountManager::DeleteUserAllowedPartition( @@ -807,7 +807,7 @@ CraneExpected AccountManager::ModifyAccount( CraneExpectedRich AccountManager::SetAccountAllowedPartition( uint32_t uid, const std::string& account_name, - std::vector&& partition_list, bool force) { + std::unordered_set&& partition_list, bool force) { CraneExpected result{}; { util::read_lock_guard user_guard(m_rw_user_mutex_); @@ -838,7 +838,8 @@ CraneExpectedRich AccountManager::SetAccountAllowedPartition( CraneExpectedRich AccountManager::SetAccountAllowedQos( uint32_t uid, const std::string& account_name, - std::vector&& qos_list, bool force) { + const std::string& default_qos, std::unordered_set&& qos_list, + bool force) { CraneExpected result{}; { util::read_lock_guard user_guard(m_rw_user_mutex_); @@ -862,7 +863,8 @@ CraneExpectedRich AccountManager::SetAccountAllowedQos( auto rich_result = CheckSetAccountAllowedQosNoLock_(account, qos_list, force); return !rich_result ? rich_result - : SetAccountAllowedQos_(*account, std::move(qos_list)); + : SetAccountAllowedQos_(*account, default_qos, + std::move(qos_list)); } CraneExpected AccountManager::ModifyQos( @@ -1173,7 +1175,8 @@ CraneExpected AccountManager::CheckAddUserAllowedPartitionNoLock_( } CraneExpectedRich AccountManager::CheckSetUserAllowedPartitionNoLock_( - const Account* account, const std::vector& partition_list) { + const Account* account, + const std::unordered_set& partition_list) { for (const auto& partition : partition_list) { auto result = CheckPartitionIsAllowedNoLock_(account, partition, false, true); @@ -1223,7 +1226,7 @@ CraneExpected AccountManager::CheckAddUserAllowedQosNoLock_( CraneExpectedRich AccountManager::CheckSetUserAllowedQosNoLock_( const User* user, const Account* account, const std::string& partition, - const std::vector& qos_list, bool force) { + const std::unordered_set& qos_list, bool force) { for (const auto& qos : qos_list) { auto result = CheckQosIsAllowedNoLock_(account, qos, false, true); if (!result) @@ -1361,8 +1364,8 @@ CraneExpected AccountManager::CheckSetAccountDescriptionNoLock_( } CraneExpectedRich AccountManager::CheckSetAccountAllowedPartitionNoLock_( - const Account* account, const std::vector& partition_list, - bool force) { + const Account* account, + const std::unordered_set& partition_list, bool force) { for (const auto& partition : partition_list) { auto result = CheckPartitionIsAllowedNoLock_(account, partition, true, false); @@ -1382,7 +1385,7 @@ CraneExpectedRich AccountManager::CheckSetAccountAllowedPartitionNoLock_( } CraneExpectedRich AccountManager::CheckSetAccountAllowedQosNoLock_( - const Account* account, const std::vector& qos_list, + const Account* account, const std::unordered_set& qos_list, bool force) { for (const auto& qos : qos_list) { auto result = CheckQosIsAllowedNoLock_(account, qos, true, false); @@ -2103,7 +2106,7 @@ CraneExpected AccountManager::SetUserDefaultQos_( CraneExpectedRich AccountManager::SetUserAllowedPartition_( const User& user, const Account& account, - const std::vector& partition_list) { + const std::unordered_set& partition_list) { const std::string& name = user.name; const std::string& account_name = account.name; @@ -2138,7 +2141,8 @@ CraneExpectedRich AccountManager::SetUserAllowedPartition_( CraneExpectedRich AccountManager::SetUserAllowedQos_( const User& user, const Account& account, const std::string& partition, - std::vector&& qos_list, bool force) { + const std::string& default_qos, std::unordered_set&& qos_list, + bool force) { const std::string& name = user.name; const std::string& account_name = account.name; @@ -2148,7 +2152,7 @@ CraneExpectedRich AccountManager::SetUserAllowedQos_( for (auto& [par, pair] : res_user.account_to_attrs_map[account_name] .allowed_partition_qos_map) { if (!ranges::contains(qos_list, pair.first)) - pair.first = qos_list.empty() ? "" : qos_list.front(); + pair.first = qos_list.empty() ? "" : default_qos; pair.second.assign(std::make_move_iterator(qos_list.begin()), std::make_move_iterator(qos_list.end())); } @@ -2158,7 +2162,7 @@ CraneExpectedRich AccountManager::SetUserAllowedQos_( .allowed_partition_qos_map.find(partition); if (!ranges::contains(qos_list, iter->second.first)) - iter->second.first = qos_list.empty() ? "" : qos_list.front(); + iter->second.first = qos_list.empty() ? "" : default_qos; iter->second.second.assign(std::make_move_iterator(qos_list.begin()), std::make_move_iterator(qos_list.end())); @@ -2342,7 +2346,7 @@ CraneExpected AccountManager::SetAccountDefaultQos_( } CraneExpectedRich AccountManager::SetAccountAllowedPartition_( - const Account& account, std::vector&& partition_list) { + const Account& account, std::unordered_set&& partition_list) { const std::string& name = account.name; std::list deleted_partition; @@ -2384,7 +2388,8 @@ CraneExpectedRich AccountManager::SetAccountAllowedPartition_( } CraneExpectedRich AccountManager::SetAccountAllowedQos_( - const Account& account, std::vector&& qos_list) { + const Account& account, const std::string& default_qos, + std::unordered_set&& qos_list) { const std::string& name = account.name; std::list deleted_qos; @@ -2413,7 +2418,7 @@ CraneExpectedRich AccountManager::SetAccountAllowedQos_( if (temp.default_qos.empty()) { g_db_client->UpdateEntityOne(MongodbClient::EntityType::ACCOUNT, "$set", name, "default_qos", - qos_list.front()); + default_qos); } g_db_client->UpdateEntityOne(MongodbClient::EntityType::ACCOUNT, @@ -2437,7 +2442,7 @@ CraneExpectedRich AccountManager::SetAccountAllowedQos_( if (!add_qos.empty()) { if (account.default_qos.empty()) { - m_account_map_[name]->default_qos = qos_list.front(); + m_account_map_[name]->default_qos = default_qos; } m_account_map_[name]->allowed_qos_list.assign( std::make_move_iterator(qos_list.begin()), diff --git a/src/CraneCtld/AccountManager.h b/src/CraneCtld/AccountManager.h index ec1c5843..471443ab 100644 --- a/src/CraneCtld/AccountManager.h +++ b/src/CraneCtld/AccountManager.h @@ -97,7 +97,7 @@ class AccountManager { CraneExpectedRich SetUserAllowedPartition( uint32_t uid, const std::string& username, const std::string& account, - const std::vector& partition_list); + const std::unordered_set& partition_list); CraneExpected AddUserAllowedQos(uint32_t uid, const std::string& username, @@ -105,12 +105,10 @@ class AccountManager { const std::string& account, const std::string& new_qos); - CraneExpectedRich SetUserAllowedQos(uint32_t uid, - const std::string& username, - const std::string& partition, - const std::string& account, - std::vector&& qos_list, - bool force); + CraneExpectedRich SetUserAllowedQos( + uint32_t uid, const std::string& username, const std::string& partition, + const std::string& account, const std::string& default_qos, + std::unordered_set&& qos_list, bool force); CraneExpected DeleteUserAllowedPartition(uint32_t uid, const std::string& name, @@ -127,11 +125,12 @@ class AccountManager { CraneExpectedRich SetAccountAllowedPartition( uint32_t uid, const std::string& account_name, - std::vector&& partition_list, bool force); + std::unordered_set&& partition_list, bool force); CraneExpectedRich SetAccountAllowedQos( uint32_t uid, const std::string& account_name, - std::vector&& qos_list, bool force); + const std::string& default_qos, + std::unordered_set&& qos_list, bool force); CraneExpected ModifyQos(uint32_t uid, const std::string& name, crane::grpc::ModifyField modify_field, @@ -185,13 +184,14 @@ class AccountManager { CraneExpected CheckAddUserAllowedPartitionNoLock_( const User* user, const Account* account, const std::string& partition); CraneExpectedRich CheckSetUserAllowedPartitionNoLock_( - const Account* account, const std::vector& partition_list); + const Account* account, + const std::unordered_set& partition_list); CraneExpected CheckAddUserAllowedQosNoLock_( const User* user, const Account* account, const std::string& partition, const std::string& qos_str); CraneExpectedRich CheckSetUserAllowedQosNoLock_( const User* user, const Account* account, const std::string& partition, - const std::vector& qos_list, bool force); + const std::unordered_set& qos_list, bool force); CraneExpected CheckSetUserDefaultQosNoLock_( const User& user, const std::string& account, const std::string& partition, const std::string& qos); @@ -212,10 +212,10 @@ class AccountManager { const std::string& qos); CraneExpected CheckSetAccountDescriptionNoLock_(const Account* account); CraneExpectedRich CheckSetAccountAllowedPartitionNoLock_( - const Account* account, const std::vector& partition_list, - bool force); + const Account* account, + const std::unordered_set& partition_list, bool force); CraneExpectedRich CheckSetAccountAllowedQosNoLock_( - const Account* account, const std::vector& qos_list, + const Account* account, const std::unordered_set& qos_list, bool force); CraneExpected CheckSetAccountDefaultQosNoLock_(const Account* account, const std::string& qos); @@ -298,10 +298,11 @@ class AccountManager { const std::string& qos); CraneExpectedRich SetUserAllowedPartition_( const User& user, const Account& account, - const std::vector& partition_list); + const std::unordered_set& partition_list); CraneExpectedRich SetUserAllowedQos_( const User& user, const Account& account, const std::string& partition, - std::vector&& qos_list, bool force); + const std::string& default_qos, + std::unordered_set&& qos_list, bool force); CraneExpected DeleteUserAllowedPartition_(const User& user, const std::string& account, @@ -322,9 +323,10 @@ class AccountManager { CraneExpected SetAccountDefaultQos_(const Account& account, const std::string& qos); CraneExpectedRich SetAccountAllowedPartition_( - const Account& account, std::vector&& partition_list); + const Account& account, std::unordered_set&& partition_list); CraneExpectedRich SetAccountAllowedQos_( - const Account& account, std::vector&& qos_list); + const Account& account, const std::string& default_qos, + std::unordered_set&& qos_list); CraneExpected DeleteAccountAllowedPartition_( const Account& account, const std::string& partition); diff --git a/src/CraneCtld/CtldGrpcServer.cpp b/src/CraneCtld/CtldGrpcServer.cpp index 34e11def..095b7302 100644 --- a/src/CraneCtld/CtldGrpcServer.cpp +++ b/src/CraneCtld/CtldGrpcServer.cpp @@ -441,13 +441,9 @@ grpc::Status CraneCtldServiceImpl::ModifyAccount( if (request->type() == crane::grpc::OperationType::Overwrite && request->modify_field() == crane::grpc::ModifyField::Partition) { // SetAccountAllowedPartition - std::unordered_set unique_set; - std::vector partition_list; - partition_list.reserve(request->value_list_size()); - for (const auto &partition_name : request->value_list()) { - if (unique_set.insert(partition_name).second) - partition_list.emplace_back(partition_name); - } + std::unordered_set partition_list{ + request->value_list().begin(), request->value_list().end()}; + auto rich_res = g_account_manager->SetAccountAllowedPartition( request->uid(), request->name(), std::move(partition_list), request->force()); @@ -456,15 +452,13 @@ grpc::Status CraneCtldServiceImpl::ModifyAccount( } else if (request->type() == crane::grpc::OperationType::Overwrite && request->modify_field() == crane::grpc::ModifyField::Qos) { // SetAccountAllowedQos - std::unordered_set unique_set; - std::vector qos_list; - qos_list.reserve(request->value_list_size()); - for (const auto &qos_name : request->value_list()) { - if (unique_set.insert(qos_name).second) qos_list.emplace_back(qos_name); - } - + std::unordered_set qos_list{request->value_list().begin(), + request->value_list().end()}; + std::string default_qos = ""; + if (!request->value_list().empty()) default_qos = request->value_list()[0]; auto rich_res = g_account_manager->SetAccountAllowedQos( - request->uid(), request->name(), std::move(qos_list), request->force()); + request->uid(), request->name(), default_qos, std::move(qos_list), + request->force()); if (!rich_res) response->mutable_rich_error_list()->Add()->CopyFrom(rich_res.error()); } else { // other operations @@ -547,8 +541,8 @@ grpc::Status CraneCtldServiceImpl::ModifyUser( } } } else if (request->type() == crane::grpc::OperationType::Overwrite) { - std::vector partition_list{request->value_list().begin(), - request->value_list().end()}; + std::unordered_set partition_list{ + request->value_list().begin(), request->value_list().end()}; auto rich_res = g_account_manager->SetUserAllowedPartition( request->uid(), request->name(), request->account(), partition_list); @@ -570,16 +564,15 @@ grpc::Status CraneCtldServiceImpl::ModifyUser( } } } else if (request->type() == crane::grpc::OperationType::Overwrite) { - std::unordered_set unique_set; - std::vector qos_list; - qos_list.reserve(request->value_list_size()); - for (const auto &qos_name : request->value_list()) { - if (unique_set.insert(qos_name).second) - qos_list.emplace_back(qos_name); - } + std::unordered_set qos_list{request->value_list().begin(), + request->value_list().end()}; + std::string default_qos = ""; + if (!request->value_list().empty()) + default_qos = request->value_list()[0]; auto rich_res = g_account_manager->SetUserAllowedQos( request->uid(), request->name(), request->partition(), - request->account(), std::move(qos_list), request->force()); + request->account(), default_qos, std::move(qos_list), + request->force()); if (!rich_res) response->mutable_rich_error_list()->Add()->CopyFrom( rich_res.error());