sculpt: use cached_fs_rom as depot_rom

Fixes #2904
This commit is contained in:
Norman Feske 2018-07-04 15:25:59 +02:00 committed by Christian Helmuth
parent 726327d95c
commit a2dc07056e
10 changed files with 95 additions and 49 deletions

View File

@ -6,6 +6,7 @@ _/src/report_rom
_/src/init _/src/init
_/src/ram_fs _/src/ram_fs
_/src/fs_rom _/src/fs_rom
_/src/cached_fs_rom
_/src/fs_report _/src/fs_report
_/src/nitpicker _/src/nitpicker
_/src/global_keys_handler _/src/global_keys_handler

View File

@ -83,7 +83,9 @@ class Depot_deploy::Child : public List_model<Child>::Element
&& (_config_pkg_path() == _blueprint_pkg_path); && (_config_pkg_path() == _blueprint_pkg_path);
} }
inline void _gen_routes(Xml_generator &, Xml_node, Depot_rom_server const &) const; inline void _gen_routes(Xml_generator &, Xml_node,
Depot_rom_server const &,
Depot_rom_server const &) const;
static void _gen_provides_sub_node(Xml_generator &xml, Xml_node service, static void _gen_provides_sub_node(Xml_generator &xml, Xml_node service,
Xml_node::Type const &node_type, Xml_node::Type const &node_type,
@ -224,14 +226,19 @@ class Depot_deploy::Child : public List_model<Child>::Element
/** /**
* Generate start node of init configuration * Generate start node of init configuration
* *
* \param common session routes to be added in addition to the ones * \param common session routes to be added in addition to
* found in the pkg blueprint * the ones found in the pkg blueprint
* \param depot_rom name of the server that provides the depot content * \param cached_depot_rom name of the server that provides the depot
* as ROM modules. If the string is invalid, ROM * content as ROM modules. If the string is
* requests are routed to the parent. * invalid, ROM requests are routed to the
* parent.
* \param uncached_depot_rom name of the depot-ROM server used to obtain
* the content of the depot user "local", which
* is assumed to be mutable
*/ */
inline void gen_start_node(Xml_generator &, Xml_node common, inline void gen_start_node(Xml_generator &, Xml_node common,
Depot_rom_server const &depot_rom) const; Depot_rom_server const &cached_depot_rom,
Depot_rom_server const &uncached_depot_rom) const;
/** /**
* Generate installation entry needed for the completion of the child * Generate installation entry needed for the completion of the child
@ -251,7 +258,8 @@ class Depot_deploy::Child : public List_model<Child>::Element
void Depot_deploy::Child::gen_start_node(Xml_generator &xml, Xml_node common, void Depot_deploy::Child::gen_start_node(Xml_generator &xml, Xml_node common,
Depot_rom_server const &depot_rom) const Depot_rom_server const &cached_depot_rom,
Depot_rom_server const &uncached_depot_rom) const
{ {
if (!_configured() || _condition == UNSATISFIED) if (!_configured() || _condition == UNSATISFIED)
return; return;
@ -313,13 +321,15 @@ void Depot_deploy::Child::gen_start_node(Xml_generator &xml, Xml_node common,
}); });
} }
xml.node("route", [&] () { _gen_routes(xml, common, depot_rom); }); xml.node("route", [&] () {
_gen_routes(xml, common, cached_depot_rom, uncached_depot_rom); });
}); });
} }
void Depot_deploy::Child::_gen_routes(Xml_generator &xml, Xml_node common, void Depot_deploy::Child::_gen_routes(Xml_generator &xml, Xml_node common,
Depot_rom_server const &depot_rom) const Depot_rom_server const &cached_depot_rom,
Depot_rom_server const &uncached_depot_rom) const
{ {
if (!_pkg_xml.constructed()) if (!_pkg_xml.constructed())
return; return;
@ -334,6 +344,18 @@ void Depot_deploy::Child::_gen_routes(Xml_generator &xml, Xml_node common,
xml.append(route.content_base(), route.content_size()); xml.append(route.content_base(), route.content_size());
} }
/**
* Return name of depot-ROM server used for obtaining the 'path'
*
* If the depot path refers to the depot-user "local", route the
* session request to the non-cached ROM service.
*/
auto rom_server = [&] (Path const &path) {
return (String<7>(path) == "local/") ? uncached_depot_rom
: cached_depot_rom;
};
/* /*
* Redirect config ROM request to label as given in the 'config' attribute, * Redirect config ROM request to label as given in the 'config' attribute,
* if present. We need to search the blueprint's <rom> nodes for the * if present. We need to search the blueprint's <rom> nodes for the
@ -356,9 +378,9 @@ void Depot_deploy::Child::_gen_routes(Xml_generator &xml, Xml_node common,
typedef String<160> Path; typedef String<160> Path;
Path const path = rom.attribute_value("path", Path()); Path const path = rom.attribute_value("path", Path());
if (depot_rom.valid()) if (cached_depot_rom.valid())
xml.node("child", [&] () { xml.node("child", [&] () {
xml.attribute("name", depot_rom); xml.attribute("name", rom_server(path));
xml.attribute("label", path); }); xml.attribute("label", path); });
else else
xml.node("parent", [&] () { xml.node("parent", [&] () {
@ -389,9 +411,9 @@ void Depot_deploy::Child::_gen_routes(Xml_generator &xml, Xml_node common,
xml.attribute("name", "ROM"); xml.attribute("name", "ROM");
xml.attribute("label_last", label); xml.attribute("label_last", label);
if (depot_rom.valid()) { if (cached_depot_rom.valid()) {
xml.node("child", [&] () { xml.node("child", [&] () {
xml.attribute("name", depot_rom); xml.attribute("name", rom_server(path));
xml.attribute("label", path); xml.attribute("label", path);
}); });
} else { } else {

View File

@ -103,10 +103,11 @@ class Depot_deploy::Children
} }
void gen_start_nodes(Xml_generator &xml, Xml_node common, void gen_start_nodes(Xml_generator &xml, Xml_node common,
Child::Depot_rom_server const &depot_rom) const Child::Depot_rom_server const &cached_depot_rom,
Child::Depot_rom_server const &uncached_depot_rom) const
{ {
_children.for_each([&] (Child const &child) { _children.for_each([&] (Child const &child) {
child.gen_start_node(xml, common, depot_rom); }); child.gen_start_node(xml, common, cached_depot_rom, uncached_depot_rom); });
} }
void gen_queries(Xml_generator &xml) const void gen_queries(Xml_generator &xml) const

View File

@ -64,7 +64,8 @@ struct Depot_deploy::Main
Xml_node static_config = config.sub_node("static"); Xml_node static_config = config.sub_node("static");
xml.append(static_config.content_base(), static_config.content_size()); xml.append(static_config.content_base(), static_config.content_size());
Child::Depot_rom_server const parent { }; Child::Depot_rom_server const parent { };
_children.gen_start_nodes(xml, config.sub_node("common_routes"), parent); _children.gen_start_nodes(xml, config.sub_node("common_routes"),
parent, parent);
}); });
/* update query for blueprints of all unconfigured start nodes */ /* update query for blueprints of all unconfigured start nodes */

View File

@ -132,9 +132,17 @@ void Sculpt::Deploy::handle_deploy()
void Sculpt::Deploy::gen_runtime_start_nodes(Xml_generator &xml) const void Sculpt::Deploy::gen_runtime_start_nodes(Xml_generator &xml) const
{ {
/* depot-ROM instance for regular (immutable) depot content */
xml.node("start", [&] () { xml.node("start", [&] () {
gen_fs_rom_start_content(xml, "depot_rom", "depot", gen_fs_rom_start_content(xml, "depot_rom", "cached_fs_rom", "depot",
depot_rom_state.ram_quota); }); cached_depot_rom_state.ram_quota,
cached_depot_rom_state.cap_quota); });
/* depot-ROM instance for mutable content (/depot/local/) */
xml.node("start", [&] () {
gen_fs_rom_start_content(xml, "dynamic_depot_rom", "fs_rom", "depot",
uncached_depot_rom_state.ram_quota,
uncached_depot_rom_state.cap_quota); });
xml.node("start", [&] () { xml.node("start", [&] () {
gen_depot_query_start_content(xml); }); gen_depot_query_start_content(xml); });
@ -150,5 +158,5 @@ void Sculpt::Deploy::gen_runtime_start_nodes(Xml_generator &xml) const
/* generate start nodes for deployed packages */ /* generate start nodes for deployed packages */
if (manual_deploy.has_sub_node("common_routes")) if (manual_deploy.has_sub_node("common_routes"))
_children.gen_start_nodes(xml, manual_deploy.sub_node("common_routes"), _children.gen_start_nodes(xml, manual_deploy.sub_node("common_routes"),
"depot_rom"); "depot_rom", "dynamic_depot_rom");
} }

View File

@ -47,9 +47,10 @@ struct Sculpt::Deploy
struct Query_version { unsigned value; } _query_version { 0 }; struct Query_version { unsigned value; } _query_version { 0 };
struct Depot_rom_state { Ram_quota ram_quota; }; struct Depot_rom_state { Ram_quota ram_quota; Cap_quota cap_quota; };
Depot_rom_state depot_rom_state { 32*1024*1024 }; Depot_rom_state cached_depot_rom_state { 24*1024*1024, 200 };
Depot_rom_state uncached_depot_rom_state { 8*1024*1024, 200 };
Attached_rom_dataspace _manual_deploy_rom { _env, "config -> deploy" }; Attached_rom_dataspace _manual_deploy_rom { _env, "config -> deploy" };

View File

@ -739,36 +739,43 @@ void Sculpt::Main::_handle_runtime_state()
/* upgrade ram_fs quota on demand */ /* upgrade ram_fs quota on demand */
state.for_each_sub_node("child", [&] (Xml_node child) { state.for_each_sub_node("child", [&] (Xml_node child) {
if (child.attribute_value("name", String<16>()) == "ram_fs") { if (child.attribute_value("name", String<16>()) != "ram_fs")
return;
if (child.has_sub_node("ram")
&& child.sub_node("ram").has_attribute("requested")) {
if (child.has_sub_node("ram") && child.sub_node("ram").has_attribute("requested")) {
_storage._ram_fs_state.ram_quota.value *= 2; _storage._ram_fs_state.ram_quota.value *= 2;
reconfigure_runtime = true; reconfigure_runtime = true;
generate_dialog(); generate_dialog();
} }
if (child.has_sub_node("caps") if (child.has_sub_node("caps") && child.sub_node("caps").has_attribute("requested")) {
&& child.sub_node("caps").has_attribute("requested")) {
_storage._ram_fs_state.cap_quota.value += 100; _storage._ram_fs_state.cap_quota.value += 100;
reconfigure_runtime = true; reconfigure_runtime = true;
generate_dialog(); generate_dialog();
} }
}
}); });
/* upgrade depot_rom quota on demand */ /* upgrade depot_rom quota on demand */
state.for_each_sub_node("child", [&] (Xml_node child) { state.for_each_sub_node("child", [&] (Xml_node child) {
if (child.attribute_value("name", String<16>()) == "depot_rom" auto upgrade_depot_rom = [&] (Deploy::Depot_rom_state &state, Start_name const &name)
&& child.has_sub_node("ram") {
&& child.sub_node("ram").has_attribute("requested")) { if (child.attribute_value("name", Start_name()) != name)
return;
_deploy.depot_rom_state.ram_quota.value *= 2; if (child.has_sub_node("ram") && child.sub_node("ram").has_attribute("requested")) {
state.ram_quota.value *= 2;
reconfigure_runtime = true; reconfigure_runtime = true;
} }
if (child.has_sub_node("caps") && child.sub_node("caps").has_attribute("requested")) {
state.cap_quota.value += 100;
reconfigure_runtime = true;
}
};
upgrade_depot_rom(_deploy.cached_depot_rom_state, "depot_rom");
upgrade_depot_rom(_deploy.uncached_depot_rom_state, "dynamic_depot_rom");
}); });
/* /*

View File

@ -47,7 +47,9 @@ namespace Sculpt {
void gen_fs_start_content(Xml_generator &, Storage_target const &, void gen_fs_start_content(Xml_generator &, Storage_target const &,
File_system::Type); File_system::Type);
void gen_fs_rom_start_content(Xml_generator &, Start_name const &, Start_name const &, Ram_quota); void gen_fs_rom_start_content(Xml_generator &, Start_name const &,
Start_name const &, Start_name const &,
Ram_quota, Cap_quota);
void gen_gpt_relabel_start_content(Xml_generator &, Storage_device const &); void gen_gpt_relabel_start_content(Xml_generator &, Storage_device const &);
void gen_gpt_expand_start_content (Xml_generator &, Storage_device const &); void gen_gpt_expand_start_content (Xml_generator &, Storage_device const &);

View File

@ -15,13 +15,14 @@
void Sculpt::gen_fs_rom_start_content(Xml_generator &xml, void Sculpt::gen_fs_rom_start_content(Xml_generator &xml,
Start_name const &name, Start_name const &name,
Start_name const &binary,
Start_name const &server, Start_name const &server,
Ram_quota ram_quota) Ram_quota ram_quota,
Cap_quota cap_quota)
{ {
gen_common_start_content(xml, name, gen_common_start_content(xml, name, cap_quota, ram_quota);
Cap_quota{200}, ram_quota);
gen_named_node(xml, "binary", "fs_rom"); gen_named_node(xml, "binary", binary);
xml.node("config", [&] () { }); xml.node("config", [&] () { });
@ -32,10 +33,11 @@ void Sculpt::gen_fs_rom_start_content(Xml_generator &xml,
gen_service_node<::File_system::Session>(xml, [&] () { gen_service_node<::File_system::Session>(xml, [&] () {
gen_named_node(xml, "child", server); }); gen_named_node(xml, "child", server); });
gen_parent_rom_route(xml, "fs_rom"); gen_parent_rom_route(xml, binary);
gen_parent_rom_route(xml, "ld.lib.so"); gen_parent_rom_route(xml, "ld.lib.so");
gen_parent_route<Cpu_session>(xml); gen_parent_route<Cpu_session>(xml);
gen_parent_route<Pd_session> (xml); gen_parent_route<Pd_session> (xml);
gen_parent_route<Log_session>(xml); gen_parent_route<Log_session>(xml);
gen_parent_route<Rm_session> (xml);
}); });
} }

View File

@ -21,6 +21,7 @@
#include <nitpicker_session/nitpicker_session.h> #include <nitpicker_session/nitpicker_session.h>
#include <usb_session/usb_session.h> #include <usb_session/usb_session.h>
#include <log_session/log_session.h> #include <log_session/log_session.h>
#include <rm_session/rm_session.h>
#include <timer_session/timer_session.h> #include <timer_session/timer_session.h>
#include <file_system_session/file_system_session.h> #include <file_system_session/file_system_session.h>
#include <report_session/report_session.h> #include <report_session/report_session.h>