blob: 15333df60e179fb257931de2bf2cccbd40ccc363 [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
Yuchen Zenga42ec212016-04-29 13:03:06 -070037#include <map>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080038#include <memory>
39#include <vector>
40
yang-ga23f17b2015-11-25 10:21:05 -080041#include <grpc++/impl/server_builder_option.h>
Yuchen Zenga42ec212016-04-29 13:03:06 -070042#include <grpc++/impl/server_builder_plugin.h>
yang-g9e2f90c2015-08-21 15:35:03 -070043#include <grpc++/support/config.h>
yang-ga23f17b2015-11-25 10:21:05 -080044#include <grpc/compression.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080045
Craig Tiller20afa3d2016-10-17 14:52:14 -070046struct grpc_resource_quota;
Craig Tillerdb1a5cc2016-09-28 14:22:12 -070047
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080048namespace grpc {
49
Yang Gao49996492015-03-12 16:40:19 -070050class AsyncGenericService;
Craig Tiller20afa3d2016-10-17 14:52:14 -070051class ResourceQuota;
Craig Tiller8c8d0aa2015-02-12 11:38:36 -080052class CompletionQueue;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080053class RpcService;
54class Server;
Craig Tillerf9e6adf2015-05-06 11:45:59 -070055class ServerCompletionQueue;
yangg9e21f722014-12-08 15:49:52 -080056class ServerCredentials;
Craig Tiller15f383c2016-01-07 12:45:32 -080057class Service;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080058
Yuchen Zenga42ec212016-04-29 13:03:06 -070059namespace testing {
60class ServerBuilderPluginTest;
61} // namespace testing
62
Craig Tillerd6599a32015-09-03 09:37:02 -070063/// A builder class for the creation and startup of \a grpc::Server instances.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080064class ServerBuilder {
65 public:
66 ServerBuilder();
Craig Tillerdb1a5cc2016-09-28 14:22:12 -070067 ~ServerBuilder();
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080068
Craig Tillerd6599a32015-09-03 09:37:02 -070069 /// Register a service. This call does not take ownership of the service.
70 /// The service must exist for the lifetime of the \a Server instance returned
71 /// by \a BuildAndStart().
72 /// Matches requests with any :authority
David Garcia Quintas2d024562016-05-17 23:24:39 -070073 ServerBuilder& RegisterService(Service* service);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080074
Craig Tillerd6599a32015-09-03 09:37:02 -070075 /// Register a generic service.
76 /// Matches requests with any :authority
David Garcia Quintas2d024562016-05-17 23:24:39 -070077 ServerBuilder& RegisterAsyncGenericService(AsyncGenericService* service);
Craig Tillerdb57c4f2015-02-24 10:34:47 -080078
Craig Tillerd6599a32015-09-03 09:37:02 -070079 /// Register a service. This call does not take ownership of the service.
80 /// The service must exist for the lifetime of the \a Server instance returned
81 /// by BuildAndStart().
82 /// Only matches requests with :authority \a host
David Garcia Quintas2d024562016-05-17 23:24:39 -070083 ServerBuilder& RegisterService(const grpc::string& host, Service* service);
Craig Tiller822d2c72015-07-07 16:08:00 -070084
Mark D. Roth69803622016-09-06 08:15:36 -070085 /// Set max receive message size in bytes.
86 ServerBuilder& SetMaxReceiveMessageSize(int max_receive_message_size) {
87 max_receive_message_size_ = max_receive_message_size;
David Garcia Quintas2d024562016-05-17 23:24:39 -070088 return *this;
Yang Gao3921c562015-04-30 16:07:06 -070089 }
90
Mark D. Roth69803622016-09-06 08:15:36 -070091 /// Set max send message size in bytes.
92 ServerBuilder& SetMaxSendMessageSize(int max_send_message_size) {
93 max_send_message_size_ = max_send_message_size;
94 return *this;
95 }
96
Mark D. Roth0e256102016-09-15 09:01:05 -070097 /// \deprecated For backward compatibility.
Mark D. Roth69803622016-09-06 08:15:36 -070098 ServerBuilder& SetMaxMessageSize(int max_message_size) {
99 return SetMaxReceiveMessageSize(max_message_size);
100 }
101
David Garcia Quintas2d024562016-05-17 23:24:39 -0700102 /// Set the support status for compression algorithms. All algorithms are
103 /// enabled by default.
104 ///
105 /// Incoming calls compressed with an unsupported algorithm will fail with
106 /// GRPC_STATUS_UNIMPLEMENTED.
107 ServerBuilder& SetCompressionAlgorithmSupportStatus(
108 grpc_compression_algorithm algorithm, bool enabled);
David Garcia Quintas49dd2502015-09-08 16:01:09 -0700109
David Garcia Quintas2d024562016-05-17 23:24:39 -0700110 /// The default compression level to use for all channel calls in the
111 /// absence of a call-specific level.
112 ServerBuilder& SetDefaultCompressionLevel(grpc_compression_level level);
113
114 /// The default compression algorithm to use for all channel calls in the
115 /// absence of a call-specific level. Note that it overrides any compression
116 /// level set by \a SetDefaultCompressionLevel.
117 ServerBuilder& SetDefaultCompressionAlgorithm(
118 grpc_compression_algorithm algorithm);
119
Craig Tillerdb1a5cc2016-09-28 14:22:12 -0700120 /// Set the attached buffer pool for this server
Craig Tiller20afa3d2016-10-17 14:52:14 -0700121 ServerBuilder& SetResourceQuota(const ResourceQuota& resource_quota);
Craig Tillerdb1a5cc2016-09-28 14:22:12 -0700122
David Garcia Quintas2d024562016-05-17 23:24:39 -0700123 ServerBuilder& SetOption(std::unique_ptr<ServerBuilderOption> option);
yang-ga23f17b2015-11-25 10:21:05 -0800124
Craig Tillerd6599a32015-09-03 09:37:02 -0700125 /// Tries to bind \a server to the given \a addr.
126 ///
127 /// It can be invoked multiple times.
128 ///
129 /// \param addr The address to try to bind to the server (eg, localhost:1234,
130 /// 192.168.1.1:31416, [::1]:27182, etc.).
131 /// \params creds The credentials associated with the server.
132 /// \param selected_port[out] Upon success, updated to contain the port
133 /// number. \a nullptr otherwise.
134 ///
135 // TODO(dgq): the "port" part seems to be a misnomer.
David Garcia Quintas2d024562016-05-17 23:24:39 -0700136 ServerBuilder& AddListeningPort(const grpc::string& addr,
137 std::shared_ptr<ServerCredentials> creds,
138 int* selected_port = nullptr);
yangg9e21f722014-12-08 15:49:52 -0800139
David Garcia Quintas058c9de2016-06-13 19:04:43 -0700140 /// Add a completion queue for handling asynchronous services.
141 ///
142 /// Caller is required to shutdown the server prior to shutting down the
143 /// returned completion queue. A typical usage scenario:
144 ///
145 /// // While building the server:
146 /// ServerBuilder builder;
147 /// ...
148 /// cq_ = builder.AddCompletionQueue();
149 /// server_ = builder.BuildAndStart();
150 ///
151 /// // While shutting down the server;
152 /// server_->Shutdown();
153 /// cq_->Shutdown(); // Always *after* the associated server's Shutdown()!
Sree Kuchibhotla1f5e2622016-04-21 12:28:09 -0700154 ///
155 /// \param is_frequently_polled This is an optional parameter to inform GRPC
156 /// library about whether this completion queue would be frequently polled
157 /// (i.e by calling Next() or AsyncNext()). The default value is 'true' and is
158 /// the recommended setting. Setting this to 'false' (i.e not polling the
159 /// completion queue frequently) will have a significantly negative
160 /// performance impact and hence should not be used in production use cases.
161 std::unique_ptr<ServerCompletionQueue> AddCompletionQueue(
162 bool is_frequently_polled = true);
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700163
Craig Tillerd6599a32015-09-03 09:37:02 -0700164 /// Return a running server which is ready for processing calls.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800165 std::unique_ptr<Server> BuildAndStart();
166
Yuchen Zeng7d099a52016-05-06 13:21:36 -0700167 /// For internal use only: Register a ServerBuilderPlugin factory function.
Yuchen Zeng3b8f3352016-05-03 12:18:13 -0700168 static void InternalAddPluginFactory(
169 std::unique_ptr<ServerBuilderPlugin> (*CreatePlugin)());
170
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800171 private:
Yuchen Zenga42ec212016-04-29 13:03:06 -0700172 friend class ::grpc::testing::ServerBuilderPluginTest;
173
Craig Tiller42bc87c2015-02-23 08:50:19 -0800174 struct Port {
175 grpc::string addr;
176 std::shared_ptr<ServerCredentials> creds;
177 int* selected_port;
178 };
179
Craig Tiller822d2c72015-07-07 16:08:00 -0700180 typedef std::unique_ptr<grpc::string> HostString;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700181 struct NamedService {
Craig Tiller15f383c2016-01-07 12:45:32 -0800182 explicit NamedService(Service* s) : service(s) {}
183 NamedService(const grpc::string& h, Service* s)
Craig Tiller822d2c72015-07-07 16:08:00 -0700184 : host(new grpc::string(h)), service(s) {}
185 HostString host;
Craig Tiller15f383c2016-01-07 12:45:32 -0800186 Service* service;
Craig Tiller822d2c72015-07-07 16:08:00 -0700187 };
188
Mark D. Roth69803622016-09-06 08:15:36 -0700189 int max_receive_message_size_;
190 int max_send_message_size_;
yang-ga23f17b2015-11-25 10:21:05 -0800191 std::vector<std::unique_ptr<ServerBuilderOption>> options_;
Craig Tiller15f383c2016-01-07 12:45:32 -0800192 std::vector<std::unique_ptr<NamedService>> services_;
Craig Tiller42bc87c2015-02-23 08:50:19 -0800193 std::vector<Port> ports_;
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700194 std::vector<ServerCompletionQueue*> cqs_;
yangg9e21f722014-12-08 15:49:52 -0800195 std::shared_ptr<ServerCredentials> creds_;
Vijay Pai15855f32016-06-10 12:25:32 -0700196 std::vector<std::unique_ptr<ServerBuilderPlugin>> plugins_;
Craig Tiller20afa3d2016-10-17 14:52:14 -0700197 grpc_resource_quota* resource_quota_;
Yang Gao49996492015-03-12 16:40:19 -0700198 AsyncGenericService* generic_service_;
David Garcia Quintas2d024562016-05-17 23:24:39 -0700199 struct {
200 bool is_set;
201 grpc_compression_level level;
202 } maybe_default_compression_level_;
203 struct {
204 bool is_set;
205 grpc_compression_algorithm algorithm;
206 } maybe_default_compression_algorithm_;
207 uint32_t enabled_compression_algorithms_bitset_;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800208};
209
210} // namespace grpc
211
Nicolas "Pixel" Noble1ff52d52015-03-01 05:24:36 +0100212#endif // GRPCXX_SERVER_BUILDER_H