GRPC C++  1.22.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 <condition_variable>
23 #include <list>
24 #include <memory>
25 #include <mutex>
26 #include <vector>
27 
28 #include <grpc/compression.h>
29 #include <grpc/support/atm.h>
30 #include <grpcpp/channel.h>
33 #include <grpcpp/impl/call.h>
40 #include <grpcpp/support/config.h>
41 #include <grpcpp/support/status.h>
42 
43 struct grpc_server;
44 
45 namespace grpc {
46 class AsyncGenericService;
47 
48 namespace internal {
49 class ExternalConnectionAcceptorImpl;
50 } // namespace internal
51 
52 } // namespace grpc
53 
54 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 grpc::string& addr,
92  grpc::ServerCredentials* creds, int port) {}
93  };
99  static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
100 
103  grpc_server* c_server();
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 grpc::string* host,
142  grpc::Service* service) override;
143 
157  int AddListeningPort(const grpc::string& addr,
158  grpc::ServerCredentials* creds) override;
159 
185  Server(
186  int max_message_size, grpc::ChannelArguments* args,
187  std::shared_ptr<std::vector<std::unique_ptr<grpc::ServerCompletionQueue>>>
188  sync_server_cqs,
189  int min_pollers, int max_pollers, int sync_cq_timeout_msec,
190  std::vector<
191  std::shared_ptr<grpc::internal::ExternalConnectionAcceptorImpl>>
192  acceptors,
193  grpc_resource_quota* server_rq = nullptr,
194  std::vector<std::unique_ptr<
196  interceptor_creators = std::vector<std::unique_ptr<
198 
205  void Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) override;
206 
207  grpc_server* server() override { return server_; }
208 
209  protected:
212  std::unique_ptr<grpc::HealthCheckServiceInterface> service) {
213  health_check_service_ = std::move(service);
214  }
215 
218  return health_check_service_disabled_;
219  }
220 
221  private:
222  std::vector<
223  std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>>*
224  interceptor_creators() override {
225  return &interceptor_creators_;
226  }
227 
231 
232  class SyncRequest;
233  class CallbackRequestBase;
234  template <class ServerContextType>
235  class CallbackRequest;
236  class UnimplementedAsyncRequest;
237  class UnimplementedAsyncResponse;
238 
243  class SyncRequestThreadManager;
244 
247  void RegisterAsyncGenericService(grpc::AsyncGenericService* service) override;
248 
253  class experimental_registration_type final
255  public:
256  explicit experimental_registration_type(Server* server) : server_(server) {}
257  void RegisterCallbackGenericService(
258  grpc::experimental::CallbackGenericService* service) override {
259  server_->RegisterCallbackGenericService(service);
260  }
261 
262  private:
263  Server* server_;
264  };
265 
267  void RegisterCallbackGenericService(
269 
273  experimental_registration_interface* experimental_registration() override {
274  return &experimental_registration_;
275  }
276 
277  void PerformOpsOnCall(grpc::internal::CallOpSetInterface* ops,
278  grpc::internal::Call* call) override;
279 
280  void ShutdownInternal(gpr_timespec deadline) override;
281 
282  int max_receive_message_size() const override {
283  return max_receive_message_size_;
284  }
285 
286  grpc::CompletionQueue* CallbackCQ() override;
287 
288  grpc_impl::ServerInitializer* initializer();
289 
290  std::vector<std::shared_ptr<grpc::internal::ExternalConnectionAcceptorImpl>>
291  acceptors_;
292 
293  // A vector of interceptor factory objects.
294  // This should be destroyed after health_check_service_ and this requirement
295  // is satisfied by declaring interceptor_creators_ before
296  // health_check_service_. (C++ mandates that member objects be destroyed in
297  // the reverse order of initialization.)
298  std::vector<
299  std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>>
300  interceptor_creators_;
301 
302  const int max_receive_message_size_;
303 
307  std::shared_ptr<std::vector<std::unique_ptr<grpc::ServerCompletionQueue>>>
308  sync_server_cqs_;
309 
312  std::vector<std::unique_ptr<SyncRequestThreadManager>> sync_req_mgrs_;
313 
314  // Outstanding unmatched callback requests, indexed by method.
315  // NOTE: Using a gpr_atm rather than atomic_int because atomic_int isn't
316  // copyable or movable and thus will cause compilation errors. We
317  // actually only want to extend the vector before the threaded use
318  // starts, but this is still a limitation.
319  std::vector<gpr_atm> callback_unmatched_reqs_count_;
320 
321  // List of callback requests to start when server actually starts.
322  std::list<CallbackRequestBase*> callback_reqs_to_start_;
323 
324  // For registering experimental callback generic service; remove when that
325  // method longer experimental
326  experimental_registration_type experimental_registration_{this};
327 
328  // Server status
330  bool started_;
331  bool shutdown_;
332  bool shutdown_notified_; // Was notify called on the shutdown_cv_
333 
334  grpc::internal::CondVar shutdown_cv_;
335 
336  // It is ok (but not required) to nest callback_reqs_mu_ under mu_ .
337  // Incrementing callback_reqs_outstanding_ is ok without a lock but it must be
338  // decremented under the lock in case it is the last request and enables the
339  // server shutdown. The increment is performance-critical since it happens
340  // during periods of increasing load; the decrement happens only when memory
341  // is maxed out, during server shutdown, or (possibly in a future version)
342  // during decreasing load, so it is less performance-critical.
343  grpc::internal::Mutex callback_reqs_mu_;
344  grpc::internal::CondVar callback_reqs_done_cv_;
345  std::atomic_int callback_reqs_outstanding_{0};
346 
347  std::shared_ptr<GlobalCallbacks> global_callbacks_;
348 
349  std::vector<grpc::string> services_;
350  bool has_async_generic_service_{false};
351  bool has_callback_generic_service_{false};
352 
353  // Pointer to the wrapped grpc_server.
354  grpc_server* server_;
355 
356  std::unique_ptr<grpc_impl::ServerInitializer> server_initializer_;
357 
358  std::unique_ptr<grpc::HealthCheckServiceInterface> health_check_service_;
359  bool health_check_service_disabled_;
360 
361  // When appropriate, use a default callback generic service to handle
362  // unimplemented methods
363  std::unique_ptr<grpc::experimental::CallbackGenericService>
364  unimplemented_service_;
365 
366  // A special handler for resource exhausted in sync case
367  std::unique_ptr<grpc::internal::MethodHandler> resource_exhausted_handler_;
368 
369  // Handler for callback generic service, if any
370  std::unique_ptr<grpc::internal::MethodHandler> generic_handler_;
371 
372  // callback_cq_ references the callbackable completion queue associated
373  // with this server (if any). It is set on the first call to CallbackCQ().
374  // It is _not owned_ by the server; ownership belongs with its internal
375  // shutdown callback tag (invoked when the CQ is fully shutdown).
376  // It is protected by mu_
377  grpc::CompletionQueue* callback_cq_ = nullptr;
378 };
379 
380 } // namespace grpc_impl
381 
382 #endif // GRPCPP_SERVER_IMPL_H
grpc::HealthCheckServiceInterface * GetHealthCheckService() const
Returns the health check service.
Definition: server_impl.h:106
std::string string
Definition: config.h:35
bool health_check_service_disabled() const
NOTE: This method is not part of the public API for this class.
Definition: server_impl.h:217
Represents a gRPC server.
Definition: server_impl.h:63
NOTE: class experimental_registration_interface is not part of the public API of this class TODO(vjpa...
Definition: server_interface.h:129
::grpc_impl::Server Server
Definition: server.h:26
Desriptor of an RPC service and its various RPC methods.
Definition: service_type.h:60
Global callbacks are a set of hooks that are called when server events occur.
Definition: server_impl.h:79
virtual void PreServerStart(Server *server)
Called before server is started.
Definition: server_impl.h:89
struct grpc_server grpc_server
A server listens to some port and responds to request calls.
Definition: grpc_types.h:65
virtual void AddPort(Server *server, const grpc::string &addr, grpc::ServerCredentials *creds, int port)
Called after a server port is added.
Definition: server_impl.h:91
Definition: async_generic_service.h:72
Classes that require gRPC to be initialized should inherit from this class.
Definition: grpc_library.h:38
NOTE: class experimental_type is not part of the public API of this class.
Definition: server_impl.h:117
::grpc_impl::ServerContext ServerContext
Definition: server_context.h:25
A ServerContext allows the person implementing a service handler to:
Definition: server_context_impl.h:114
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:211
The gRPC server uses this interface to expose the health checking service without depending on protob...
Definition: health_check_service_interface_impl.h:28
Definition: sync.h:47
This header provides an object that reads bytes directly from a grpc::ByteBuffer, via the ZeroCopyInp...
Definition: alarm.h:24
virtual void UpdateArguments(grpc::ChannelArguments *args)
Called before server is created.
Definition: server_impl.h:83
Options for channel creation.
Definition: channel_arguments_impl.h:43
Definition: server_interface.h:58
::grpc_impl::HealthCheckServiceInterface HealthCheckServiceInterface
Definition: health_check_service_interface.h:29
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm_impl.h:33
CallbackGenericService is the base class for generic services implemented using the callback API and ...
Definition: async_generic_service.h:125
Wrapper around grpc_server_credentials, a way to authenticate a server.
Definition: server_credentials_impl.h:39
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
experimental_type(Server *server)
Definition: server_impl.h:119
A thin wrapper around grpc_completion_queue (see src/core/lib/surface/completion_queue.h).
Definition: completion_queue_impl.h:102
struct grpc_resource_quota grpc_resource_quota
Definition: grpc_types.h:652
experimental_type experimental()
NOTE: The function experimental() is not stable public API.
Definition: server_impl.h:136
Analogous to struct timespec.
Definition: gpr_types.h:47
::grpc_impl::ServerInitializer ServerInitializer
Definition: server_initializer.h:26
A specific type of completion queue used by the processing of notifications by servers.
Definition: completion_queue_impl.h:391
A builder class for the creation and startup of grpc::Server instances.
Definition: server_builder_impl.h:86
virtual ~GlobalCallbacks()
Definition: server_impl.h:81
grpc_server * server() override
Definition: server_impl.h:207
Definition: server_initializer_impl.h:34
Straightforward wrapping of the C call object.
Definition: call.h:38
Definition: sync.h:118