+17
-1
.gitignore
+17
-1
.gitignore
+1
.ocamlformat
+1
.ocamlformat
···
···
+54
.tangled/workflows/build.yml
+54
.tangled/workflows/build.yml
···
···+export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:$(nix build nixpkgs#gmp.dev --no-link --print-out-paths)/lib/pkgconfig"
+15
LICENSE.md
+15
LICENSE.md
···
···
+110
README.md
+110
README.md
···
···+Conpool is a connection pooling library built on Eio that manages TCP connection lifecycles, validates connection health, and provides per-endpoint resource limiting for any TCP-based protocol.+(* Create TLS configuration - SNI servername is automatically set to the endpoint's hostname *)
+8
-8
conpool.opam
+8
-8
conpool.opam
···"Conpool is a connection pooling library built on Eio.Pool that manages TCP connection lifecycles, validates connection health, and provides per-endpoint resource limiting for any TCP-based protocol (HTTP, Redis, PostgreSQL, etc.)"···
···"Conpool is a connection pooling library built on Eio.Pool that manages TCP connection lifecycles, validates connection health, and provides per-endpoint resource limiting for any TCP-based protocol (HTTP, Redis, PostgreSQL, etc.)"···
+11
-11
dune-project
+11
-11
dune-project
···(description "Conpool is a connection pooling library built on Eio.Pool that manages TCP connection lifecycles, validates connection health, and provides per-endpoint resource limiting for any TCP-based protocol (HTTP, Redis, PostgreSQL, etc.)")
···(description "Conpool is a connection pooling library built on Eio.Pool that manages TCP connection lifecycles, validates connection health, and provides per-endpoint resource limiting for any TCP-based protocol (HTTP, Redis, PostgreSQL, etc.)")
+30
-25
lib/cmd.ml
+30
-25
lib/cmd.ml
···
···
+20
-22
lib/cmd.mli
+20
-22
lib/cmd.mli
···
···
+42
-38
lib/config.ml
+42
-38
lib/config.ml
···············
···············
+24
-15
lib/config.mli
+24
-15
lib/config.mli
·········-@param connect_retry_delay Initial retry delay in seconds, with exponential backoff (default: 0.1)······-val health_check : t -> ([ `Close | `Flow | `R | `Shutdown | `W] Eio.Resource.t -> bool) option
···············
+17
-16
lib/connection.ml
+17
-16
lib/connection.ml
···-let src = Logs.Src.create "conpool.connection" ~doc:"Connection pool internal connection management"···
······
+345
-315
lib/conpool.ml
+345
-315
lib/conpool.ml
·········-let addrs = Eio.Net.getaddrinfo_stream pool.net (Endpoint.host endpoint) ~service:(string_of_int (Endpoint.port endpoint)) in-let rec create_connection_with_retry (pool : ('clock, 'net) internal) endpoint attempt last_error =···-raise (Pool_error (Connection_failed { endpoint; attempts = attempt; last_error = error_msg }))-raise (Pool_error (Connection_failed { endpoint; attempts = attempt; last_error = error_msg }))······-Log.debug (fun m -> m "Connection to %a failed validation, creating new one" Endpoint.pp endpoint);-let create ~sw ~(net : 'net Eio.Net.t) ~(clock : 'clock Eio.Time.clock) ?tls ?(config = Config.default) () : t =-Log.info (fun m -> m "Creating new connection pool (max_per_endpoint=%d, max_idle=%.1fs, max_lifetime=%.1fs)"···
·····················
+102
-63
lib/conpool.mli
+102
-63
lib/conpool.mli
·········
·········
+14
-16
lib/endpoint.ml
+14
-16
lib/endpoint.ml
···
···
+7
-3
lib/endpoint.mli
+7
-3
lib/endpoint.mli
······
+6
-6
lib/stats.ml
+6
-6
lib/stats.ml
······
+5
lib/stats.mli
+5
lib/stats.mli
···
-22
lib/tls_config.ml
-22
lib/tls_config.ml
···
···
-37
lib/tls_config.mli
-37
lib/tls_config.mli
···
···
+9
test/dune
+9
test/dune
+993
test/stress_test.ml
+993
test/stress_test.ml
···
···+let run_client ~clock ~test_start_time pool endpoints (cfg : config) latency_stats errors client_id =+run_client ~clock ~test_start_time:start_time pool endpoints cfg latency_stats errors client_id)+) { total_created = 0; total_reused = 0; total_closed = 0; active = 0; idle = 0; pool_errors = 0 } all_stats in+let test_names = String.concat ", " (List.map (fun r -> Printf.sprintf "\"%s\"" (js_escape r.test_name)) results) in+let throughputs = String.concat ", " (List.map (fun r -> Printf.sprintf "%.2f" r.throughput) results) in+let avg_latencies = String.concat ", " (List.map (fun r -> Printf.sprintf "%.2f" r.avg_latency) results) in+let hist_labels_str = String.concat ", " (List.map (fun s -> Printf.sprintf "\"%s\"" s) hist_labels) in+<div class="compact-metric"><span class="label">Servers:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Clients:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Msgs/Client:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Pool Size:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Total Msgs:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Duration:</span> <span class="value">%.2fs</span></div>+<div class="compact-metric highlight"><span class="label">Throughput:</span> <span class="value">%.0f/s</span></div>+<div class="compact-metric highlight"><span class="label">Avg Lat:</span> <span class="value">%.2fms</span></div>+<div class="compact-metric"><span class="label">Min Lat:</span> <span class="value">%.2fms</span></div>+<div class="compact-metric"><span class="label">Max Lat:</span> <span class="value">%.2fms</span></div>+<div class="compact-metric %s"><span class="label">Errors:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Conns Created:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Conns Reused:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Conns Closed:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Active:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Idle:</span> <span class="value">%d</span></div>+<div class="compact-metric"><span class="label">Reuse Rate:</span> <span class="value">%.1f%%%%</span></div>+("-s", Arg.Set_int num_servers, Printf.sprintf "Number of servers (default: %d)" default_config.num_servers);+("-c", Arg.Set_int num_clients, Printf.sprintf "Clients per server (default: %d)" default_config.num_clients);+("-m", Arg.Set_int messages_per_client, Printf.sprintf "Messages per client (default: %d)" default_config.messages_per_client);+("-p", Arg.Set_int max_parallel, Printf.sprintf "Max parallel clients (default: %d)" default_config.max_parallel_clients);+("-b", Arg.Set_int message_size, Printf.sprintf "Message size (default: %d)" default_config.message_size);+("-P", Arg.Set_int pool_size, Printf.sprintf "Pool size per endpoint (default: %d)" default_config.pool_size);+result.test_name result.total_messages result.throughput result.avg_latency result.total_errors+(extended_preset.num_servers * extended_preset.num_clients * extended_preset.messages_per_client);+result.test_name result.total_messages result.throughput result.avg_latency result.total_errors