The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.0 KiB
64 lines
2.0 KiB
#!/usr/bin/env ruby |
|
|
|
# Copyright 2016 gRPC authors. |
|
# |
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
# you may not use this file except in compliance with the License. |
|
# You may obtain a copy of the License at |
|
# |
|
# http://www.apache.org/licenses/LICENSE-2.0 |
|
# |
|
# Unless required by applicable law or agreed to in writing, software |
|
# distributed under the License is distributed on an "AS IS" BASIS, |
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
# See the License for the specific language governing permissions and |
|
# limitations under the License. |
|
|
|
# make sure that the client doesn't hang when channel is closed |
|
# explicitly while it's used |
|
|
|
require_relative './end2end_common' |
|
|
|
def main |
|
STDERR.puts 'start server' |
|
server_runner = ServerRunner.new(EchoServerImpl) |
|
server_port = server_runner.run |
|
STDERR.puts 'start client' |
|
control_stub, client_pid = start_client('channel_closing_client.rb', |
|
server_port) |
|
# sleep to allow time for the client to get into |
|
# the middle of a "watch connectivity state" call |
|
sleep 3 |
|
|
|
begin |
|
Timeout.timeout(20) do |
|
loop do |
|
begin |
|
control_stub.shutdown(ClientControl::Void.new) |
|
break |
|
rescue GRPC::BadStatus => e |
|
STDERR.puts "control_stub.shutdown RPC received error:|#{e}|. " \ |
|
"This could mean that that child process e.g. isn't running yet, " \ |
|
"so we'll retry the RPC" |
|
end |
|
end |
|
Process.wait(client_pid) |
|
end |
|
rescue Timeout::Error |
|
STDERR.puts "timeout wait for client pid #{client_pid}" |
|
Process.kill('SIGKILL', client_pid) |
|
Process.wait(client_pid) |
|
STDERR.puts 'killed client child' |
|
raise 'Timed out waiting for client process. It likely hangs when a ' \ |
|
'channel is closed while connectivity is watched' |
|
end |
|
|
|
client_exit_code = $CHILD_STATUS |
|
if client_exit_code != 0 |
|
fail "channel closing client failed, exit code #{client_exit_code}" |
|
end |
|
|
|
server_runner.stop |
|
end |
|
|
|
main
|
|
|