|
|
|
@ -20,6 +20,7 @@ import time |
|
|
|
|
import logging |
|
|
|
|
|
|
|
|
|
import grpc |
|
|
|
|
from tests.unit import test_common |
|
|
|
|
|
|
|
|
|
from concurrent import futures |
|
|
|
|
from six.moves import queue |
|
|
|
@ -36,37 +37,24 @@ SERVER_FORK_CAN_EXIT = 'server_fork_can_exit' |
|
|
|
|
FORK_EXIT = '/test/ForkExit' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ForkExitHandler(object): |
|
|
|
|
|
|
|
|
|
def unary_unary(self, request, servicer_context): |
|
|
|
|
pid = os.fork() |
|
|
|
|
if pid == 0: |
|
|
|
|
os._exit(0) |
|
|
|
|
return RESPONSE |
|
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
|
self.request_streaming = None |
|
|
|
|
self.response_streaming = None |
|
|
|
|
self.request_deserializer = None |
|
|
|
|
self.response_serializer = None |
|
|
|
|
self.unary_stream = None |
|
|
|
|
self.stream_unary = None |
|
|
|
|
self.stream_stream = None |
|
|
|
|
def fork_and_exit(request, servicer_context): |
|
|
|
|
pid = os.fork() |
|
|
|
|
if pid == 0: |
|
|
|
|
os._exit(0) |
|
|
|
|
return RESPONSE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GenericHandler(grpc.GenericRpcHandler): |
|
|
|
|
|
|
|
|
|
def service(self, handler_call_details): |
|
|
|
|
if handler_call_details.method == FORK_EXIT: |
|
|
|
|
return ForkExitHandler() |
|
|
|
|
return grpc.unary_unary_rpc_method_handler(fork_and_exit) |
|
|
|
|
else: |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run_server(port_queue): |
|
|
|
|
server = grpc.server( |
|
|
|
|
futures.ThreadPoolExecutor(max_workers=10), |
|
|
|
|
options=(('grpc.so_reuseport', 0),)) |
|
|
|
|
server = test_common.test_server() |
|
|
|
|
port = server.add_insecure_port('[::]:0') |
|
|
|
|
port_queue.put(port) |
|
|
|
|
server.add_generic_rpc_handlers((GenericHandler(),)) |
|
|
|
@ -78,15 +66,11 @@ def run_server(port_queue): |
|
|
|
|
|
|
|
|
|
def run_test(args): |
|
|
|
|
if args.scenario == SERVER_RAISES_EXCEPTION: |
|
|
|
|
server = grpc.server( |
|
|
|
|
futures.ThreadPoolExecutor(max_workers=1), |
|
|
|
|
options=(('grpc.so_reuseport', 0),)) |
|
|
|
|
server = test_common.test_server() |
|
|
|
|
server.start() |
|
|
|
|
raise Exception() |
|
|
|
|
elif args.scenario == SERVER_DEALLOCATED: |
|
|
|
|
server = grpc.server( |
|
|
|
|
futures.ThreadPoolExecutor(max_workers=1), |
|
|
|
|
options=(('grpc.so_reuseport', 0),)) |
|
|
|
|
server = test_common.test_server() |
|
|
|
|
server.start() |
|
|
|
|
server.__del__() |
|
|
|
|
while server._state.stage != grpc._server._ServerStage.STOPPED: |
|
|
|
|