Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
d68c55f
chore: added native http2 protocol support
Dec 8, 2025
abb9b71
feat: added thousand_island server adapter
Dec 8, 2025
cdd7294
feat: support thousand_island server adapter
Dec 8, 2025
64d4658
added elixir tools to .gitiignore
Dec 8, 2025
7bf5fe9
chore: start client supervisor in application
Dec 8, 2025
4ff718e
doc: remove supervisor
Dec 8, 2025
9fcb5ff
format
Dec 8, 2025
18e8727
chore: remove dead code
Dec 9, 2025
dfd43cc
Merge branch 'master' of https://github.com/elixir-grpc/grpc
Dec 10, 2025
e3b178a
Merge branch 'master' into feat/new-server-adapter
Dec 10, 2025
5ae1a34
refactor: move HTTP/2 modules to transport namespace
Dec 10, 2025
2b5979d
formatting
Dec 10, 2025
bfb5325
test: add comprehensive HTTP/2 test coverage for grpc_core
Dec 10, 2025
6533d44
test(grpc_core): add comprehensive HTTP/2 frame tests for gRPC scenarios
Dec 10, 2025
c0b0118
test(grpc_core): add comprehensive HTTP/2 frame tests for gRPC scenarios
Dec 10, 2025
c3acd04
fix(tests): resolve Elixir 1.18 deprecation warnings for Enum.slice/2
Dec 10, 2025
00fd46d
format
Dec 10, 2025
c6bb8d2
Merge branch 'feat/grpc-client-setup' into feat/new-server-adapter
Dec 10, 2025
62b9a27
fix(thousand_island): handle async response sending for stream lifecycle
Dec 10, 2025
f11e679
fix(grpc_server): ensure HEADERS sent before TRAILERS in error responses
Dec 11, 2025
7f23251
chore: remove comments, change log level, and some adjustments
Dec 11, 2025
1e4939f
ci: fix format check by using mix setup instead of mix deps.get
Dec 11, 2025
8361b0d
chore: some cleanup
Dec 11, 2025
e17c98c
Update grpc_client/lib/grpc/client/application.ex
sleipnir Dec 12, 2025
3704a97
Update .gitignore
sleipnir Dec 12, 2025
f4d410e
Update grpc_client/lib/grpc/client/application.ex
sleipnir Dec 12, 2025
86c5121
Merge branch 'master' into feat/grpc-client-setup
sleipnir Dec 12, 2025
5daf08a
remove bench application.ex
Dec 12, 2025
5202519
Merge branch 'feat/grpc-client-setup' of https://github.com/elixir-gr…
Dec 12, 2025
64f90ce
fix: remove client supervisor
Dec 12, 2025
a81fe1f
remove supervisor from tests
Dec 12, 2025
9fc0df2
Merge branch 'feat/grpc-client-setup' into feat/new-server-adapter
Dec 12, 2025
9dd320c
remove unused file
Dec 12, 2025
692e8db
Update benchmark/config/config.exs
sleipnir Dec 12, 2025
4e83b4a
Update benchmark/config/config.exs
sleipnir Dec 12, 2025
b2cc4f0
Merge branch 'master' into feat/new-server-adapter
sleipnir Dec 12, 2025
2a17054
Update grpc_server/lib/grpc/server/http2/dispatcher.ex
polvalente Dec 15, 2025
03a35bc
adjusts
Dec 15, 2025
9173cd7
Merge branch 'feat/new-server-adapter' of https://github.com/elixir-g…
Dec 15, 2025
8645901
remove unused file
Dec 15, 2025
c2aabfa
removed português
Dec 15, 2025
1a29fc1
fix: bid_stream integration test & run more than one adapter in run_s…
Dec 15, 2025
8f3e833
chore: better comment
Dec 15, 2025
b876a38
refactor: remove hexa notation
Dec 15, 2025
8a0d48d
ref: after review adjustments
Dec 15, 2025
0776ed4
ref: more defensive process model and error handling
Dec 15, 2025
0743550
ref: use merge instead of ++
Dec 15, 2025
8e3e5f2
Update grpc_server/lib/grpc/server/adapters/thousand_island.ex
sleipnir Dec 15, 2025
bd82f2f
Merge branch 'feat/new-server-adapter' of https://github.com/elixir-g…
Dec 15, 2025
7e0c672
Update grpc_server/lib/grpc/server/adapters/thousand_island.ex
sleipnir Dec 15, 2025
db33e85
Merge branch 'feat/new-server-adapter' of https://github.com/elixir-g…
Dec 15, 2025
1fb869b
tests: added map_errors integration tests
Dec 16, 2025
892b550
format
Dec 16, 2025
4862c36
review adjustments
Dec 16, 2025
7705e74
merge
Dec 16, 2025
1085584
Merge branch 'master' of https://github.com/elixir-grpc/grpc
Dec 16, 2025
ca80184
Merge branch 'master' into feat/new-server-adapter
Dec 16, 2025
180fdbd
format
Dec 16, 2025
91349ef
chore: create your own supervisor for Thousand Island.
Dec 17, 2025
c2f6135
remove dead code
Dec 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
path: deps
key: v1-${{ matrix.os }}-${{ matrix.otp }}-${{ matrix.elixir }}-mix-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }}
- name: Install Dependencies
run: mix deps.get 1>/dev/null
run: mix setup 1>/dev/null
- name: Check format
run: mix format --check-formatted
tests:
Expand Down
4 changes: 2 additions & 2 deletions benchmark/bin/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ server =
async_server_threads: 1,
port: 10000,
channel_args: [
Grpc.Testing.ChannelArg.new(
%Grpc.Testing.ChannelArg{
name: "grpc.optimization_target",
value: {:str_value, "latency"}
)
}
]
)

