blob: 2dcd0701a2b23ba9ab13663382483a09a2eafd4b [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Sree Kuchibhotla01907122016-04-21 15:09:13 -07003 * Copyright 2015-2016, 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_BUILDER_H
35#define GRPCXX_SERVER_BUILDER_H
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080036
Sree Kuchibhotla96766192016-10-13 12:42:54 -070037#include <climits>
Yuchen Zenga42ec212016-04-29 13:03:06 -070038#include <map>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080039#include <memory>
40#include <vector>
41
Craig Tiller4751c282017-01-10 14:29:00 -080042#include <grpc++/impl/channel_argument_option.h>
yang-ga23f17b2015-11-25 10:21:05 -080043#include <grpc++/impl/server_builder_option.h>
Yuchen Zenga42ec212016-04-29 13:03:06 -070044#include <grpc++/impl/server_builder_plugin.h>
yang-g9e2f90c2015-08-21 15:35:03 -070045#include <grpc++/support/config.h>
yang-ga23f17b2015-11-25 10:21:05 -080046#include <grpc/compression.h>
Sree Kuchibhotla96766192016-10-13 12:42:54 -070047#include <grpc/support/cpu.h>
48#include <grpc/support/useful.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080049
Craig Tiller20afa3d2016-10-17 14:52:14 -070050struct grpc_resource_quota;
Craig Tillerdb1a5cc2016-09-28 14:22:12 -070051
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080052namespace grpc {
53
Yang Gao49996492015-03-12 16:40:19 -070054class AsyncGenericService;
Craig Tiller20afa3d2016-10-17 14:52:14 -070055class ResourceQuota;
Craig Tiller8c8d0aa2015-02-12 11:38:36 -080056class CompletionQueue;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080057class RpcService;
58class Server;
Craig Tillerf9e6adf2015-05-06 11:45:59 -070059class ServerCompletionQueue;
yangg9e21f722014-12-08 15:49:52 -080060class ServerCredentials;
Craig Tiller15f383c2016-01-07 12:45:32 -080061class Service;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080062
Yuchen Zenga42ec212016-04-29 13:03:06 -070063namespace testing {
64class ServerBuilderPluginTest;
65} // namespace testing
66
Craig Tillerd6599a32015-09-03 09:37:02 -070067/// A builder class for the creation and startup of \a grpc::Server instances.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080068class ServerBuilder {
69 public:
70 ServerBuilder();
Craig Tillerdb1a5cc2016-09-28 14:22:12 -070071 ~ServerBuilder();
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080072
Sree Kuchibhotla96766192016-10-13 12:42:54 -070073 enum SyncServerOption { NUM_CQS, MIN_POLLERS, MAX_POLLERS, CQ_TIMEOUT_MSEC };
Sree Kuchibhotla892dbf42016-09-27 19:42:27 -070074
Craig Tillerd6599a32015-09-03 09:37:02 -070075 /// Register a service. This call does not take ownership of the service.
76 /// The service must exist for the lifetime of the \a Server instance returned
77 /// by \a BuildAndStart().
78 /// Matches requests with any :authority
David Garcia Quintas2d024562016-05-17 23:24:39 -070079 ServerBuilder& RegisterService(Service* service);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080080
Craig Tillerd6599a32015-09-03 09:37:02 -070081 /// Register a generic service.
82 /// Matches requests with any :authority
David Garcia Quintas2d024562016-05-17 23:24:39 -070083 ServerBuilder& RegisterAsyncGenericService(AsyncGenericService* service);
Craig Tillerdb57c4f2015-02-24 10:34:47 -080084
Craig Tillerd6599a32015-09-03 09:37:02 -070085 /// Register a service. This call does not take ownership of the service.
86 /// The service must exist for the lifetime of the \a Server instance returned
87 /// by BuildAndStart().
88 /// Only matches requests with :authority \a host
David Garcia Quintas2d024562016-05-17 23:24:39 -070089 ServerBuilder& RegisterService(const grpc::string& host, Service* service);
Craig Tiller822d2c72015-07-07 16:08:00 -070090
Mark D. Roth69803622016-09-06 08:15:36 -070091 /// Set max receive message size in bytes.
92 ServerBuilder& SetMaxReceiveMessageSize(int max_receive_message_size) {
93 max_receive_message_size_ = max_receive_message_size;
David Garcia Quintas2d024562016-05-17 23:24:39 -070094 return *this;
Yang Gao3921c562015-04-30 16:07:06 -070095 }
96
Mark D. Roth69803622016-09-06 08:15:36 -070097 /// Set max send message size in bytes.
98 ServerBuilder& SetMaxSendMessageSize(int max_send_message_size) {
99 max_send_message_size_ = max_send_message_size;
100 return *this;
101 }
102
Mark D. Roth0e256102016-09-15 09:01:05 -0700103 /// \deprecated For backward compatibility.
Mark D. Roth69803622016-09-06 08:15:36 -0700104 ServerBuilder& SetMaxMessageSize(int max_message_size) {
105 return SetMaxReceiveMessageSize(max_message_size);
106 }
107
David Garcia Quintas2d024562016-05-17 23:24:39 -0700108 /// Set the support status for compression algorithms. All algorithms are
109 /// enabled by default.
110 ///
111 /// Incoming calls compressed with an unsupported algorithm will fail with
112 /// GRPC_STATUS_UNIMPLEMENTED.
113 ServerBuilder& SetCompressionAlgorithmSupportStatus(
114 grpc_compression_algorithm algorithm, bool enabled);
David Garcia Quintas49dd2502015-09-08 16:01:09 -0700115
David Garcia Quintas2d024562016-05-17 23:24:39 -0700116 /// The default compression level to use for all channel calls in the
117 /// absence of a call-specific level.
118 ServerBuilder& SetDefaultCompressionLevel(grpc_compression_level level);
119
120 /// The default compression algorithm to use for all channel calls in the
121 /// absence of a call-specific level. Note that it overrides any compression
122 /// level set by \a SetDefaultCompressionLevel.
123 ServerBuilder& SetDefaultCompressionAlgorithm(
124 grpc_compression_algorithm algorithm);
125
Craig Tillerdb1a5cc2016-09-28 14:22:12 -0700126 /// Set the attached buffer pool for this server
Craig Tiller20afa3d2016-10-17 14:52:14 -0700127 ServerBuilder& SetResourceQuota(const ResourceQuota& resource_quota);
Craig Tillerdb1a5cc2016-09-28 14:22:12 -0700128
David Garcia Quintas2d024562016-05-17 23:24:39 -0700129 ServerBuilder& SetOption(std::unique_ptr<ServerBuilderOption> option);
yang-ga23f17b2015-11-25 10:21:05 -0800130
Sree Kuchibhotla96766192016-10-13 12:42:54 -0700131 /// Only useful if this is a Synchronous server.
132 ServerBuilder& SetSyncServerOption(SyncServerOption option, int value);
Sree Kuchibhotla892dbf42016-09-27 19:42:27 -0700133
Craig Tiller4751c282017-01-10 14:29:00 -0800134 /// Add a channel argument (an escape hatch to tuning core library parameters
135 /// directly)
136 template <class T>
137 ServerBuilder& AddChannelArgument(const grpc::string& arg, const T& value) {
138 return SetOption(MakeChannelArgumentOption(arg, value));
139 }
140
Craig Tillerd6599a32015-09-03 09:37:02 -0700141 /// 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 /// \param selected_port[out] Upon success, updated to contain the port
149 /// number. \a nullptr otherwise.
150 ///
151 // TODO(dgq): the "port" part seems to be a misnomer.
David Garcia Quintas2d024562016-05-17 23:24:39 -0700152 ServerBuilder& AddListeningPort(const grpc::string& addr,
153 std::shared_ptr<ServerCredentials> creds,
154 int* selected_port = nullptr);
yangg9e21f722014-12-08 15:49:52 -0800155
David Garcia Quintas058c9de2016-06-13 19:04:43 -0700156 /// Add a completion queue for handling asynchronous services.
157 ///
158 /// Caller is required to shutdown the server prior to shutting down the
159 /// returned completion queue. A typical usage scenario:
160 ///
161 /// // While building the server:
162 /// ServerBuilder builder;
163 /// ...
164 /// cq_ = builder.AddCompletionQueue();
165 /// server_ = builder.BuildAndStart();
166 ///
167 /// // While shutting down the server;
168 /// server_->Shutdown();
169 /// cq_->Shutdown(); // Always *after* the associated server's Shutdown()!
Sree Kuchibhotla1f5e2622016-04-21 12:28:09 -0700170 ///
171 /// \param is_frequently_polled This is an optional parameter to inform GRPC
172 /// library about whether this completion queue would be frequently polled
173 /// (i.e by calling Next() or AsyncNext()). The default value is 'true' and is
174 /// the recommended setting. Setting this to 'false' (i.e not polling the
175 /// completion queue frequently) will have a significantly negative
176 /// performance impact and hence should not be used in production use cases.
177 std::unique_ptr<ServerCompletionQueue> AddCompletionQueue(
178 bool is_frequently_polled = true);
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700179
Craig Tillerd6599a32015-09-03 09:37:02 -0700180 /// Return a running server which is ready for processing calls.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800181 std::unique_ptr<Server> BuildAndStart();
182
Yuchen Zeng7d099a52016-05-06 13:21:36 -0700183 /// For internal use only: Register a ServerBuilderPlugin factory function.
Yuchen Zeng3b8f3352016-05-03 12:18:13 -0700184 static void InternalAddPluginFactory(
185 std::unique_ptr<ServerBuilderPlugin> (*CreatePlugin)());
186
Muxi Yancdc0d032017-05-09 16:04:10 -0700187 /// Enable a server workaround. Do not use unless you know what the workaround
188 /// does. For explanation and detailed descriptions of workarounds, see
189 /// docs/workarounds.md.
190 ServerBuilder& EnableWorkaround(uint32_t id);
191
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800192 private:
Yuchen Zenga42ec212016-04-29 13:03:06 -0700193 friend class ::grpc::testing::ServerBuilderPluginTest;
194
Craig Tiller42bc87c2015-02-23 08:50:19 -0800195 struct Port {
196 grpc::string addr;
197 std::shared_ptr<ServerCredentials> creds;
198 int* selected_port;
199 };
200
Sree Kuchibhotla96766192016-10-13 12:42:54 -0700201 struct SyncServerSettings {
202 SyncServerSettings()
Sree Kuchibhotla92290162017-04-21 15:40:27 -0700203 : num_cqs(gpr_cpu_num_cores()),
204 min_pollers(1),
205 max_pollers(2),
206 cq_timeout_msec(10000) {}
Sree Kuchibhotla96766192016-10-13 12:42:54 -0700207
208 // Number of server completion queues to create to listen to incoming RPCs.
209 int num_cqs;
210
211 // Minimum number of threads per completion queue that should be listening
212 // to incoming RPCs.
213 int min_pollers;
214
215 // Maximum number of threads per completion queue that can be listening to
216 // incoming RPCs.
217 int max_pollers;
218
219 // The timeout for server completion queue's AsyncNext call.
220 int cq_timeout_msec;
221 };
Sree Kuchibhotla892dbf42016-09-27 19:42:27 -0700222
Craig Tiller822d2c72015-07-07 16:08:00 -0700223 typedef std::unique_ptr<grpc::string> HostString;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700224 struct NamedService {
Craig Tiller15f383c2016-01-07 12:45:32 -0800225 explicit NamedService(Service* s) : service(s) {}
226 NamedService(const grpc::string& h, Service* s)
Craig Tiller822d2c72015-07-07 16:08:00 -0700227 : host(new grpc::string(h)), service(s) {}
228 HostString host;
Craig Tiller15f383c2016-01-07 12:45:32 -0800229 Service* service;
Craig Tiller822d2c72015-07-07 16:08:00 -0700230 };
231
Mark D. Roth69803622016-09-06 08:15:36 -0700232 int max_receive_message_size_;
233 int max_send_message_size_;
yang-ga23f17b2015-11-25 10:21:05 -0800234 std::vector<std::unique_ptr<ServerBuilderOption>> options_;
Craig Tiller15f383c2016-01-07 12:45:32 -0800235 std::vector<std::unique_ptr<NamedService>> services_;
Craig Tiller42bc87c2015-02-23 08:50:19 -0800236 std::vector<Port> ports_;
Sree Kuchibhotlaaabada92016-08-24 10:01:13 -0700237
Sree Kuchibhotla96766192016-10-13 12:42:54 -0700238 SyncServerSettings sync_server_settings_;
239
Sree Kuchibhotla385c9b22016-10-18 16:26:38 -0700240 // List of completion queues added via AddCompletionQueue() method
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700241 std::vector<ServerCompletionQueue*> cqs_;
Sree Kuchibhotlaaabada92016-08-24 10:01:13 -0700242
yangg9e21f722014-12-08 15:49:52 -0800243 std::shared_ptr<ServerCredentials> creds_;
Vijay Pai15855f32016-06-10 12:25:32 -0700244 std::vector<std::unique_ptr<ServerBuilderPlugin>> plugins_;
Craig Tiller20afa3d2016-10-17 14:52:14 -0700245 grpc_resource_quota* resource_quota_;
Yang Gao49996492015-03-12 16:40:19 -0700246 AsyncGenericService* generic_service_;
David Garcia Quintas2d024562016-05-17 23:24:39 -0700247 struct {
248 bool is_set;
249 grpc_compression_level level;
250 } maybe_default_compression_level_;
251 struct {
252 bool is_set;
253 grpc_compression_algorithm algorithm;
254 } maybe_default_compression_algorithm_;
255 uint32_t enabled_compression_algorithms_bitset_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800256};
257
258} // namespace grpc
259
Nicolas "Pixel" Noble1ff52d52015-03-01 05:24:36 +0100260#endif // GRPCXX_SERVER_BUILDER_H