update documentation

This commit is contained in:
niamtokik
2020-06-21 18:58:14 +00:00
parent 0b3e43d4c4
commit f68f54ddc8
3 changed files with 75 additions and 8 deletions

View File

@@ -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 $@

View File

@@ -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);

View File

@@ -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