this repo has no description
1open Swim.Types
2
3external env_cast : 'a -> 'b = "%identity"
4
5let () =
6 Eio_main.run @@ fun env ->
7 let env = env_cast env in
8 Eio.Switch.run @@ fun sw ->
9 let config =
10 {
11 default_config with
12 bind_addr = "\127\000\000\001";
13 bind_port = 7947;
14 node_name = Some "ocaml-node";
15 protocol_interval = 1.0;
16 probe_timeout = 0.5;
17 secret_key = String.make 16 '\x00';
18 cluster_name = "";
19 (* Empty for memberlist compatibility - it uses Label instead *)
20 encryption_enabled = false;
21 }
22 in
23 let env_wrap = { stdenv = env; sw } in
24 match Swim.Cluster.create ~sw ~env:env_wrap ~config with
25 | Error `Invalid_key ->
26 Printf.eprintf "Error: Invalid encryption key\n";
27 exit 1
28 | Ok cluster ->
29 Printf.printf "OCaml SWIM node started on 127.0.0.1:%d\n%!"
30 config.bind_port;
31 Swim.Cluster.start cluster;
32
33 let go_node =
34 make_node_info
35 ~id:(node_id_of_string "go-node")
36 ~addr:(`Udp (Eio.Net.Ipaddr.of_raw "\127\000\000\001", 7946))
37 ~meta:""
38 in
39 Printf.printf "Adding Go node to membership...\n%!";
40 Swim.Cluster.add_member cluster go_node;
41
42 Printf.printf "Running for 30 seconds...\n%!";
43 for i = 1 to 30 do
44 Eio.Time.sleep env#clock 1.0;
45 let stats = Swim.Cluster.stats cluster in
46 Printf.printf
47 "[%2d] alive=%d suspect=%d dead=%d sent=%d recv=%d dropped=%d\n%!" i
48 stats.nodes_alive stats.nodes_suspect stats.nodes_dead stats.msgs_sent
49 stats.msgs_received stats.msgs_dropped
50 done;
51
52 Printf.printf "Shutting down...\n%!";
53 Swim.Cluster.shutdown cluster