From b804ce974a75a2d32fe186f6abdc3493eb851ee4 Mon Sep 17 00:00:00 2001
From: Neeraj Kashyap <nkashy1@gmail.com>
Date: Mon, 26 Aug 2019 08:43:46 -0700
Subject: [PATCH 1/3] Implemented _abort method on ServicerContext

This acquires a lock from the _condition member of the context's _rpc
and then aborts the _rpc directly
---
 .../grpcio_testing/grpc_testing/_server/_servicer_context.py   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py b/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
index 63a1b1aec95..0f9c4ed4b00 100644
--- a/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
+++ b/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
@@ -74,7 +74,8 @@ class ServicerContext(grpc.ServicerContext):
             _common.fuss_with_metadata(trailing_metadata))
 
     def abort(self, code, details):
-        raise NotImplementedError()
+        self._rpc._condition.acquire()
+        self._rpc._abort(code, details)
 
     def abort_with_status(self, status):
         raise NotImplementedError()

From 1ab9225dcef223610cd4992482363bd927f41a5c Mon Sep 17 00:00:00 2001
From: Neeraj Kashyap <nkashy1@gmail.com>
Date: Mon, 26 Aug 2019 10:57:35 -0700
Subject: [PATCH 2/3] Release the lock on the RPC object condition

---
 .../grpcio_testing/grpc_testing/_server/_servicer_context.py     | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py b/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
index 0f9c4ed4b00..b1277fa4a42 100644
--- a/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
+++ b/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
@@ -76,6 +76,7 @@ class ServicerContext(grpc.ServicerContext):
     def abort(self, code, details):
         self._rpc._condition.acquire()
         self._rpc._abort(code, details)
+        self._rpc._condition.release()
 
     def abort_with_status(self, status):
         raise NotImplementedError()

From 5c173084f8af589a1bad3ba44cabedb1c781470b Mon Sep 17 00:00:00 2001
From: Neeraj Kashyap <nkashy1@gmail.com>
Date: Mon, 26 Aug 2019 11:07:58 -0700
Subject: [PATCH 3/3] condition acquire and release with context manager

Was previously unfamiliar with the contex manager wrapper around
threading primitives.
---
 .../grpcio_testing/grpc_testing/_server/_servicer_context.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py b/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
index b1277fa4a42..6fa8c6b3ba8 100644
--- a/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
+++ b/src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py
@@ -74,9 +74,8 @@ class ServicerContext(grpc.ServicerContext):
             _common.fuss_with_metadata(trailing_metadata))
 
     def abort(self, code, details):
-        self._rpc._condition.acquire()
-        self._rpc._abort(code, details)
-        self._rpc._condition.release()
+        with self._rpc._condition:
+            self._rpc._abort(code, details)
 
     def abort_with_status(self, status):
         raise NotImplementedError()