From 332b4e6c3d5bc013d1f84de68a8ff3fe1749fba7 Mon Sep 17 00:00:00 2001 From: Lars Kroll Date: Thu, 15 Aug 2019 15:31:55 +0200 Subject: [PATCH 1/4] Fixed one test and made server always response with content-type:application/grpc --- examples/route_guide/server/route_guide_logging_middleware.erl | 2 +- src/grpc_server.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/route_guide/server/route_guide_logging_middleware.erl b/examples/route_guide/server/route_guide_logging_middleware.erl index a25e701..b2cd7ed 100644 --- a/examples/route_guide/server/route_guide_logging_middleware.erl +++ b/examples/route_guide/server/route_guide_logging_middleware.erl @@ -1,5 +1,5 @@ %% Middleware example that logs to disk --module(route_guide_middleware). +-module(route_guide_logging_middleware). -behaviour(cowboy_middleware). -export([execute/2]). diff --git a/src/grpc_server.erl b/src/grpc_server.erl index b09c21a..e2ab763 100644 --- a/src/grpc_server.erl +++ b/src/grpc_server.erl @@ -111,7 +111,7 @@ make_stream(#{headers := Headers, encoding => plain, compression => none, %% compression of the response messages start_time => erlang:system_time(1), - content_type => undefined, + content_type => <<"application/grpc">>, user_agent => undefined, timeout => infinity}, Headers). From 41972d3238289e2902391fb7c05fbe660029e029 Mon Sep 17 00:00:00 2001 From: Lars Kroll Date: Sun, 18 Aug 2019 12:22:29 +0200 Subject: [PATCH 2/4] Insert content-type into HTTP headers --- Makefile | 2 +- Makefile.bak | 53 +++++++++++++++++++++++++++++++++++++++++++++ src/grpc.app.src | 12 +++++----- src/grpc_server.erl | 10 ++++++--- 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 Makefile.bak diff --git a/Makefile b/Makefile index cbeec27..ed1d1f7 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ dep_grpc_lib = git https://github.com/Bluehouse-Technology/grpc_lib TEST_DEPS = grpc_client dep_grpc_client = git https://github.com/Bluehouse-Technology/grpc_client -include erlang.mk +include $(if $(ERLANG_MK_FILENAME),$(ERLANG_MK_FILENAME),erlang.mk) LOAD_TEST_NUM_WORKERS=200 LOAD_TEST_NUM_REQS_PER_WORKER=1000 diff --git a/Makefile.bak b/Makefile.bak new file mode 100644 index 0000000..ed1d1f7 --- /dev/null +++ b/Makefile.bak @@ -0,0 +1,53 @@ +PROJECT = grpc +PROJECT_DESCRIPTION = gRPC in Erlang +PROJECT_VERSION = 0.1.0 + +# Whitespace to be used when creating files from templates. +SP = 4 + +DEPS = cowboy grpc_lib +# Use the cowboy version that has support for trailers. +dep_cowboy_commit = master +dep_grpc_lib = git https://github.com/Bluehouse-Technology/grpc_lib + +TEST_DEPS = grpc_client +dep_grpc_client = git https://github.com/Bluehouse-Technology/grpc_client + +include $(if $(ERLANG_MK_FILENAME),$(ERLANG_MK_FILENAME),erlang.mk) + +LOAD_TEST_NUM_WORKERS=200 +LOAD_TEST_NUM_REQS_PER_WORKER=1000 + +grpc_load_test: test-deps start_test_server run_grpc_load_test stop_test_server +rpc_load_test: test-deps start_test_server run_rpc_load_test stop_test_server + +start_test_server: + @echo "Starting test server..." + @cd test && erlc run_load_test.erl && erlc statistics.erl && \ + erlc statistics_server.erl && cd .. + @erl -sname grpc_test_server@localhost -pa $(SHELL_PATHS) -pz test -s run_load_test start_grpc_server -detached + +stop_test_server: + @echo "Stopping test server..." + @erl -sname erpc_test_node_killer -noinput +B \ + -eval 'rpc:async_call(grpc_test_server@localhost, erlang, halt, []), timer:sleep(1000), erlang:halt().' + +run_grpc_load_test: + @echo "Starting grpc test client..." + @cd test && erlc run_load_test.erl && erlc statistics.erl && \ + erlc statistics_client.erl && cd .. + erl -sname grpc_test_client -pa $(SHELL_PATHS) -pz test -s run_load_test start_client -- \ + -num_workers ${LOAD_TEST_NUM_WORKERS} \ + -server localhost \ + -num_requests_per_worker ${LOAD_TEST_NUM_REQS_PER_WORKER} \ + -rpc_type grpc + +run_rpc_load_test: + @echo "Starting native rpc test client..." + @cd test && erlc run_load_test.erl && erlc statistics.erl && \ + erlc statistics_client.erl && cd .. + erl -sname grpc_test_client -pa $(SHELL_PATHS) -pz test -s run_load_test start_client -- \ + -num_workers ${LOAD_TEST_NUM_WORKERS} \ + -server grpc_test_server@localhost \ + -num_requests_per_worker ${LOAD_TEST_NUM_REQS_PER_WORKER} \ + -rpc_type native diff --git a/src/grpc.app.src b/src/grpc.app.src index 3a22150..f9c1f8d 100644 --- a/src/grpc.app.src +++ b/src/grpc.app.src @@ -1,7 +1,7 @@ {application,grpc, - [{description,"gRPC in Erlang"}, - {vsn,"0.2.0"}, - {modules,[]}, - {registered, []}, - {env, []}, - {applications,[gpb,cowboy]}]}. + [{description,"gRPC in Erlang"}, + {vsn,"0.2.0"}, + {modules,[]}, + {registered,[]}, + {env,[]}, + {applications,[gpb,cowboy]}]}. diff --git a/src/grpc_server.erl b/src/grpc_server.erl index e2ab763..619b536 100644 --- a/src/grpc_server.erl +++ b/src/grpc_server.erl @@ -95,7 +95,7 @@ make_stream(#{headers := Headers, scheme := Scheme, path := Path, method := Method} = Req) -> - maps:fold(fun process_header/3, + Processed = maps:fold(fun process_header/3, #{cowboy_req => Req, authority => Authority, scheme => Scheme, @@ -111,9 +111,13 @@ make_stream(#{headers := Headers, encoding => plain, compression => none, %% compression of the response messages start_time => erlang:system_time(1), - content_type => <<"application/grpc">>, + content_type => undefined, user_agent => undefined, - timeout => infinity}, Headers). + timeout => infinity}, Headers), + maps:update_with( + headers, + fun(Hdrs) -> maps:put(<<"content-type">>,maps:get(content_type, Processed), Hdrs) end, + Processed). process_header(<<"grpc-timeout">>, Value, Acc) -> Acc#{timeout => Value}; From ac134f818823e19165e06672021a82182034caeb Mon Sep 17 00:00:00 2001 From: Lars Kroll Date: Tue, 1 Oct 2019 20:13:21 +0200 Subject: [PATCH 3/4] Disable all HTTP timeouts --- src/grpc_server.erl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/grpc_server.erl b/src/grpc_server.erl index 619b536..4cc987d 100644 --- a/src/grpc_server.erl +++ b/src/grpc_server.erl @@ -56,10 +56,17 @@ start(Name, Transport, Port, Services, Options) -> #{auth_fun => AuthFun, services => Services}}]}]), ProtocolOpts = #{env => #{dispatch => Dispatch}, - %% inactivity_timeout => infinity, + inactivity_timeout => infinity, + idle_timeout => infinity, + preface_timeout => infinity, + settings_timeout => infinity, + shutdown_timeout => infinity, + linger_timeout => infinity, + request_timeout => infinity, stream_handlers => [grpc_stream_handler, cowboy_stream_h], middlewares => Middlewares}, + io:fwrite("Sending protocol options: ~p.~n", [ProtocolOpts]), case Transport of tcp -> cowboy:start_clear(Name, [{port, Port}], ProtocolOpts); From 614b8a1df26f2d2fc5d1beb055e1f32172b0d18d Mon Sep 17 00:00:00 2001 From: Lars Kroll Date: Tue, 1 Oct 2019 20:13:55 +0200 Subject: [PATCH 4/4] Remove option print --- src/grpc_server.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc_server.erl b/src/grpc_server.erl index 4cc987d..8e67008 100644 --- a/src/grpc_server.erl +++ b/src/grpc_server.erl @@ -66,7 +66,7 @@ start(Name, Transport, Port, Services, Options) -> stream_handlers => [grpc_stream_handler, cowboy_stream_h], middlewares => Middlewares}, - io:fwrite("Sending protocol options: ~p.~n", [ProtocolOpts]), + %io:fwrite("Sending protocol options: ~p.~n", [ProtocolOpts]), case Transport of tcp -> cowboy:start_clear(Name, [{port, Port}], ProtocolOpts);