diff --git a/src/ruby/end2end/channel_closing_driver.rb b/src/ruby/end2end/channel_closing_driver.rb
index 43e2fe8cbbdcefbf360e174565afca5cecfa59df..d3e5373b0bb0e4724269d32353e98258d961db08 100755
--- a/src/ruby/end2end/channel_closing_driver.rb
+++ b/src/ruby/end2end/channel_closing_driver.rb
@@ -36,7 +36,7 @@ require_relative './end2end_common'
 
 def main
   STDERR.puts 'start server'
-  server_runner = ServerRunner.new
+  server_runner = ServerRunner.new(EchoServerImpl)
   server_port = server_runner.run
 
   sleep 1
diff --git a/src/ruby/end2end/channel_state_driver.rb b/src/ruby/end2end/channel_state_driver.rb
index c3184bf939259262f1af3946afb4a0a4850b5282..80fb62899e5aa59f99154ced8906cc5353ffc8ee 100755
--- a/src/ruby/end2end/channel_state_driver.rb
+++ b/src/ruby/end2end/channel_state_driver.rb
@@ -35,7 +35,7 @@ require_relative './end2end_common'
 
 def main
   STDERR.puts 'start server'
-  server_runner = ServerRunner.new
+  server_runner = ServerRunner.new(EchoServerImpl)
   server_port = server_runner.run
 
   sleep 1
diff --git a/src/ruby/end2end/end2end_common.rb b/src/ruby/end2end/end2end_common.rb
index 9534bb207875e4180ff17ec18bf2b26ece8b60a4..1c87ceddf1df77e12c974c469b38952b34cddff1 100755
--- a/src/ruby/end2end/end2end_common.rb
+++ b/src/ruby/end2end/end2end_common.rb
@@ -55,13 +55,14 @@ end
 
 # ServerRunner starts an "echo server" that test clients can make calls to
 class ServerRunner
-  def initialize
+  def initialize(service_impl)
+    @service_impl = service_impl
   end
 
   def run
     @srv = GRPC::RpcServer.new
     port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
-    @srv.handle(EchoServerImpl)
+    @srv.handle(@service_impl)
 
     @thd = Thread.new do
       @srv.run
diff --git a/src/ruby/end2end/killed_client_thread_client.rb b/src/ruby/end2end/killed_client_thread_client.rb
index 9a69161736e06aa55b7c50e9dca8e174d2f4de4a..d5a7db7d5866998ada4b4906e3659afb42b70389 100755
--- a/src/ruby/end2end/killed_client_thread_client.rb
+++ b/src/ruby/end2end/killed_client_thread_client.rb
@@ -29,6 +29,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+# Attempt to reproduce
+# https://github.com/GoogleCloudPlatform/google-cloud-ruby/issues/1327
+
 require_relative './end2end_common'
 
 def main
@@ -46,7 +49,7 @@ def main
     stub = Echo::EchoServer::Stub.new("localhost:#{server_port}",
                                       :this_channel_is_insecure)
     stub.echo(Echo::EchoRequest.new(request: 'hello'))
-    raise 'the clients rpc in this test shouldnt complete. ' \
+    fail 'the clients rpc in this test shouldnt complete. ' \
       'expecting SIGINT to happen in the middle of the call'
   end
   thd.join
diff --git a/src/ruby/end2end/killed_client_thread_driver.rb b/src/ruby/end2end/killed_client_thread_driver.rb
index 71d5db276dfb1d0db216d11a2744356177420578..2963a287c59aee643b6ba00ab2f342321dfd11b3 100755
--- a/src/ruby/end2end/killed_client_thread_driver.rb
+++ b/src/ruby/end2end/killed_client_thread_driver.rb
@@ -31,12 +31,15 @@
 
 require_relative './end2end_common'
 
+# Service that sleeps for a long time upon receiving an 'echo request'
+# Also, this notified @call_started_cv once it has received a request.
 class SleepingEchoServerImpl < Echo::EchoServer::Service
   def initialize(call_started, call_started_mu, call_started_cv)
     @call_started = call_started
     @call_started_mu = call_started_mu
     @call_started_cv = call_started_cv
   end
+
   def echo(echo_req, _)
     @call_started_mu.synchronize do
       @call_started.set_true
@@ -47,43 +50,19 @@ class SleepingEchoServerImpl < Echo::EchoServer::Service
   end
 end
 