Expand Down
5 changes: 3 additions & 2 deletions benchmark/config/config.exs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Config

config :logger, level: :info
# Reduce logging overhead by default for better performance
config :logger, level: :error

import_config "#{Mix.env()}.exs"
import_config "#{config_env()}.exs"
27 changes: 22 additions & 5 deletions benchmark/lib/benchmark/server_manager.ex
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
defmodule Benchmark.ServerManager do
def start_server(%Grpc.Testing.ServerConfig{} = config) do
def start_server(%Grpc.Testing.ServerConfig{} = config, opts \\ []) do
# get security
payload_type = Benchmark.Manager.payload_type(config.payload_config)
start_server(payload_type, config)
start_server(payload_type, config, opts)
end

def start_server(:protobuf, config) do
def start_server(:protobuf, config, opts) do
cores = Benchmark.Manager.set_cores(config.core_limit)
{:ok, pid, port} = GRPC.Server.start(Grpc.Testing.BenchmarkService.Server, config.port)

# Extract adapter option, default to Cowboy
adapter = Keyword.get(opts, :adapter, GRPC.Server.Adapters.Cowboy)
adapter_name = adapter |> Module.split() |> List.last()

IO.puts("Starting server with #{adapter_name} adapter on port #{config.port}...")

{:ok, pid, port} =
GRPC.Server.start(
Grpc.Testing.BenchmarkService.Server,
config.port,
adapter: adapter
)

%Benchmark.Server{
cores: cores,
Expand All @@ -18,5 +30,10 @@ defmodule Benchmark.ServerManager do
}
end

def start_server(_, _), do: raise(GRPC.RPCError, status: :unimplemented)
def start_server(_, _, _), do: raise(GRPC.RPCError, status: :unimplemented)

def stop_server(%Benchmark.Server{} = _server, opts \\ []) do
adapter = Keyword.get(opts, :adapter, GRPC.Server.Adapters.Cowboy)
GRPC.Server.stop(Grpc.Testing.BenchmarkService.Server, adapter: adapter)
end
end
12 changes: 6 additions & 6 deletions benchmark/lib/grpc/worker_server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,19 @@ defmodule Grpc.Testing.WorkerService.Server do
{server, stats} = Benchmark.Server.get_stats(server)

status =
Grpc.Testing.ServerStatus.new(
%Grpc.Testing.ServerStatus{
stats: stats,
port: server.port,
cores: server.cores
)
}

{server, status}

{:mark, mark} ->
{server, stats} = Benchmark.Server.get_stats(server, mark)

status =
Grpc.Testing.ServerStatus.new(cores: server.cores, port: server.port, stats: stats)
%Grpc.Testing.ServerStatus{cores: server.cores, port: server.port, stats: stats}

{server, status}
end
Expand All @@ -53,11 +53,11 @@ defmodule Grpc.Testing.WorkerService.Server do
case args.argtype do
{:setup, client_config} ->
manager = ClientManager.start_client(client_config)
{Grpc.Testing.ClientStatus.new(), manager}
{%Grpc.Testing.ClientStatus{}, manager}

{:mark, mark} ->
stats = ClientManager.get_stats(manager, mark.reset)
{Grpc.Testing.ClientStatus.new(stats: stats), manager}
{%Grpc.Testing.ClientStatus{stats: stats}, manager}
end

Logger.debug("Client send reply #{inspect(status)}")
Expand All @@ -70,6 +70,6 @@ defmodule Grpc.Testing.WorkerService.Server do
Logger.debug("Received quit_work")
Logger.debug(inspect(stream.local[:main_pid]))
send(stream.local[:main_pid], {:quit, self()})
Grpc.Testing.Void.new()
%Grpc.Testing.Void{}
end
end
41 changes: 31 additions & 10 deletions benchmark/lib/mix/tasks/benchmark.test.ex
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
defmodule Mix.Tasks.Benchmark.Test do
@moduledoc """
Runs a simple gRPC benchmark test.

This task starts a benchmark server and client, runs performance tests,
and reports statistics.

## Usage

mix benchmark.test

mix benchmark.test --adapter=thousand_island
mix benchmark.test --adapter=cowboy

## Options

* `--port` - Server port (default: 10000)
* `--requests` - Number of requests to send (default: 1000)

* `--adapter` - Server adapter: cowboy or thousand_island (default: cowboy)

"""
use Mix.Task

