1#!/usr/bin/env ruby 2 3# Copyright 2016 gRPC authors. 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16 17require_relative './end2end_common' 18 19Thread.abort_on_exception = true 20 21include GRPC::Core::ConnectivityStates 22 23def watch_state(ch, sleep_time) 24 thd = Thread.new do 25 state = ch.connectivity_state(false) 26 fail "non-idle state: #{state}" unless state == IDLE 27 ch.watch_connectivity_state(IDLE, Time.now + 360) 28 end 29 # sleep to get the thread into the middle of a 30 # "watch connectivity state" call 31 sleep sleep_time 32 thd.kill 33end 34 35def run_multiple_killed_watches(num_threads, sleep_time) 36 channels = [] 37 num_threads.times do 38 ch = GRPC::Core::Channel.new('dummy_host', 39 nil, :this_channel_is_insecure) 40 watch_state(ch, sleep_time) 41 channels << ch 42 end 43 44 # checking state should still be safe to call 45 channels.each do |c| 46 connectivity_state = c.connectivity_state(false) 47 # The state should be FATAL_FAILURE in the case that it was interrupted 48 # while watching connectivity state, and IDLE if it we never started 49 # watching the channel's connectivity state 50 unless [FATAL_FAILURE, IDLE].include?(connectivity_state) 51 fail "unexpected connectivity state: #{connectivity_state}" 52 end 53 end 54end 55 56def main 57 STDERR.puts '10 iterations, sleep 0.1 before killing thread' 58 run_multiple_killed_watches(10, 0.1) 59 STDERR.puts '1000 iterations, sleep 0.001 before killing thread' 60 run_multiple_killed_watches(1000, 0.001) 61end 62 63main 64