I finally found the small print about not using the same server context between rpcs.
Is anyone able to confirm if this refers to simultaneous usage or if it's a one-time use only and needs recreating for each rpc? (I note that the example at https://github.com/grpc/grpc/blob/master/examples/cpp/helloworld/greeter_async_server.cc appears to share a single context). Many thanks On Sunday, January 13, 2019 at 9:54:24 PM UTC, Alistair Lowe wrote: > > Hi guys, > > I've just written an async gRPC++ server implementation, I'm able to > successfully receive and finish one request, however the subsequent request > fails as it's retrieved via ServerCompletionQueue::AsyncNext() within > ServerContext::BeginCompletionOp() when asserting !compleition_op_ on line > 269. Sequence of events are as follows: > > 1. Register to receive multiple requests for various rpc calls. > 2. Send rpc request from client app. > 3. Receive and finish rpc request. > 4. Register to receive the request again. > 5. Send same rpc request from client app. > 6. Assert fails during call to ServerCompletionQueue::AsyncNext() as the > request arrives server side. > > Terminal Output: > E0113 21:37:39.692948234 130281 server_context.cc:269] assertion > failed: !completion_op_ > > Stack Trace from call to AsyncNext: > __GI_raise(int sig) > (/build/glibc-OTsEL5/glibc-2.27/sysdeps/unix/sysv/linux/raise.c:51) > __GI_abort() (/build/glibc-OTsEL5/glibc-2.27/stdlib/abort.c:79) > grpc::ServerContext::BeginCompletionOp(grpc::internal::Call*, bool) > (Unknown Source:0) > grpc::ServerInterface::BaseAsyncRequest::FinalizeResult(void**, bool*) > (Unknown Source:0) > grpc::ServerInterface::RegisteredAsyncRequest::FinalizeResult(grpc::ServerInterface::RegisteredAsyncRequest > > * const this, void ** tag, bool * status) > (/usr/local/include/grpcpp/impl/codegen/server_interface.h:194) > grpc::ServerInterface::PayloadAsyncRequest<OpenIoTServer::CompileVMRequest>::FinalizeResult(grpc::ServerInterface::PayloadAsyncRequest<OpenIoTServer::CompileVMRequest> > > * const this, void ** tag, bool * status) > (/usr/local/include/grpcpp/impl/codegen/server_interface.h:274) > grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) > (Unknown Source:0) > grpc::CompletionQueue::AsyncNext<std::chrono::time_point<std::chrono::_V2::system_clock, > > std::chrono::duration<long, std::ratio<1l, 1000000000l> > > > >(grpc::CompletionQueue * const this, void ** tag, bool * ok, const > std::chrono::time_point<std::chrono::_V2::system_clock, > std::chrono::duration<long, std::ratio<1, 1000000000> > > & deadline) > (/usr/local/include/grpcpp/impl/codegen/completion_queue.h:190) > > Is anyone able to offer any thoughts as to why compleition_op_ may not be > getting cleared? > > Many thanks > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/485b0add-74cc-43da-8cb0-cc325f8a1787%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