Expand All @@ -27,13 +30,27 @@ defmodule Mix.Tasks.Benchmark.Test do

{parsed, _remaining, _invalid} =
OptionParser.parse(args,
strict: [port: :integer, requests: :integer]
strict: [port: :integer, requests: :integer, adapter: :string]
)

port = Keyword.get(parsed, :port, 10000)
num_requests = Keyword.get(parsed, :requests, 1000)
adapter_name = Keyword.get(parsed, :adapter, "cowboy")

adapter =
case String.downcase(adapter_name) do
"thousand_island" ->
GRPC.Server.Adapters.ThousandIsland

"cowboy" ->
GRPC.Server.Adapters.Cowboy

Logger.info("Starting benchmark test on port #{port}")
_ ->
Logger.error("Unknown adapter: #{adapter_name}. Using Cowboy.")
GRPC.Server.Adapters.Cowboy
end

Logger.info("Starting benchmark test on port #{port} with #{adapter_name} adapter")

# Configure and start server
server = %Grpc.Testing.ServerConfig{
Expand All @@ -48,7 +65,7 @@ defmodule Mix.Tasks.Benchmark.Test do
}

Logger.info("Starting server...")
server = Benchmark.ServerManager.start_server(server)
server = Benchmark.ServerManager.start_server(server, adapter: adapter)
Logger.info("Server started: #{inspect(server)}")

# Configure client
Expand Down Expand Up @@ -98,7 +115,7 @@ defmodule Mix.Tasks.Benchmark.Test do
# Connect and warm up
Logger.info("Connecting to server...")
{:ok, ch} = GRPC.Stub.connect("localhost:#{port}")

Logger.info("Warming up...")
Grpc.Testing.BenchmarkService.Stub.unary_call(ch, req)

Expand Down Expand Up @@ -132,6 +149,10 @@ defmodule Mix.Tasks.Benchmark.Test do
IO.inspect(stats, label: "Stats", pretty: true)
Logger.info("=" |> String.duplicate(60))

# Clean shutdown
Logger.info("Stopping server...")
Benchmark.ServerManager.stop_server(server, adapter: adapter)
Logger.info("Server stopped")
:ok
end
end
10 changes: 5 additions & 5 deletions benchmark/lib/mix/tasks/benchmark.worker.ex
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
defmodule Mix.Tasks.Benchmark.Worker do
@moduledoc """
Starts a gRPC worker server for benchmarking.

## Usage

mix benchmark.worker --port=10000

## Options

* `--port` - Port to listen on (required)

"""
use Mix.Task

Expand Down
1 change: 1 addition & 0 deletions benchmark/mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
"protobuf": {:hex, :protobuf, "0.15.0", "c9fc1e9fc1682b05c601df536d5ff21877b55e2023e0466a3855cc1273b74dcb", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "5d7bb325319db1d668838d2691c31c7b793c34111aec87d5ee467a39dac6e051"},
"ranch": {:hex, :ranch, "2.2.0", "25528f82bc8d7c6152c57666ca99ec716510fe0925cb188172f41ce93117b1b0", [:make, :rebar3], [], "hexpm", "fa0b99a1780c80218a4197a59ea8d3bdae32fbff7e88527d7d8a4787eff4f8e7"},
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
"thousand_island": {:hex, :thousand_island, "1.4.2", "735fa783005d1703359bbd2d3a5a3a398075ba4456e5afe3c5b7cf4666303d36", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1c7637f16558fc1c35746d5ee0e83b18b8e59e18d28affd1f2fa1645f8bc7473"},
}
1 change: 0 additions & 1 deletion benchmark/test/benchmark_test.exs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
defmodule BenchmarkgTest do
use ExUnit.Case
doctest Benchmark

end
1 change: 1 addition & 0 deletions grpc_client/mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@
"protobuf": {:hex, :protobuf, "0.15.0", "c9fc1e9fc1682b05c601df536d5ff21877b55e2023e0466a3855cc1273b74dcb", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "5d7bb325319db1d668838d2691c31c7b793c34111aec87d5ee467a39dac6e051"},
"ranch": {:hex, :ranch, "2.2.0", "25528f82bc8d7c6152c57666ca99ec716510fe0925cb188172f41ce93117b1b0", [:make, :rebar3], [], "hexpm", "fa0b99a1780c80218a4197a59ea8d3bdae32fbff7e88527d7d8a4787eff4f8e7"},
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
"thousand_island": {:hex, :thousand_island, "1.4.2", "735fa783005d1703359bbd2d3a5a3a398075ba4456e5afe3c5b7cf4666303d36", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1c7637f16558fc1c35746d5ee0e83b18b8e59e18d28affd1f2fa1645f8bc7473"},
}
Loading
Loading