-class SleepingServerRunner
-  def initialize(service_impl)
-    @service_impl = service_impl
-  end
-
-  def run
-    @srv = GRPC::RpcServer.new
-    port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
-    @srv.handle(@service_impl)
-
-    @thd = Thread.new do
-      @srv.run
-    end
-    @srv.wait_till_running
-    port
-  end
-
-  def stop
-    @srv.stop
-    @thd.join
-    fail 'server not stopped' unless @srv.stopped?
-  end
-end
-
+# Mutable boolean
 class BoolHolder
+  attr_reader :val
+
   def init
     @val = false
   end
+
   def set_true
     @val = true
   end
-  def get_val
-    @val
-  end
 end
 
-
 def main
   STDERR.puts 'start server'
 
@@ -91,20 +70,22 @@ def main
   call_started_mu = Mutex.new
   call_started_cv = ConditionVariable.new
 
-  service_impl = SleepingEchoServerImpl.new(call_started, call_started_mu, call_started_cv)
-  server_runner = SleepingServerRunner.new(service_impl)
+  service_impl = SleepingEchoServerImpl.new(call_started,
+                                            call_started_mu,
+                                            call_started_cv)
+  server_runner = ServerRunner.new(service_impl)
   server_port = server_runner.run
 
   STDERR.puts 'start client'
   _, client_pid = start_client('killed_client_thread_client.rb',
-                                          server_port)
+                               server_port)
 
   call_started_mu.synchronize do
-    while !call_started.get_val do
-      call_started_cv.wait(call_started_mu)
-    end
+    call_started_cv.wait(call_started_mu) until call_started.val
   end
 
+  # SIGINT the child process not that it's
+  # in the middle of an RPC (happening on a non-main thread)
   Process.kill('SIGINT', client_pid)
   STDERR.puts 'sent shutdown'
 
@@ -117,13 +98,14 @@ def main
     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 ' \
-      'killed while in the middle of an rpc'
+    raise 'Timed out waiting for client process. ' \
+      'It likely hangs when killed while in the middle of an rpc'
   end
 
   client_exit_code = $CHILD_STATUS
   if client_exit_code.termsig != 2 # SIGINT
-    fail "expected client exit from SIGINT but got child status: #{client_exit_code}"
+    fail 'expected client exit from SIGINT ' \
+      "but got child status: #{client_exit_code}"
   end
 
   server_runner.stop
diff --git a/src/ruby/end2end/sig_handling_driver.rb b/src/ruby/end2end/sig_handling_driver.rb
index c5d46e074cb719cdd9793bf25bf9b315343d5ab2..6691464dc69a50bff29502d0ee60a5d20aa76681 100755
--- a/src/ruby/end2end/sig_handling_driver.rb
+++ b/src/ruby/end2end/sig_handling_driver.rb
@@ -36,7 +36,7 @@ require_relative './end2end_common'
 
 def main
   STDERR.puts 'start server'
-  server_runner = ServerRunner.new
+  server_runner = ServerRunner.new(EchoServerImpl)
   server_port = server_runner.run
 
   sleep 1
diff --git a/src/ruby/end2end/sig_int_during_channel_watch_driver.rb b/src/ruby/end2end/sig_int_during_channel_watch_driver.rb
index 84d039bf19da574cd8a65bc7050cd066d9b50a8c..670cda0919f869ac468f78f93e5317b948fcc64a 100755
--- a/src/ruby/end2end/sig_int_during_channel_watch_driver.rb
+++ b/src/ruby/end2end/sig_int_during_channel_watch_driver.rb
@@ -36,7 +36,7 @@ require_relative './end2end_common'
 
 def main
   STDERR.puts 'start server'
-  server_runner = ServerRunner.new
+  server_runner = ServerRunner.new(EchoServerImpl)
   server_port = server_runner.run
 
   sleep 1
diff --git a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh
index d7da6364d8f72ac8b43992d266ee7760ff97f896..92d6975707389a3352ed677f319144c398504558 100755
--- a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh
+++ b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh
@@ -38,4 +38,5 @@ ruby src/ruby/end2end/sig_handling_driver.rb || EXIT_CODE=1
 ruby src/ruby/end2end/channel_state_driver.rb || EXIT_CODE=1
 ruby src/ruby/end2end/channel_closing_driver.rb || EXIT_CODE=1
 ruby src/ruby/end2end/sig_int_during_channel_watch_driver.rb || EXIT_CODE=1
+ruby src/ruby/end2end/killed_client_thread_driver.rb || EXIT_CODE=1
 exit $EXIT_CODE