diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake index 85f40585da29bab9a107f5546e64870975f4c2d3..82437a84248fece843c3659c9422d9b579b5066f 100644 --- a/cmake/external/grpc.cmake +++ b/cmake/external/grpc.cmake @@ -50,6 +50,7 @@ ExternalProject_Add( UPDATE_COMMAND "" CONFIGURE_COMMAND "" BUILD_IN_SOURCE 1 + PATCH_COMMAND git apply ${PADDLE_SOURCE_DIR}/patches/grpc/fix_too_early_destory.patch # NOTE(yuyang18): # Disable -Werror, otherwise the compile will fail in MacOS. # It seems that we cannot configure that by make command. diff --git a/paddle/fluid/operators/distributed/grpc_client.cc b/paddle/fluid/operators/distributed/grpc_client.cc index 4a09f3870d64d8e14b2db41ff3ea7c2f9e67b558..35318a805898de645c844a2224f6df8c458d346c 100644 --- a/paddle/fluid/operators/distributed/grpc_client.cc +++ b/paddle/fluid/operators/distributed/grpc_client.cc @@ -59,7 +59,9 @@ GRPCClient::~GRPCClient() { for (auto& it : channels_) { it.second.reset(); } + channels_.clear(); } + client_thread_->join(); } diff --git a/patches/grpc/fix_too_early_destory.patch b/patches/grpc/fix_too_early_destory.patch new file mode 100644 index 0000000000000000000000000000000000000000..d7790d56b07551b8daae9b9a41be5432e5b8b9cc --- /dev/null +++ b/patches/grpc/fix_too_early_destory.patch @@ -0,0 +1,47 @@ +diff --git a/include/grpcpp/impl/codegen/completion_queue.h b/include/grpcpp/impl/codegen/completion_queue.h +index 80c7c41982..3f7d8a7714 100644 +--- a/include/grpcpp/impl/codegen/completion_queue.h ++++ b/include/grpcpp/impl/codegen/completion_queue.h +@@ -32,6 +32,8 @@ + #ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H + #define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H + ++#include ++ + #include + #include + #include +@@ -106,7 +108,9 @@ class CompletionQueue : private GrpcLibraryCodegen { + + /// Destructor. Destroys the owned wrapped completion queue / instance. + ~CompletionQueue() { +- g_core_codegen_interface->grpc_completion_queue_destroy(cq_); ++ if (typeid(*g_core_codegen_interface).hash_code() != typeid(CoreCodegenInterface).hash_code()) { ++ g_core_codegen_interface->grpc_completion_queue_destroy(cq_); ++ } + } + + /// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT. +diff --git a/include/grpcpp/impl/codegen/grpc_library.h b/include/grpcpp/impl/codegen/grpc_library.h +index 17c904d71a..a092b2204d 100644 +--- a/include/grpcpp/impl/codegen/grpc_library.h ++++ b/include/grpcpp/impl/codegen/grpc_library.h +@@ -19,6 +19,8 @@ + #ifndef GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H + #define GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H + ++#include ++ + #include + + namespace grpc { +@@ -47,7 +49,8 @@ class GrpcLibraryCodegen { + } + } + virtual ~GrpcLibraryCodegen() { +- if (grpc_init_called_) { ++ if (grpc_init_called_ && ++ typeid(*g_glip).hash_code() != typeid(GrpcLibraryInterface).hash_code()) { + GPR_CODEGEN_ASSERT(g_glip && + "gRPC library not initialized. See " + "grpc::internal::GrpcLibraryInitializer.");