Removing Config Adapter - #455
Conversation
License Check Results🚀 The license check job ran with the Bazel command: bazel run --lockfile_mode=error //:license-checkStatus: Click to expand output |
48210c0 to
84721b9
Compare
|
The created documentation from the pull request is available at: docu-html |
|
|
||
| LM_LOG_DEBUG() << "Process group index" << index << "(with name" << pg_name << ") has" << num_processes | ||
| << "processes"; | ||
| DependencyGraph<Graph::Component> graph(components.size() + run_targets.size() + 1); |
There was a problem hiding this comment.
Should we add a comment explaining why the + 1 is necessary?
| LM_LOG_DEBUG() << "HERER++++++++"; | ||
| // Now process the request | ||
| switch (scc->request().request_or_response_) | ||
| { | ||
| case ControlClientCode::kSetStateRequest: | ||
| LM_LOG_DEBUG() << "HERER++++++++"; |
| // TODO: Determine recovery state from configuration | ||
| recovery_state.pg_state_name_ = IdentifierHash("fallback"); // TODO: Get from configuration |
WilliamRoebuck
left a comment
There was a problem hiding this comment.
Looks good, I have mostly small comments, one or two suggestions for code changes
| EXPECT_THAT(target.recovery_action.run_target, Eq("SafeState")); | ||
| } | ||
|
|
||
| TEST_F(FlatbufferConfigLoaderTest, ConfiguredOffRunTargetIsLoadedVerbatim) |
There was a problem hiding this comment.
Can we add or extend a test to check that an "Off" target is created if none exists?
| auto it = component_name_to_index.find(dep_name); | ||
| SCORE_LANGUAGE_FUTURECPP_PRECONDITION_MESSAGE( | ||
| it != component_name_to_index.end(), "Component dependency not found in component list"); | ||
|
|
||
| SCORE_LANGUAGE_FUTURECPP_ASSERT_DBG_MESSAGE(states != nullptr, "Process group states not found for process group"); | ||
| graph.addDependency(comp_dep_i, it->second); |
There was a problem hiding this comment.
This addDependency section is repeated 3 times, can we add a helper function/lambda? Or even better maybe we can iterate through all the dependencies in one loop somehow?
There was a problem hiding this comment.
Maybe you can add everything to the graph and then iterate through graph items, accessing the config by index?
| /// @details The implementation should be async signal safe. | ||
| OsalReturnType ProcessLauncher::setSchedulingAndSecurity(const OsalConfig& config) | ||
| OsalReturnType ProcessLauncher::setSchedulingAndSecurity( | ||
| const score::mw::lifecycle::internal::configuration::ComponentConfig& config) |
There was a problem hiding this comment.
Can we pass just the deployment config here?
| alive_monitor_thread_->stop(); | ||
| configuration_.deinitialize(); | ||
| process_groups_.clear(); | ||
| // No deinitialize needed - Config destructor handles cleanup |
There was a problem hiding this comment.
I don't think we need this comment
| } | ||
| return result; | ||
| SCORE_LANGUAGE_FUTURECPP_ASSERT_MESSAGE(bool(graph_), "Graph not initialized"); | ||
| // Convert string_view to IdentifierHash |
There was a problem hiding this comment.
There's a constructor at IdentifierHash.cpp:66, doesn't it work?
| // TODO: Determine recovery state from configuration | ||
| recovery_state.pg_state_name_ = IdentifierHash("fallback"); // TODO: Get from configuration |
| recovery_state.pg_state_name_ = IdentifierHash("fallback"); // TODO: Get from configuration | ||
|
|
||
| LM_LOG_WARN() << "Problem discovered in PG" << recovery_state.pg_name_ << "Activating Recovery state."; | ||
| LM_LOG_WARN() << "Problem discovered, activating recovery state: " << recovery_state.pg_state_name_; |
There was a problem hiding this comment.
| LM_LOG_WARN() << "Problem discovered, activating recovery state: " << recovery_state.pg_state_name_; | |
| LM_LOG_WARN() << "Problem discovered, activating recovery state:" << recovery_state.pg_state_name_; |
Extra space
| return static_cast<int32_t>(index); | ||
| } | ||
| auto off_index = graph.emplace(std::in_place_type<RunTarget>, graph.size()); | ||
| run_target_map.insert({IdentifierHash{"Off"}.data(), off_index}); |
There was a problem hiding this comment.
The "Off" name exists in many locations as hardcoded string. Maybe we can move this to a single constant
| // on https://github.com/eclipse-score/lifecycle/issues/463 | ||
| // making the dep_graph a hash map would make this much cleaner as we | ||
| // wouldn't have to keep track of stuff... | ||
| const std::vector<configuration::RunTargetConfig> run_targets = config.takeRunTargets(); |
There was a problem hiding this comment.
process group manager still uses configuration_.runTargets() even though its been moved out here
| // Off can be configred by the user and would mean we need +1 but | ||
| // over-reserving is ok. | ||
| // fallback is always created. | ||
| const std::size_t graph_size = components.size() + run_targets.size() + 2U; |
There was a problem hiding this comment.
This calculation exists in a duplicate way also here in process_group_manager.cpp:207
| off_rt_defined |= bool(run_target.name == "Off"); | ||
| component_name_to_index[run_target.name] = index; | ||
| run_target_map.insert({IdentifierHash{run_target.name}.data(), index}); | ||
| }; |
There was a problem hiding this comment.
| }; | |
| } |
|
|
||
| for (const auto process_index : state.process_indexes_) | ||
| off_rt_defined |= bool(run_target.name == "Off"); | ||
| component_name_to_index[run_target.name] = index; |
There was a problem hiding this comment.
is it ensured that component and run target names are unique, otherwise this may silently overwrite a preexisting name
| /// @param process_map Map for tracking process PIDs. | ||
| /// @param run_target_map Map to keep the translation between IDHash to Index | ||
| /// @return A populated dependency graph with all components and run targets. | ||
| DependencyGraph<Graph::Component> CreateDependencyGraph( |
There was a problem hiding this comment.
Its a rather long private method with many parameters. I wonder if this can be refactored to make it simpler and more easily testable by having e.g. a separate GraphBuilder class or something like that
There was a problem hiding this comment.
This method will already need to be rewritten as part of #463, so I think it could be left for a separate PR?
There was a problem hiding this comment.
Will this ticket really dramatically change the scope of this method?
There was a problem hiding this comment.
I suppose not from an external perspective, but I think the implementation inside will change a lot.
| return success; | ||
| graph_ = std::make_shared<Graph>( | ||
| // size is +2 for fallback + off | ||
| configuration_.components().size() + configuration_.runTargets().size() + 2, |
There was a problem hiding this comment.
I wonder if this size can be inferred from the configuration inside the Graph, so that this calculation does not need to exist multiple times
| // Single-graph assumption: PGM creates one ProcessMonitor bound to the first (only) graph, so | ||
| // every event always applies to it. Multi-graph routing is deferred to a future revision. | ||
| Graph& graph = *process_groups_.front(); | ||
| SCORE_LANGUAGE_FUTURECPP_ASSERT_MESSAGE(bool(graph_), "Graph not initialized"); |
There was a problem hiding this comment.
I suppose we should probably use static_cast over c-style casts
| const IdentifierHash old_state = graph_->getProcessGroupState(); | ||
| // the fallback state doesn't have a name in the config, so we use | ||
| // "fallback", it doesn't actually matter... | ||
| const IdentifierHash recovery_state("fallback"); |
There was a problem hiding this comment.
This name exists in multiple places as hardcoded string and they need to be identical for things to work, so I would recommend to move this to a single constant.
Fixes #420
Currently we have a lot of code to bridge the old config and new. This PR removes the bridge and changes. Process Group Manager, Graph and Alive Monitor to use the new config.
This also partially addresses some multi-og code from #413. However our IPC still has a field for the pg_name and there is still a bunch of references to it in comments and method names.
This also creates a temporary
CreateDependencyGraphfunction that takes the config and creates aDependencyGraphfrom it. This is intentionally left as not polished and un covered with UTs as it shall be more or less removed in #463.Another point to address is that the AliveMonitor copies its config as the shape of the config doesn't fit the current implementation. This will be addressed in #477.