From 9836bc029690864e4e2c82410ea9e706e537c986 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 24 Feb 2019 11:13:28 +0100 Subject: [PATCH] add prepare state --- common | 2 +- include/villas/super_node.hpp | 4 ++ lib/node.c | 4 +- lib/path.c | 4 +- lib/super_node.cpp | 75 +++++++++++++++++++++++++---------- src/villas-node.cpp | 1 + 6 files changed, 66 insertions(+), 24 deletions(-) diff --git a/common b/common index 0c35a58b7..3a4beccee 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 0c35a58b79b00726d13675b7a6231dd35bf62a20 +Subproject commit 3a4beccee89f42a85b175b5557205d9ab756bfb5 diff --git a/include/villas/super_node.hpp b/include/villas/super_node.hpp index 805832d74..de484788f 100644 --- a/include/villas/super_node.hpp +++ b/include/villas/super_node.hpp @@ -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(); diff --git a/lib/node.c b/lib/node.c index c08043198..5c6c7a838 100644 --- a/lib/node.c +++ b/lib/node.c @@ -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)); diff --git a/lib/path.c b/lib/path.c index 7db489b25..22b12f4c5 100644 --- a/lib/path.c +++ b/lib/path.c @@ -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; diff --git a/lib/super_node.cpp b/lib/super_node.cpp index 0eba7eb04..f4780ec1e 100644 --- a/lib/super_node.cpp +++ b/lib/super_node.cpp @@ -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; diff --git a/src/villas-node.cpp b/src/villas-node.cpp index 91568425f..5c5a14e8e 100644 --- a/src/villas-node.cpp +++ b/src/villas-node.cpp @@ -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();