diff --git a/c_src/Makefile.openbsd b/c_src/Makefile.openbsd index e67ec0c..7dd8882 100644 --- a/c_src/Makefile.openbsd +++ b/c_src/Makefile.openbsd @@ -25,6 +25,9 @@ all: erluv erluv_test liberluv.o: $(CC) $(INCLUDES) -c liberluv.c -o $@ +t! + $(CC) $(CFLAGS) $@.c -o $@ + erluv: liberluv.o $(CC) $(CFLAGS) liberluv.o $@.c -o $@ diff --git a/c_src/erluv.c b/c_src/erluv.c index 701d591..fe6cb5f 100644 --- a/c_src/erluv.c +++ b/c_src/erluv.c @@ -90,10 +90,6 @@ main(int argc, char *argv[]) { uv_loop_t *loop; create_loop(loop); - /* create a tcp structure and init it */ - uv_tcp_t server; - uv_tcp_init(loop, &server); - /* connect to erlang node */ ei_cnode ec; ei_connect_init(&ec, node_name, cookie, creation); @@ -103,9 +99,6 @@ main(int argc, char *argv[]) { if ((sockfd = ei_connect(&ec, node_target)) < 0) fprintf(stderr, "ERROR: ei_connect failed\n"); - /* open the tcp socket with */ - uv_tcp_open(&server, sockfd); - /* create an erlang pid erlang_pid pid; ei_make_pid(&ec, &pid); diff --git a/doc/using-libuv-with-erlang-c-node.md b/doc/using-libuv-with-erlang-c-node.md index 70e9f9e..0333297 100644 --- a/doc/using-libuv-with-erlang-c-node.md +++ b/doc/using-libuv-with-erlang-c-node.md @@ -159,7 +159,7 @@ Where we learn how to create a process. Where we learn how to create a worker pool. -## Merging Erlang C-node and libuv +## Merging Erlang C-node and libuv (first model) Where we merge Erlang, C-node and libuv together to make amazing things. @@ -232,6 +232,77 @@ orders, like creating a worker with defined arguments and environment but, it can also kill them or forward the content of the children to the dispatcher. +## Merging Erlang C-node and libuv (second model) + +```txt + __________________ + | | + | erluv process | + _________________ | ____________ | + | | | | | | / + | Erlang-node |<--+---->| erluv_main | | < privsep & fork + | _______ | | | |____________| | \ + | / \_ | | | _____||______ | + | ( process )\_ | | | | | | / + | \_______/ )\ | +---->| erluv_child | | < shared conn + | \_______/ ) | | |_____________| | \ + | \_______/ | | ____|___ | + | | |_ | |_ ____| / + |_________________| | worker | |_ < app workers + |________| | | \ + |________| | + |________| + +``` + + 1. Erlang-node spawn a c-node (with erlang-node user) or a c-node is + manually spawned by a user on the system (e.g. privileged or + unpriviliged one). + + 2. `erluv_main` start a connection to Erlang-node by using + credentials given by the user from configuration file, environment + variable or command line argument (e.g. node name, cookie...). + + 3. `erluv_main` fork and spawn a new `erluv_child` with privilege + separation. If start as root, application will fallback in + unprivileged user (e.g. nobody). Connection to Erlang-node is + shared to `erluv_child`. + + 4. By default, no worker is started. c-node is waiting for + instruction. + + 5. Erlang-node want to start a new worker and send a data-structure + containing argument, environment variables and other useful + information to spawn the worker. + + 6. The new worker is started and a process is started on the + erlang-node at the same time, linking them together. + + 7. `stdin`, `stdout` and `stderr` default file descriptors are shared + with a stream between the Erlang-node and `erluv_child`/worker. + + 8. When the worker die, a message is sent to the corresponding + process and can be restarted if desired. + + 9. If `erluv_child` crash, `erluv_main` send a message to the node + and wait an other to respawn a new child. all processes linking to + the worker also die. + + 10. If `erluv_main` does not receive a confirmation after + `DIE_TIMEOUT`, `erluv_main` die too. + +The c-node name is based on a prefix, by default `erluv_${random}`. + +Each c-node can share their information, like `node_name`, `cookie`, +`running` user but can't alter these information. + +By default, environment variable on each worker are not configured. + + +# Notes + + * multi-hidden note support + # Resources ## Libuv