GRPC C++  1.32.0
server_impl.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #ifndef GRPCPP_SERVER_IMPL_H
20 #define GRPCPP_SERVER_IMPL_H
21 
22 #include <list>
23 #include <memory>
24 #include <vector>
25 
27 
28 #include <grpc/compression.h>
29 #include <grpc/support/atm.h>
30 #include <grpcpp/channel.h>
33 #include <grpcpp/impl/call.h>
41 #include <grpcpp/support/config.h>
42 #include <grpcpp/support/status.h>
43 
44 struct grpc_server;
45 
46 namespace grpc {
47 class AsyncGenericService;
48 
49 namespace internal {
50 class ExternalConnectionAcceptorImpl;
51 } // namespace internal
52 
53 } // namespace grpc
54 
55 namespace grpc_impl {
56 class ServerContext;
57 class ServerInitializer;
58 
64  public:
65  ~Server();
66 
71  void Wait() override;
72 
80  public:
81  virtual ~GlobalCallbacks() {}
83  virtual void UpdateArguments(grpc::ChannelArguments* /*args*/) {}
85  virtual void PreSynchronousRequest(grpc_impl::ServerContext* context) = 0;
87  virtual void PostSynchronousRequest(grpc_impl::ServerContext* context) = 0;
89  virtual void PreServerStart(Server* /*server*/) {}
91  virtual void AddPort(Server* /*server*/, const std::string& /*addr*/,
92  grpc::ServerCredentials* /*creds*/, int /*port*/) {}
93  };
99  static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
100 
104 
107  return health_check_service_.get();
108  }
109 
111  std::shared_ptr<grpc::Channel> InProcessChannel(
112  const grpc::ChannelArguments& args);
113 
118  public:
119  explicit experimental_type(Server* server) : server_(server) {}
120 
123  std::shared_ptr<grpc::Channel> InProcessChannelWithInterceptors(
124  const grpc::ChannelArguments& args,
125  std::vector<std::unique_ptr<
127  interceptor_creators);
128 
129  private:
130  Server* server_;
131  };
132 
137 
138  protected:
141  bool RegisterService(const std::string* host,
142  grpc::Service* service) override;
143 
157  int AddListeningPort(const std::string& addr,
158  grpc::ServerCredentials* creds) override;
159 
182  Server(
184  std::shared_ptr<std::vector<std::unique_ptr<grpc::ServerCompletionQueue>>>
185  sync_server_cqs,
186  int min_pollers, int max_pollers, int sync_cq_timeout_msec,
187  std::vector<
188  std::shared_ptr<grpc::internal::ExternalConnectionAcceptorImpl>>
189  acceptors,
190  grpc_resource_quota* server_rq = nullptr,
191  std::vector<std::unique_ptr<
193  interceptor_creators = std::vector<std::unique_ptr<
195 
202  void Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) override;
203 
204  grpc_server* server() override { return server_; }
205 
206  protected:
209  std::unique_ptr<grpc::HealthCheckServiceInterface> service) {
210  health_check_service_ = std::move(service);
211  }
212 
215  return health_check_service_disabled_;
216  }
217 
218  private:
219  std::vector<
220  std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>>*
221  interceptor_creators() override {
222  return &interceptor_creators_;
223  }
224 
226  friend class grpc::ServerBuilder;
228 
229  class SyncRequest;
230  class CallbackRequestBase;
231  template <class ServerContextType>
232  class CallbackRequest;
233  class UnimplementedAsyncRequest;
234  class UnimplementedAsyncResponse;
235 
240  class SyncRequestThreadManager;
241 
244  void RegisterAsyncGenericService(grpc::AsyncGenericService* service) override;
245 
246 #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
247  void RegisterCallbackGenericService(
251  grpc::CallbackGenericService* service) override;
252 #else
253  class experimental_registration_type final
259  public:
260  explicit experimental_registration_type(Server* server) : server_(server) {}
261  void RegisterCallbackGenericService(
262  grpc::experimental::CallbackGenericService* service) override {
263  server_->RegisterCallbackGenericService(service);
264  }
265 
266  private:
267  Server* server_;
268  };
269 
271  void RegisterCallbackGenericService(
273 
277  experimental_registration_interface* experimental_registration() override {
278  return &experimental_registration_;
279  }
280 #endif
281 
282  void PerformOpsOnCall(grpc::internal::CallOpSetInterface* ops,
283  grpc::internal::Call* call) override;
284 
285  void ShutdownInternal(gpr_timespec deadline) override;
286 
287  int max_receive_message_size() const override {
288  return max_receive_message_size_;
289  }
290 
291  grpc::CompletionQueue* CallbackCQ() override;
292 
293  grpc_impl::ServerInitializer* initializer();
294 
295  // Functions to manage the server shutdown ref count. Things that increase
296  // the ref count are the running state of the server (take a ref at start and
297  // drop it at shutdown) and each running callback RPC.
298  void Ref();
299  void UnrefWithPossibleNotify() /* LOCKS_EXCLUDED(mu_) */;
300  void UnrefAndWaitLocked() /* EXCLUSIVE_LOCKS_REQUIRED(mu_) */;
301 
302  std::vector<std::shared_ptr<grpc::internal::ExternalConnectionAcceptorImpl>>
303  acceptors_;
304 
305  // A vector of interceptor factory objects.
306  // This should be destroyed after health_check_service_ and this requirement
307  // is satisfied by declaring interceptor_creators_ before
308  // health_check_service_. (C++ mandates that member objects be destroyed in
309  // the reverse order of initialization.)
310  std::vector<
311  std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>>
312  interceptor_creators_;
313 
314  int max_receive_message_size_;
315 
319  std::shared_ptr<std::vector<std::unique_ptr<grpc::ServerCompletionQueue>>>
320  sync_server_cqs_;
321 
324  std::vector<std::unique_ptr<SyncRequestThreadManager>> sync_req_mgrs_;
325 
326 #ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL
327  // For registering experimental callback generic service; remove when that
328  // method longer experimental
329  experimental_registration_type experimental_registration_{this};
330 #endif
331 
332  // Server status
334  bool started_;
335  bool shutdown_;
336  bool shutdown_notified_; // Was notify called on the shutdown_cv_
337  grpc::internal::CondVar shutdown_done_cv_;
338  bool shutdown_done_ = false;
339  std::atomic_int shutdown_refs_outstanding_{1};
340 
341  grpc::internal::CondVar shutdown_cv_;
342 
343  std::shared_ptr<GlobalCallbacks> global_callbacks_;
344 
345  std::vector<std::string> services_;
346  bool has_async_generic_service_ = false;
347  bool has_callback_generic_service_ = false;
348  bool has_callback_methods_ = false;
349 
350  // Pointer to the wrapped grpc_server.
351  grpc_server* server_;
352 
353  std::unique_ptr<grpc_impl::ServerInitializer> server_initializer_;
354 
355  std::unique_ptr<grpc::HealthCheckServiceInterface> health_check_service_;
356  bool health_check_service_disabled_;
357 
358  // When appropriate, use a default callback generic service to handle
359  // unimplemented methods
360 #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
361  std::unique_ptr<grpc::CallbackGenericService> unimplemented_service_;
362 #else
363  std::unique_ptr<grpc::experimental::CallbackGenericService>
364  unimplemented_service_;
365 #endif
366 
367  // A special handler for resource exhausted in sync case
368  std::unique_ptr<grpc::internal::MethodHandler> resource_exhausted_handler_;
369 
370  // Handler for callback generic service, if any
371  std::unique_ptr<grpc::internal::MethodHandler> generic_handler_;
372 
373  // callback_cq_ references the callbackable completion queue associated
374  // with this server (if any). It is set on the first call to CallbackCQ().
375  // It is _not owned_ by the server; ownership belongs with its internal
376  // shutdown callback tag (invoked when the CQ is fully shutdown).
377  grpc::CompletionQueue* callback_cq_ /* GUARDED_BY(mu_) */ = nullptr;
378 
379  // List of CQs passed in by user that must be Shutdown only after Server is
380  // Shutdown. Even though this is only used with NDEBUG, instantiate it in all
381  // cases since otherwise the size will be inconsistent.
382  std::vector<grpc::CompletionQueue*> cq_list_;
383 };
384 
385 } // namespace grpc_impl
386 
387 #endif // GRPCPP_SERVER_IMPL_H
grpc::GrpcLibraryCodegen
Classes that require gRPC to be initialized should inherit from this class.
Definition: grpc_library.h:38
compression.h
grpc::internal::CondVar
Definition: sync.h:118
grpc_impl::Server::GetHealthCheckService
grpc::HealthCheckServiceInterface * GetHealthCheckService() const
Returns the health check service.
Definition: server_impl.h:106
grpc_impl::Server::GlobalCallbacks::~GlobalCallbacks
virtual ~GlobalCallbacks()
Definition: server_impl.h:81
grpc
This header provides an object that reads bytes directly from a grpc::ByteBuffer, via the ZeroCopyInp...
Definition: alarm.h:24
grpc_resource_quota
struct grpc_resource_quota grpc_resource_quota
Definition: grpc_types.h:696
grpc_impl::ServerInitializer
Definition: server_initializer_impl.h:34
grpc::HealthCheckServiceInterface
The gRPC server uses this interface to expose the health checking service without depending on protob...
Definition: health_check_service_interface.h:31
grpc::ServerCredentials
Wrapper around grpc_server_credentials, a way to authenticate a server.
Definition: server_credentials.h:65
grpc::internal::Call
Straightforward wrapping of the C call object.
Definition: call.h:35
health_check_service_interface.h
rpc_service_method.h
grpc_impl::Server::Start
void Start(grpc::ServerCompletionQueue **cqs, size_t num_cqs) override
Start the server.
grpc_impl::Server::GlobalCallbacks::UpdateArguments
virtual void UpdateArguments(grpc::ChannelArguments *)
Called before server is created.
Definition: server_impl.h:83
grpc::Service
Desriptor of an RPC service and its various RPC methods.
Definition: service_type.h:60
status.h
grpc_impl::Server::~Server
~Server()
grpc_impl::Server::Wait
void Wait() override
Block until the server shuts down.
grpc_impl::Server::GlobalCallbacks::PostSynchronousRequest
virtual void PostSynchronousRequest(grpc_impl::ServerContext *context)=0
Called after application callback for each synchronous server request.
grpc_impl::Server
Represents a gRPC server.
Definition: server_impl.h:63
grpc::ChannelArguments
Options for channel creation.
Definition: channel_arguments.h:39
grpc_impl::Server::set_health_check_service
void set_health_check_service(std::unique_ptr< grpc::HealthCheckServiceInterface > service)
NOTE: This method is not part of the public API for this class.
Definition: server_impl.h:208
grpc_impl::Server::AddListeningPort
int AddListeningPort(const std::string &addr, grpc::ServerCredentials *creds) override
Try binding the server to the given addr endpoint (port, and optionally including IP address to bind ...
grpc_impl::ServerContext
A ServerContext or CallbackServerContext allows the code implementing a service handler to:
Definition: server_context_impl.h:520
channel_arguments.h
completion_queue.h
grpc::internal::CallOpSetInterface
An abstract collection of call ops, used to generate the grpc_call_op structure to pass down to the l...
Definition: call_op_set_interface.h:34
grpc::ServerInterface::experimental_registration_interface
NOTE: class experimental_registration_interface is not part of the public API of this class TODO(vjpa...
Definition: server_interface.h:144
grpc::ServerContext
::grpc_impl::ServerContext ServerContext
Definition: server_context.h:26
grpc_server
struct grpc_server grpc_server
A server listens to some port and responds to request calls.
Definition: grpc_types.h:65
grpc::experimental::CallbackGenericService
CallbackGenericService is the base class for generic services implemented using the callback API and ...
Definition: async_generic_service.h:124
grpc::AsyncGenericService
Definition: async_generic_service.h:77
channel.h
grpc::ServerInitializer
::grpc_impl::ServerInitializer ServerInitializer
Definition: server_initializer.h:26
grpc_impl::Server::GlobalCallbacks::PreServerStart
virtual void PreServerStart(Server *)
Called before server is started.
Definition: server_impl.h:89
client_interceptor.h
grpc_library.h
grpc::experimental::ServerInterceptorFactoryInterface
Definition: server_interceptor.h:47
server_credentials.h
grpc_impl::Server::GlobalCallbacks::PreSynchronousRequest
virtual void PreSynchronousRequest(grpc_impl::ServerContext *context)=0
Called before application callback for each synchronous server request.
grpc_impl::Server::experimental_type
NOTE: class experimental_type is not part of the public API of this class.
Definition: server_impl.h:117
grpc_impl::Server::health_check_service_disabled
bool health_check_service_disabled() const
NOTE: This method is not part of the public API for this class.
Definition: server_impl.h:214
grpc_impl::Server::SetGlobalCallbacks
static void SetGlobalCallbacks(GlobalCallbacks *callbacks)
Set the global callback object.
config.h
grpc::experimental::ClientInterceptorFactoryInterface
Definition: client_interceptor.h:46
port_platform.h
grpc::ServerCompletionQueue
A specific type of completion queue used by the processing of notifications by servers.
Definition: completion_queue.h:421
call.h
grpc_impl::Server::experimental
experimental_type experimental()
NOTE: The function experimental() is not stable public API.
Definition: server_impl.h:136
grpc_impl::Server::GlobalCallbacks
Global callbacks are a set of hooks that are called when server events occur.
Definition: server_impl.h:79
grpc::CompletionQueue
A thin wrapper around grpc_completion_queue (see src/core/lib/surface/completion_queue....
Definition: completion_queue.h:99
grpc_impl::Server::experimental_type::InProcessChannelWithInterceptors
std::shared_ptr< grpc::Channel > InProcessChannelWithInterceptors(const grpc::ChannelArguments &args, std::vector< std::unique_ptr< grpc::experimental::ClientInterceptorFactoryInterface >> interceptor_creators)
Establish a channel for in-process communication with client interceptors.
grpc_impl
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm_impl.h:33
server_interface.h
grpc_impl::Server::c_server
grpc_server * c_server()
Returns a raw pointer to the underlying grpc_server instance.
grpc_impl::Server::Server
Server(grpc::ChannelArguments *args, std::shared_ptr< std::vector< std::unique_ptr< grpc::ServerCompletionQueue >>> sync_server_cqs, int min_pollers, int max_pollers, int sync_cq_timeout_msec, std::vector< std::shared_ptr< grpc::internal::ExternalConnectionAcceptorImpl >> acceptors, grpc_resource_quota *server_rq=nullptr, std::vector< std::unique_ptr< grpc::experimental::ServerInterceptorFactoryInterface >> interceptor_creators=std::vector< std::unique_ptr< grpc::experimental::ServerInterceptorFactoryInterface >>())
NOTE: This is NOT a public API.
grpc_impl::Server::RegisterService
bool RegisterService(const std::string *host, grpc::Service *service) override
Register a service.
grpc::internal::Mutex
Definition: sync.h:47
completion_queue.h
grpc::ServerBuilder
A builder class for the creation and startup of grpc::Server instances.
Definition: server_builder.h:94
grpc::ServerInterface
Definition: server_interface.h:65
atm.h
gpr_timespec
Analogous to struct timespec.
Definition: gpr_types.h:47
grpc_impl::Server::InProcessChannel
std::shared_ptr< grpc::Channel > InProcessChannel(const grpc::ChannelArguments &args)
Establish a channel for in-process communication.
grpc_impl::Server::experimental_type::experimental_type
experimental_type(Server *server)
Definition: server_impl.h:119
grpc_impl::Server::server
grpc_server * server() override
Definition: server_impl.h:204
grpc_impl::Server::GlobalCallbacks::AddPort
virtual void AddPort(Server *, const std::string &, grpc::ServerCredentials *, int)
Called after a server port is added.
Definition: server_impl.h:91