| /* | |
| * | |
| * Copyright 2015 gRPC authors. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| * | |
| */ | |
| #ifndef GRPCPP_SERVER_H | |
| #define GRPCPP_SERVER_H | |
| #include <condition_variable> | |
| #include <list> | |
| #include <memory> | |
| #include <mutex> | |
| #include <vector> | |
| #include <grpc/compression.h> | |
| #include <grpcpp/completion_queue.h> | |
| #include <grpcpp/impl/call.h> | |
| #include <grpcpp/impl/codegen/client_interceptor.h> | |
| #include <grpcpp/impl/codegen/grpc_library.h> | |
| #include <grpcpp/impl/codegen/server_interface.h> | |
| #include <grpcpp/impl/rpc_service_method.h> | |
| #include <grpcpp/security/server_credentials.h> | |
| #include <grpcpp/support/channel_arguments.h> | |
| #include <grpcpp/support/config.h> | |
| #include <grpcpp/support/status.h> | |
| struct grpc_server; | |
| namespace grpc { | |
| class AsyncGenericService; | |
| class HealthCheckServiceInterface; | |
| class ServerContext; | |
| class ServerInitializer; | |
| /// Represents a gRPC server. | |
| /// | |
| /// Use a \a grpc::ServerBuilder to create, configure, and start | |
| /// \a Server instances. | |
| class Server : public ServerInterface, private GrpcLibraryCodegen { | |
| public: | |
| ~Server(); | |
| /// Block until the server shuts down. | |
| /// | |
| /// \warning The server must be either shutting down or some other thread must | |
| /// call \a Shutdown for this function to ever return. | |
| void Wait() override; | |
| /// Global callbacks are a set of hooks that are called when server | |
| /// events occur. \a SetGlobalCallbacks method is used to register | |
| /// the hooks with gRPC. Note that | |
| /// the \a GlobalCallbacks instance will be shared among all | |
| /// \a Server instances in an application and can be set exactly | |
| /// once per application. | |
| class GlobalCallbacks { | |
| public: | |
| virtual ~GlobalCallbacks() {} | |
| /// Called before server is created. | |
| virtual void UpdateArguments(ChannelArguments* args) {} | |
| /// Called before application callback for each synchronous server request | |
| virtual void PreSynchronousRequest(ServerContext* context) = 0; | |
| /// Called after application callback for each synchronous server request | |
| virtual void PostSynchronousRequest(ServerContext* context) = 0; | |
| /// Called before server is started. | |
| virtual void PreServerStart(Server* server) {} | |
| /// Called after a server port is added. | |
| virtual void AddPort(Server* server, const grpc::string& addr, | |
| ServerCredentials* creds, int port) {} | |
| }; | |
| /// Set the global callback object. Can only be called once per application. | |
| /// Does not take ownership of callbacks, and expects the pointed to object | |
| /// to be alive until all server objects in the process have been destroyed. | |
| /// The same \a GlobalCallbacks object will be used throughout the | |
| /// application and is shared among all \a Server objects. | |
| static void SetGlobalCallbacks(GlobalCallbacks* callbacks); | |
| /// Returns a \em raw pointer to the underlying \a grpc_server instance. | |
| /// EXPERIMENTAL: for internal/test use only | |
| grpc_server* c_server(); | |
| /// Returns the health check service. | |
| HealthCheckServiceInterface* GetHealthCheckService() const { | |
| return health_check_service_.get(); | |
| } | |
| /// Establish a channel for in-process communication | |
| std::shared_ptr<Channel> InProcessChannel(const ChannelArguments& args); | |
| /// NOTE: class experimental_type is not part of the public API of this class. | |
| /// TODO(yashykt): Integrate into public API when this is no longer | |
| /// experimental. | |
| class experimental_type { | |
| public: | |
| explicit experimental_type(Server* server) : server_(server) {} | |
| /// Establish a channel for in-process communication with client | |
| /// interceptors | |
| std::shared_ptr<Channel> InProcessChannelWithInterceptors( | |
| const ChannelArguments& args, | |
| std::vector< | |
| std::unique_ptr<experimental::ClientInterceptorFactoryInterface>> | |
| interceptor_creators); | |
| private: | |
| Server* server_; | |
| }; | |
| /// NOTE: The function experimental() is not stable public API. It is a view | |
| /// to the experimental components of this class. It may be changed or removed | |
| /// at any time. | |
| experimental_type experimental() { return experimental_type(this); } | |
| protected: | |
| /// Register a service. This call does not take ownership of the service. | |
| /// The service must exist for the lifetime of the Server instance. | |
| bool RegisterService(const grpc::string* host, Service* service) override; | |
| /// Try binding the server to the given \a addr endpoint | |
| /// (port, and optionally including IP address to bind to). | |
| /// | |
| /// It can be invoked multiple times. Should be used before | |
| /// starting the server. | |
| /// | |
| /// \param addr The address to try to bind to the server (eg, localhost:1234, | |
| /// 192.168.1.1:31416, [::1]:27182, etc.). | |
| /// \param creds The credentials associated with the server. | |
| /// | |
| /// \return bound port number on success, 0 on failure. | |
| /// | |
| /// \warning It is an error to call this method on an already started server. | |
| int AddListeningPort(const grpc::string& addr, | |
| ServerCredentials* creds) override; | |
| /// NOTE: This is *NOT* a public API. The server constructors are supposed to | |
| /// be used by \a ServerBuilder class only. The constructor will be made | |
| /// 'private' very soon. | |
| /// | |
| /// Server constructors. To be used by \a ServerBuilder only. | |
| /// | |
| /// \param max_message_size Maximum message length that the channel can | |
| /// receive. | |
| /// | |
| /// \param args The channel args | |
| /// | |
| /// \param sync_server_cqs The completion queues to use if the server is a | |
| /// synchronous server (or a hybrid server). The server polls for new RPCs on | |
| /// these queues | |
| /// | |
| /// \param min_pollers The minimum number of polling threads per server | |
| /// completion queue (in param sync_server_cqs) to use for listening to | |
| /// incoming requests (used only in case of sync server) | |
| /// | |
| /// \param max_pollers The maximum number of polling threads per server | |
| /// completion queue (in param sync_server_cqs) to use for listening to | |
| /// incoming requests (used only in case of sync server) | |
| /// | |
| /// \param sync_cq_timeout_msec The timeout to use when calling AsyncNext() on | |
| /// server completion queues passed via sync_server_cqs param. | |
| Server(int max_message_size, ChannelArguments* args, | |
| std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>> | |
| sync_server_cqs, | |
| int min_pollers, int max_pollers, int sync_cq_timeout_msec, | |
| grpc_resource_quota* server_rq = nullptr, | |
| std::vector< | |
| std::unique_ptr<experimental::ServerInterceptorFactoryInterface>> | |
| interceptor_creators = std::vector<std::unique_ptr< | |
| experimental::ServerInterceptorFactoryInterface>>()); | |
| /// Start the server. | |
| /// | |
| /// \param cqs Completion queues for handling asynchronous services. The | |
| /// caller is required to keep all completion queues live until the server is | |
| /// destroyed. | |
| /// \param num_cqs How many completion queues does \a cqs hold. | |
| void Start(ServerCompletionQueue** cqs, size_t num_cqs) override; | |
| grpc_server* server() override { return server_; }; | |
| private: | |
| std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>* | |
| interceptor_creators() override { | |
| return &interceptor_creators_; | |
| } | |
| friend class AsyncGenericService; | |
| friend class ServerBuilder; | |
| friend class ServerInitializer; | |
| class SyncRequest; | |
| class CallbackRequest; | |
| class UnimplementedAsyncRequest; | |
| class UnimplementedAsyncResponse; | |
| /// SyncRequestThreadManager is an implementation of ThreadManager. This class | |
| /// is responsible for polling for incoming RPCs and calling the RPC handlers. | |
| /// This is only used in case of a Sync server (i.e a server exposing a sync | |
| /// interface) | |
| class SyncRequestThreadManager; | |
| /// Register a generic service. This call does not take ownership of the | |
| /// service. The service must exist for the lifetime of the Server instance. | |
| void RegisterAsyncGenericService(AsyncGenericService* service) override; | |
| void PerformOpsOnCall(internal::CallOpSetInterface* ops, | |
| internal::Call* call) override; | |
| void ShutdownInternal(gpr_timespec deadline) override; | |
| int max_receive_message_size() const override { | |
| return max_receive_message_size_; | |
| }; | |
| CompletionQueue* CallbackCQ() override; | |
| ServerInitializer* initializer(); | |
| // A vector of interceptor factory objects. | |
| // This should be destroyed after health_check_service_ and this requirement | |
| // is satisfied by declaring interceptor_creators_ before | |
| // health_check_service_. (C++ mandates that member objects be destroyed in | |
| // the reverse order of initialization.) | |
| std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>> | |
| interceptor_creators_; | |
| const int max_receive_message_size_; | |
| /// The following completion queues are ONLY used in case of Sync API | |
| /// i.e. if the server has any services with sync methods. The server uses | |
| /// these completion queues to poll for new RPCs | |
| std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>> | |
| sync_server_cqs_; | |
| /// List of \a ThreadManager instances (one for each cq in | |
| /// the \a sync_server_cqs) | |
| std::vector<std::unique_ptr<SyncRequestThreadManager>> sync_req_mgrs_; | |
| /// Outstanding callback requests | |
| std::vector<std::unique_ptr<CallbackRequest>> callback_reqs_; | |
| // Server status | |
| std::mutex mu_; | |
| bool started_; | |
| bool shutdown_; | |
| bool shutdown_notified_; // Was notify called on the shutdown_cv_ | |
| std::condition_variable shutdown_cv_; | |
| std::shared_ptr<GlobalCallbacks> global_callbacks_; | |
| std::vector<grpc::string> services_; | |
| bool has_generic_service_; | |
| // Pointer to the wrapped grpc_server. | |
| grpc_server* server_; | |
| std::unique_ptr<ServerInitializer> server_initializer_; | |
| std::unique_ptr<HealthCheckServiceInterface> health_check_service_; | |
| bool health_check_service_disabled_; | |
| // A special handler for resource exhausted in sync case | |
| std::unique_ptr<internal::MethodHandler> resource_exhausted_handler_; | |
| // callback_cq_ references the callbackable completion queue associated | |
| // with this server (if any). It is set on the first call to CallbackCQ(). | |
| // It is _not owned_ by the server; ownership belongs with its internal | |
| // shutdown callback tag (invoked when the CQ is fully shutdown). | |
| // It is protected by mu_ | |
| CompletionQueue* callback_cq_ = nullptr; | |
| }; | |
| } // namespace grpc | |
| #endif // GRPCPP_SERVER_H |