1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

add prepare state

This commit is contained in:
Steffen Vogel 2019-02-24 11:13:28 +01:00
parent 842be5a9cc
commit 9836bc0296
6 changed files with 66 additions and 24 deletions

2
common

@ -1 +1 @@
Subproject commit 0c35a58b79b00726d13675b7a6231dd35bf62a20
Subproject commit 3a4beccee89f42a85b175b5557205d9ab756bfb5

View file

@ -88,10 +88,14 @@ public:
int check();
/** Initialize after parsing the configuration file. */
void prepare();
void start();
void stop();
void run();
void preparePaths();
void prepareNodes();
void startPaths();
void startNodes();
void startNodeTypes();

View file

@ -98,6 +98,8 @@ int node_prepare(struct node *n)
if (ret)
return ret;
n->state = STATE_PREPARED;
return 0;
}
@ -220,7 +222,7 @@ int node_start(struct node *n)
{
int ret;
assert(n->state == STATE_CHECKED);
assert(n->state == STATE_PREPARED);
assert(node_type(n)->state == STATE_STARTED);
info("Starting node %s", node_name_long(n));

View file

@ -287,6 +287,8 @@ int path_prepare(struct path *p)
return ret;
}
p->state = STATE_PREPARED;
return 0;
}
@ -528,7 +530,7 @@ int path_start(struct path *p)
int ret;
char *mode, *mask;
assert(p->state == STATE_CHECKED);
assert(p->state == STATE_PREPARED);
switch (p->mode) {
case PATH_MODE_ANY: mode = "any"; break;

View file

@ -356,18 +356,12 @@ void SuperNode::startNodes()
for (size_t i = 0; i < vlist_length(&nodes); i++) {
auto *n = (struct node *) vlist_at(&nodes, i);
ret = node_prepare(n);
if (ret)
throw RuntimeError("Failed to prepare node: {}", node_name(n));
if (!node_is_enabled(n))
continue;
int refs = vlist_count(&paths, (cmp_cb_t) path_uses_node, n);
if (refs > 0) {
ret = node_start(n);
if (ret)
throw RuntimeError("Failed to start node: {}", node_name(n));
}
else
logger->warn("No path is using the node {}. Skipping...", node_name(n));
ret = node_start(n);
if (ret)
throw RuntimeError("Failed to start node: {}", node_name(n));
}
}
@ -378,20 +372,59 @@ void SuperNode::startPaths()
for (size_t i = 0; i < vlist_length(&paths); i++) {
auto *p = (struct path *) vlist_at(&paths, i);
if (p->enabled) {
ret = path_prepare(p);
if (ret)
throw RuntimeError("Failed to prepare path: {}", path_name(p));
if (!path_is_enabled(p))
continue;
ret = path_start(p);
if (ret)
throw RuntimeError("Failed to start path: {}", path_name(p));
}
else
logger->warn("Path {} is disabled. Skipping...", path_name(p));
ret = path_start(p);
if (ret)
throw RuntimeError("Failed to start path: {}", path_name(p));
}
}
void SuperNode::prepareNodes()
{
int ret, refs;
for (size_t i = 0; i < vlist_length(&nodes); i++) {
auto *n = (struct node *) vlist_at(&nodes, i);
refs = vlist_count(&paths, (cmp_cb_t) path_uses_node, n);
if (refs <= 0) {
logger->warn("No path is using the node {}. Skipping...", node_name(n));
n->enabled = false;
}
if (!node_is_enabled(n))
continue;
ret = node_prepare(n);
if (ret)
throw RuntimeError("Failed to prepare node: {}", node_name(n));
}
}
void SuperNode::preparePaths()
{
int ret;
for (size_t i = 0; i < vlist_length(&paths); i++) {
auto *p = (struct path *) vlist_at(&paths, i);
if (!path_is_enabled(p))
continue;
ret = path_prepare(p);
if (ret)
throw RuntimeError("Failed to prepare path: {}", path_name(p));
}
}
void SuperNode::prepare()
{
prepareNodes();
preparePaths();
}
void SuperNode::start()
{
int ret;

View file

@ -184,6 +184,7 @@ int main(int argc, char *argv[])
if (ret)
throw RuntimeError("Failed to verify configuration");
sn.prepare();
sn.start();
sn.run();
sn.stop();