blob: 03c9778468685709b14bbf952ae56c9ea33844c8 [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Nicolas "Pixel" Noble1ff52d52015-03-01 05:24:36 +010034#ifndef GRPCXX_SERVER_H
35#define GRPCXX_SERVER_H
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080036
Craig Tillercbd04852015-02-10 17:39:54 -080037#include <list>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080038#include <memory>
Yuchen Zenga42ec212016-04-29 13:03:06 -070039#include <vector>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080040
41#include <grpc++/completion_queue.h>
Craig Tillerbb5227f2015-02-11 13:34:48 -080042#include <grpc++/impl/call.h>
David Garcia Quintase1300de2016-01-27 18:41:26 -080043#include <grpc++/impl/codegen/grpc_library.h>
44#include <grpc++/impl/codegen/server_interface.h>
Craig Tiller15f383c2016-01-07 12:45:32 -080045#include <grpc++/impl/rpc_service_method.h>
Nicolas "Pixel" Nobleff2828b2015-04-03 03:16:46 +020046#include <grpc++/impl/sync.h>
Julien Boeuf0d471922015-08-30 22:18:50 -070047#include <grpc++/security/server_credentials.h>
yang-ga23f17b2015-11-25 10:21:05 -080048#include <grpc++/support/channel_arguments.h>
yang-g9e2f90c2015-08-21 15:35:03 -070049#include <grpc++/support/config.h>
50#include <grpc++/support/status.h>
yang-ga23f17b2015-11-25 10:21:05 -080051#include <grpc/compression.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080052
Sree Kuchibhotlabb5519f2016-07-19 11:00:39 -070053#include "src/cpp/rpcmanager/grpc_rpc_manager.h"
54
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080055struct grpc_server;
56
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080057namespace grpc {
Craig Tiller50a7a682015-06-04 12:53:40 -070058
Yang Gao005eb882015-03-11 22:17:13 -070059class GenericServerContext;
Yang Gao49996492015-03-12 16:40:19 -070060class AsyncGenericService;
Craig Tiller81fafa82015-06-04 08:51:17 -070061class ServerAsyncStreamingInterface;
Craig Tiller7221d992015-11-24 06:59:33 -080062class ServerContext;
Yuchen Zenga42ec212016-04-29 13:03:06 -070063class ServerInitializer;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080064class ThreadPoolInterface;
65
Craig Tillerd6599a32015-09-03 09:37:02 -070066/// Models a gRPC server.
67///
68/// Servers are configured and started via \a grpc::ServerBuilder.
Sree Kuchibhotlabb5519f2016-07-19 11:00:39 -070069class Server GRPC_FINAL : public ServerInterface,
70 private GrpcLibraryCodegen,
71 public GrpcRpcManager {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080072 public:
73 ~Server();
74
Craig Tillerd6599a32015-09-03 09:37:02 -070075 /// Block waiting for all work to complete.
76 ///
77 /// \warning The server must be either shutting down or some other thread must
78 /// call \a Shutdown for this function to ever return.
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -080079 void Wait() GRPC_OVERRIDE;
Craig Tiller6e57b9e2015-02-24 15:46:22 -080080
Craig Tiller7221d992015-11-24 06:59:33 -080081 /// Global Callbacks
82 ///
83 /// Can be set exactly once per application to install hooks whenever
84 /// a server event occurs
85 class GlobalCallbacks {
86 public:
Craig Tiller8352b9e2015-12-02 11:43:40 -080087 virtual ~GlobalCallbacks() {}
yang-geb62c942016-02-17 15:37:25 -080088 /// Called before server is created.
89 virtual void UpdateArguments(ChannelArguments* args) {}
Craig Tiller8352b9e2015-12-02 11:43:40 -080090 /// Called before application callback for each synchronous server request
Craig Tiller7221d992015-11-24 06:59:33 -080091 virtual void PreSynchronousRequest(ServerContext* context) = 0;
Craig Tiller8352b9e2015-12-02 11:43:40 -080092 /// Called after application callback for each synchronous server request
Craig Tiller7221d992015-11-24 06:59:33 -080093 virtual void PostSynchronousRequest(ServerContext* context) = 0;
94 };
Craig Tiller8352b9e2015-12-02 11:43:40 -080095 /// Set the global callback object. Can only be called once. Does not take
96 /// ownership of callbacks, and expects the pointed to object to be alive
97 /// until all server objects in the process have been destroyed.
Craig Tiller7221d992015-11-24 06:59:33 -080098 static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
99
Adam Michalikb97e2d12016-06-02 12:12:55 -0700100 // Returns a \em raw pointer to the underlying grpc_server instance.
101 grpc_server* c_server();
102
103 // Returns a \em raw pointer to the underlying CompletionQueue.
104 CompletionQueue* completion_queue();
105
Sree Kuchibhotlabb5519f2016-07-19 11:00:39 -0700106 /// GRPC RPC Manager functions
107 void PollForWork(bool& is_work_found, void** tag) GRPC_OVERRIDE;
108 void DoWork(void* tag) GRPC_OVERRIDE;
109
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800110 private:
Yang Gao49996492015-03-12 16:40:19 -0700111 friend class AsyncGenericService;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800112 friend class ServerBuilder;
Yuchen Zenga42ec212016-04-29 13:03:06 -0700113 friend class ServerInitializer;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800114
Craig Tiller1c9a2a92015-02-12 14:10:25 -0800115 class SyncRequest;
116 class AsyncRequest;
Craig Tillerbce999f2015-05-27 09:55:51 -0700117 class ShutdownRequest;
Craig Tillercbd04852015-02-10 17:39:54 -0800118
David Garcia Quintas44f32492016-01-14 18:00:04 -0800119 class UnimplementedAsyncRequestContext;
120 class UnimplementedAsyncRequest;
121 class UnimplementedAsyncResponse;
122
Craig Tillerd6599a32015-09-03 09:37:02 -0700123 /// Server constructors. To be used by \a ServerBuilder only.
124 ///
125 /// \param thread_pool The threadpool instance to use for call processing.
126 /// \param thread_pool_owned Does the server own the \a thread_pool instance?
127 /// \param max_message_size Maximum message length that the channel can
128 /// receive.
Yang Gao3921c562015-04-30 16:07:06 -0700129 Server(ThreadPoolInterface* thread_pool, bool thread_pool_owned,
yang-geb62c942016-02-17 15:37:25 -0800130 int max_message_size, ChannelArguments* args);
Craig Tillerd6599a32015-09-03 09:37:02 -0700131
132 /// Register a service. This call does not take ownership of the service.
133 /// The service must exist for the lifetime of the Server instance.
David Garcia Quintasf3ddb7c2016-01-20 16:02:22 -0800134 bool RegisterService(const grpc::string* host,
135 Service* service) GRPC_OVERRIDE;
Craig Tillerd6599a32015-09-03 09:37:02 -0700136
137 /// Register a generic service. This call does not take ownership of the
138 /// service. The service must exist for the lifetime of the Server instance.
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -0800139 void RegisterAsyncGenericService(AsyncGenericService* service) GRPC_OVERRIDE;
Craig Tillerd6599a32015-09-03 09:37:02 -0700140
141 /// Tries to bind \a server to the given \a addr.
142 ///
143 /// It can be invoked multiple times.
144 ///
145 /// \param addr The address to try to bind to the server (eg, localhost:1234,
146 /// 192.168.1.1:31416, [::1]:27182, etc.).
147 /// \params creds The credentials associated with the server.
148 ///
149 /// \return bound port number on sucess, 0 on failure.
150 ///
151 /// \warning It's an error to call this method on an already started server.
David Garcia Quintasf3ddb7c2016-01-20 16:02:22 -0800152 int AddListeningPort(const grpc::string& addr,
153 ServerCredentials* creds) GRPC_OVERRIDE;
Craig Tillerd6599a32015-09-03 09:37:02 -0700154
155 /// Start the server.
156 ///
157 /// \param cqs Completion queues for handling asynchronous services. The
158 /// caller is required to keep all completion queues live until the server is
159 /// destroyed.
160 /// \param num_cqs How many completion queues does \a cqs hold.
161 ///
162 /// \return true on a successful shutdown.
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -0800163 bool Start(ServerCompletionQueue** cqs, size_t num_cqs) GRPC_OVERRIDE;
Craig Tillerd6599a32015-09-03 09:37:02 -0700164
165 /// Process one or more incoming calls.
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -0800166 void RunRpc() GRPC_OVERRIDE;
Craig Tillerd6599a32015-09-03 09:37:02 -0700167
168 /// Schedule \a RunRpc to run in the threadpool.
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -0800169 void ScheduleCallback() GRPC_OVERRIDE;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800170
Craig Tillerce40de52015-06-05 07:14:58 -0700171 void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) GRPC_OVERRIDE;
Craig Tillerbb5227f2015-02-11 13:34:48 -0800172
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -0800173 void ShutdownInternal(gpr_timespec deadline) GRPC_OVERRIDE;
Craig Tillere50e5cb2015-08-18 12:44:57 -0700174
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -0800175 int max_message_size() const GRPC_OVERRIDE { return max_message_size_; };
Craig Tiller50a7a682015-06-04 12:53:40 -0700176
David Garcia Quintas1f4e72c2016-01-19 14:45:32 -0800177 grpc_server* server() GRPC_OVERRIDE { return server_; };
Yang Gao1c402332015-03-05 16:39:25 -0800178
Yuchen Zenga42ec212016-04-29 13:03:06 -0700179 ServerInitializer* initializer();
180
Yang Gao3921c562015-04-30 16:07:06 -0700181 const int max_message_size_;
182
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800183 // Completion queue.
Craig Tiller3b29b562015-02-11 12:58:46 -0800184 CompletionQueue cq_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800185
186 // Sever status
Nicolas "Pixel" Nobleff2828b2015-04-03 03:16:46 +0200187 grpc::mutex mu_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800188 bool started_;
189 bool shutdown_;
yang-g6ec11f22016-07-14 14:53:35 -0700190 bool shutdown_notified_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800191 // The number of threads which are running callbacks.
192 int num_running_cb_;
Nicolas "Pixel" Nobleff2828b2015-04-03 03:16:46 +0200193 grpc::condition_variable callback_cv_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800194
yang-ge89dc6c2016-07-11 15:48:01 -0700195 grpc::condition_variable shutdown_cv_;
196
Craig Tiller64616492016-01-26 14:16:20 -0800197 std::shared_ptr<GlobalCallbacks> global_callbacks_;
198
Nicolas Noble30862032015-04-24 18:17:45 -0700199 std::list<SyncRequest>* sync_methods_;
Yuchen Zenga42ec212016-04-29 13:03:06 -0700200 std::vector<grpc::string> services_;
yang-g9b7757d2015-08-13 11:15:53 -0700201 std::unique_ptr<RpcServiceMethod> unknown_method_;
202 bool has_generic_service_;
Craig Tillercbd04852015-02-10 17:39:54 -0800203
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800204 // Pointer to the c grpc server.
yang-geb62c942016-02-17 15:37:25 -0800205 grpc_server* server_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800206
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800207 ThreadPoolInterface* thread_pool_;
208 // Whether the thread pool is created and owned by the server.
209 bool thread_pool_owned_;
Yuchen Zenga42ec212016-04-29 13:03:06 -0700210
211 std::unique_ptr<ServerInitializer> server_initializer_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800212};
213
214} // namespace grpc
215
Nicolas "Pixel" Noble1ff52d52015-03-01 05:24:36 +0100216#endif // GRPCXX_SERVER_H