chttp2_server.cc
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 
20 
22 
23 #include <inttypes.h>
24 #include <limits.h>
25 #include <string.h>
26 
27 #include <algorithm>
28 #include <map>
29 #include <memory>
30 #include <string>
31 #include <utility>
32 #include <vector>
33 
34 #include "absl/base/thread_annotations.h"
35 #include "absl/memory/memory.h"
36 #include "absl/status/status.h"
37 #include "absl/status/statusor.h"
38 #include "absl/strings/str_cat.h"
39 #include "absl/strings/str_format.h"
40 #include "absl/strings/string_view.h"
41 #include "absl/strings/strip.h"
42 
43 #include <grpc/grpc.h>
44 #include <grpc/grpc_posix.h>
46 #include <grpc/support/alloc.h>
47 #include <grpc/support/log.h>
48 #include <grpc/support/time.h>
49 
90 
91 #ifdef GPR_SUPPORT_CHANNELS_FROM_FD
95 #endif // GPR_SUPPORT_CHANNELS_FROM_FD
96 
97 namespace grpc_core {
98 namespace {
99 
100 const char kUnixUriPrefix[] = "unix:";
101 const char kUnixAbstractUriPrefix[] = "unix-abstract:";
102 
103 class Chttp2ServerListener : public Server::ListenerInterface {
104  public:
107  Chttp2ServerArgsModifier args_modifier,
108  int* port_num);
109 
110  static grpc_error_handle CreateWithAcceptor(
111  Server* server, const char* name, grpc_channel_args* args,
112  Chttp2ServerArgsModifier args_modifier);
113 
114  // Do not instantiate directly. Use one of the factory methods above.
115  Chttp2ServerListener(Server* server, grpc_channel_args* args,
116  Chttp2ServerArgsModifier args_modifier);
117  ~Chttp2ServerListener() override;
118 
119  void Start(Server* server,
120  const std::vector<grpc_pollset*>* pollsets) override;
121 
122  channelz::ListenSocketNode* channelz_listen_socket_node() const override {
123  return channelz_listen_socket_.get();
124  }
125 
126  void SetOnDestroyDone(grpc_closure* on_destroy_done) override;
127 
128  void Orphan() override;
129 
130  private:
131  class ConfigFetcherWatcher
133  public:
134  explicit ConfigFetcherWatcher(RefCountedPtr<Chttp2ServerListener> listener)
135  : listener_(std::move(listener)) {}
136 
137  void UpdateConnectionManager(
138  RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
139  connection_manager) override;
140 
141  void StopServing() override;
142 
143  private:
144  RefCountedPtr<Chttp2ServerListener> listener_;
145  };
146 
147  class ActiveConnection : public InternallyRefCounted<ActiveConnection> {
148  public:
149  class HandshakingState : public InternallyRefCounted<HandshakingState> {
150  public:
151  HandshakingState(RefCountedPtr<ActiveConnection> connection_ref,
152  grpc_pollset* accepting_pollset,
153  grpc_tcp_server_acceptor* acceptor,
155 
156  ~HandshakingState() override;
157 
158  void Orphan() override;
159 
160  void Start(grpc_endpoint* endpoint, grpc_channel_args* args);
161 
162  // Needed to be able to grab an external ref in ActiveConnection::Start()
164 
165  private:
166  static void OnTimeout(void* arg, grpc_error_handle error);
167  static void OnReceiveSettings(void* arg, grpc_error_handle /* error */);
168  static void OnHandshakeDone(void* arg, grpc_error_handle error);
169  RefCountedPtr<ActiveConnection> const connection_;
172  RefCountedPtr<HandshakeManager> handshake_mgr_
174  // State for enforcing handshake timeout on receiving HTTP/2 settings.
178  grpc_closure on_receive_settings_ ABSL_GUARDED_BY(&connection_->mu_);
180  };
181 
182  ActiveConnection(grpc_pollset* accepting_pollset,
183  grpc_tcp_server_acceptor* acceptor,
184  grpc_channel_args* args, MemoryOwner memory_owner);
185  ~ActiveConnection() override;
186 
187  void Orphan() override;
188 
189  void SendGoAway();
190 
191  void Start(RefCountedPtr<Chttp2ServerListener> listener,
192  grpc_endpoint* endpoint, grpc_channel_args* args);
193 
194  // Needed to be able to grab an external ref in
195  // Chttp2ServerListener::OnAccept()
197 
198  private:
199  static void OnClose(void* arg, grpc_error_handle error);
200  static void OnDrainGraceTimeExpiry(void* arg, grpc_error_handle error);
201 
202  RefCountedPtr<Chttp2ServerListener> listener_;
204  // Set by HandshakingState before the handshaking begins and reset when
205  // handshaking is done.
206  OrphanablePtr<HandshakingState> handshaking_state_ ABSL_GUARDED_BY(&mu_);
207  // Set by HandshakingState when handshaking is done and a valid transport is
208  // created.
213  bool drain_grace_timer_expiry_callback_pending_ ABSL_GUARDED_BY(&mu_) =
214  false;
215  bool shutdown_ ABSL_GUARDED_BY(&mu_) = false;
216  };
217 
218  // To allow access to RefCounted<> like interface.
219  friend class RefCountedPtr<Chttp2ServerListener>;
220 
221  // Should only be called once so as to start the TCP server.
222  void StartListening();
223 
224  static void OnAccept(void* arg, grpc_endpoint* tcp,
225  grpc_pollset* accepting_pollset,
226  grpc_tcp_server_acceptor* acceptor);
227 
228  static void TcpServerShutdownComplete(void* arg, grpc_error_handle error);
229 
230  static void DestroyListener(Server* /*server*/, void* arg,
231  grpc_closure* destroy_done);
232 
233  // The interface required by RefCountedPtr<> has been manually implemented
234  // here to take a ref on tcp_server_ instead. Note that, the handshaker needs
235  // tcp_server_ to exist for the lifetime of the handshake since it's needed by
236  // acceptor. Sharing refs between the listener and tcp_server_ is just an
237  // optimization to avoid taking additional refs on the listener, since
238  // TcpServerShutdownComplete already holds a ref to the listener.
239  void IncrementRefCount() { grpc_tcp_server_ref(tcp_server_); }
240  void IncrementRefCount(const DebugLocation& /* location */,
241  const char* /* reason */) {
242  IncrementRefCount();
243  }
244 
245  RefCountedPtr<Chttp2ServerListener> Ref() GRPC_MUST_USE_RESULT {
246  IncrementRefCount();
247  return RefCountedPtr<Chttp2ServerListener>(this);
248  }
249  RefCountedPtr<Chttp2ServerListener> Ref(const DebugLocation& /* location */,
250  const char* /* reason */)
252  return Ref();
253  }
254 
255  void Unref() { grpc_tcp_server_unref(tcp_server_); }
256  void Unref(const DebugLocation& /* location */, const char* /* reason */) {
257  Unref();
258  }
259 
260  Server* const server_;
264  ConfigFetcherWatcher* config_fetcher_watcher_ = nullptr;
266  Mutex mu_;
267  RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
268  connection_manager_ ABSL_GUARDED_BY(mu_);
269  // Signals whether grpc_tcp_server_start() has been called.
270  bool started_ ABSL_GUARDED_BY(mu_) = false;
271  // Signals whether grpc_tcp_server_start() has completed.
272  CondVar started_cv_ ABSL_GUARDED_BY(mu_);
273  // Signals whether new requests/connections are to be accepted.
274  bool is_serving_ ABSL_GUARDED_BY(mu_) = false;
275  // Signals whether the application has triggered shutdown.
276  bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
277  std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections_
279  grpc_closure tcp_server_shutdown_complete_ ABSL_GUARDED_BY(mu_);
280  grpc_closure* on_destroy_done_ ABSL_GUARDED_BY(mu_) = nullptr;
281  RefCountedPtr<channelz::ListenSocketNode> channelz_listen_socket_;
283 };
284 
285 //
286 // Chttp2ServerListener::ConfigFetcherWatcher
287 //
288 
289 void Chttp2ServerListener::ConfigFetcherWatcher::UpdateConnectionManager(
290  RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
291  connection_manager) {
292  RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
293  connection_manager_to_destroy;
294  class GracefulShutdownExistingConnections {
295  public:
296  ~GracefulShutdownExistingConnections() {
297  // Send GOAWAYs on the transports so that they get disconnected when
298  // existing RPCs finish, and so that no new RPC is started on them.
299  for (auto& connection : connections_) {
300  connection.first->SendGoAway();
301  }
302  }
303 
304  void set_connections(
305  std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>>
306  connections) {
307  GPR_ASSERT(connections_.empty());
308  connections_ = std::move(connections);
309  }
310 
311  private:
312  std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections_;
313  } connections_to_shutdown;
314  {
315  MutexLock lock(&listener_->mu_);
316  connection_manager_to_destroy = listener_->connection_manager_;
317  listener_->connection_manager_ = std::move(connection_manager);
318  connections_to_shutdown.set_connections(std::move(listener_->connections_));
319  if (listener_->shutdown_) {
320  return;
321  }
322  listener_->is_serving_ = true;
323  if (listener_->started_) return;
324  }
325  int port_temp;
327  listener_->tcp_server_, &listener_->resolved_address_, &port_temp);
328  if (!GRPC_ERROR_IS_NONE(error)) {
330  gpr_log(GPR_ERROR, "Error adding port to server: %s",
332  // TODO(yashykt): We wouldn't need to assert here if we bound to the
333  // port earlier during AddPort.
334  GPR_ASSERT(0);
335  }
336  listener_->StartListening();
337  {
338  MutexLock lock(&listener_->mu_);
339  listener_->started_ = true;
340  listener_->started_cv_.SignalAll();
341  }
342 }
343 
344 void Chttp2ServerListener::ConfigFetcherWatcher::StopServing() {
345  std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections;
346  {
347  MutexLock lock(&listener_->mu_);
348  listener_->is_serving_ = false;
349  connections = std::move(listener_->connections_);
350  }
351  // Send GOAWAYs on the transports so that they disconnected when existing RPCs
352  // finish.
353  for (auto& connection : connections) {
354  connection.first->SendGoAway();
355  }
356 }
357 
358 //
359 // Chttp2ServerListener::ActiveConnection::HandshakingState
360 //
361 
362 Timestamp GetConnectionDeadline(const grpc_channel_args* args) {
365  {120 * GPR_MS_PER_SEC, 1, INT_MAX}));
366  return ExecCtx::Get()->Now() + timeout_ms;
367 }
368 
369 Chttp2ServerListener::ActiveConnection::HandshakingState::HandshakingState(
370  RefCountedPtr<ActiveConnection> connection_ref,
371  grpc_pollset* accepting_pollset, grpc_tcp_server_acceptor* acceptor,
373  : connection_(std::move(connection_ref)),
374  accepting_pollset_(accepting_pollset),
375  acceptor_(acceptor),
376  handshake_mgr_(MakeRefCounted<HandshakeManager>()),
377  deadline_(GetConnectionDeadline(args)),
380  CoreConfiguration::Get().handshaker_registry().AddHandshakers(
381  HANDSHAKER_SERVER, args, interested_parties_, handshake_mgr_.get());
382 }
383 
384 Chttp2ServerListener::ActiveConnection::HandshakingState::~HandshakingState() {
388 }
389 
390 void Chttp2ServerListener::ActiveConnection::HandshakingState::Orphan() {
391  {
392  MutexLock lock(&connection_->mu_);
393  if (handshake_mgr_ != nullptr) {
394  handshake_mgr_->Shutdown(
395  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Listener stopped serving."));
396  }
397  }
398  Unref();
399 }
400 
401 void Chttp2ServerListener::ActiveConnection::HandshakingState::Start(
402  grpc_endpoint* endpoint, grpc_channel_args* args) {
403  Ref().release(); // Held by OnHandshakeDone
404  RefCountedPtr<HandshakeManager> handshake_mgr;
405  {
406  MutexLock lock(&connection_->mu_);
407  if (handshake_mgr_ == nullptr) return;
408  handshake_mgr = handshake_mgr_;
409  }
410  handshake_mgr->DoHandshake(endpoint, args, deadline_, acceptor_,
411  OnHandshakeDone, this);
412 }
413 
414 void Chttp2ServerListener::ActiveConnection::HandshakingState::OnTimeout(
415  void* arg, grpc_error_handle error) {
416  HandshakingState* self = static_cast<HandshakingState*>(arg);
417  // Note that we may be called with GRPC_ERROR_NONE when the timer fires
418  // or with an error indicating that the timer system is being shut down.
419  if (error != GRPC_ERROR_CANCELLED) {
421  op->disconnect_with_error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
422  "Did not receive HTTP/2 settings before handshake timeout");
423  grpc_chttp2_transport* transport = nullptr;
424  {
425  MutexLock lock(&self->connection_->mu_);
426  transport = self->connection_->transport_;
427  }
429  }
430  self->Unref();
431 }
432 
433 void Chttp2ServerListener::ActiveConnection::HandshakingState::
434  OnReceiveSettings(void* arg, grpc_error_handle /* error */) {
435  HandshakingState* self = static_cast<HandshakingState*>(arg);
436  grpc_timer_cancel(&self->timer_);
437  self->Unref();
438 }
439 
440 void Chttp2ServerListener::ActiveConnection::HandshakingState::OnHandshakeDone(
441  void* arg, grpc_error_handle error) {
442  auto* args = static_cast<HandshakerArgs*>(arg);
443  HandshakingState* self = static_cast<HandshakingState*>(args->user_data);
444  OrphanablePtr<HandshakingState> handshaking_state_ref;
445  RefCountedPtr<HandshakeManager> handshake_mgr;
446  bool cleanup_connection = false;
447  {
448  MutexLock connection_lock(&self->connection_->mu_);
449  if (!GRPC_ERROR_IS_NONE(error) || self->connection_->shutdown_) {
451  gpr_log(GPR_DEBUG, "Handshaking failed: %s", error_str.c_str());
452  cleanup_connection = true;
453  if (GRPC_ERROR_IS_NONE(error) && args->endpoint != nullptr) {
454  // We were shut down or stopped serving after handshaking completed
455  // successfully, so destroy the endpoint here.
456  // TODO(ctiller): It is currently necessary to shutdown endpoints
457  // before destroying them, even if we know that there are no
458  // pending read/write callbacks. This should be fixed, at which
459  // point this can be removed.
461  grpc_endpoint_destroy(args->endpoint);
464  gpr_free(args->read_buffer);
465  }
466  } else {
467  // If the handshaking succeeded but there is no endpoint, then the
468  // handshaker may have handed off the connection to some external
469  // code, so we can just clean up here without creating a transport.
470  if (args->endpoint != nullptr) {
472  grpc_create_chttp2_transport(args->args, args->endpoint, false);
473  grpc_error_handle channel_init_err =
474  self->connection_->listener_->server_->SetupTransport(
475  transport, self->accepting_pollset_, args->args,
477  if (GRPC_ERROR_IS_NONE(channel_init_err)) {
478  // Use notify_on_receive_settings callback to enforce the
479  // handshake deadline.
480  // Note: The reinterpret_cast<>s here are safe, because
481  // grpc_chttp2_transport is a C-style extension of
482  // grpc_transport, so this is morally equivalent of a
483  // static_cast<> to a derived class.
484  // TODO(roth): Change to static_cast<> when we C++-ify the
485  // transport API.
486  self->connection_->transport_ =
487  reinterpret_cast<grpc_chttp2_transport*>(transport);
488  GRPC_CHTTP2_REF_TRANSPORT(self->connection_->transport_,
489  "ActiveConnection"); // Held by connection_
490  self->Ref().release(); // Held by OnReceiveSettings().
491  GRPC_CLOSURE_INIT(&self->on_receive_settings_, OnReceiveSettings,
492  self, grpc_schedule_on_exec_ctx);
493  // If the listener has been configured with a config fetcher, we need
494  // to watch on the transport being closed so that we can an updated
495  // list of active connections.
496  grpc_closure* on_close = nullptr;
497  if (self->connection_->listener_->config_fetcher_watcher_ !=
498  nullptr) {
499  // Refs helds by OnClose()
500  self->connection_->Ref().release();
501  on_close = &self->connection_->on_close_;
502  } else {
503  // Remove the connection from the connections_ map since OnClose()
504  // will not be invoked when a config fetcher is set.
505  cleanup_connection = true;
506  }
508  &self->on_receive_settings_,
509  on_close);
511  self->Ref().release(); // Held by OnTimeout().
512  GRPC_CLOSURE_INIT(&self->on_timeout_, OnTimeout, self,
513  grpc_schedule_on_exec_ctx);
514  grpc_timer_init(&self->timer_, self->deadline_, &self->on_timeout_);
515  } else {
516  // Failed to create channel from transport. Clean up.
517  gpr_log(GPR_ERROR, "Failed to create channel: %s",
518  grpc_error_std_string(channel_init_err).c_str());
519  GRPC_ERROR_UNREF(channel_init_err);
522  gpr_free(args->read_buffer);
523  cleanup_connection = true;
525  }
526  } else {
527  cleanup_connection = true;
528  }
529  }
530  // Since the handshake manager is done, the connection no longer needs to
531  // shutdown the handshake when the listener needs to stop serving.
532  // Avoid calling the destructor of HandshakeManager and HandshakingState
533  // from within the critical region.
534  handshake_mgr = std::move(self->handshake_mgr_);
535  handshaking_state_ref = std::move(self->connection_->handshaking_state_);
536  }
537  gpr_free(self->acceptor_);
538  self->acceptor_ = nullptr;
539  OrphanablePtr<ActiveConnection> connection;
540  if (cleanup_connection) {
541  MutexLock listener_lock(&self->connection_->listener_->mu_);
542  auto it = self->connection_->listener_->connections_.find(
543  self->connection_.get());
544  if (it != self->connection_->listener_->connections_.end()) {
545  connection = std::move(it->second);
546  self->connection_->listener_->connections_.erase(it);
547  }
548  }
549  self->Unref();
550 }
551 
552 //
553 // Chttp2ServerListener::ActiveConnection
554 //
555 
556 Chttp2ServerListener::ActiveConnection::ActiveConnection(
557  grpc_pollset* accepting_pollset, grpc_tcp_server_acceptor* acceptor,
558  grpc_channel_args* args, MemoryOwner memory_owner)
559  : handshaking_state_(memory_owner.MakeOrphanable<HandshakingState>(
560  Ref(), accepting_pollset, acceptor, args)) {
561  GRPC_CLOSURE_INIT(&on_close_, ActiveConnection::OnClose, this,
562  grpc_schedule_on_exec_ctx);
563 }
564 
565 Chttp2ServerListener::ActiveConnection::~ActiveConnection() {
566  if (transport_ != nullptr) {
567  GRPC_CHTTP2_UNREF_TRANSPORT(transport_, "ActiveConnection");
568  }
569 }
570 
571 void Chttp2ServerListener::ActiveConnection::Orphan() {
572  OrphanablePtr<HandshakingState> handshaking_state;
573  {
574  MutexLock lock(&mu_);
575  shutdown_ = true;
576  // Reset handshaking_state_ since we have been orphaned by the listener
577  // signaling that the listener has stopped serving.
578  handshaking_state = std::move(handshaking_state_);
579  }
580  Unref();
581 }
582 
583 void Chttp2ServerListener::ActiveConnection::SendGoAway() {
584  grpc_chttp2_transport* transport = nullptr;
585  {
586  MutexLock lock(&mu_);
587  if (transport_ != nullptr && !shutdown_) {
589  Ref().release(); // Ref held by OnDrainGraceTimeExpiry
590  GRPC_CLOSURE_INIT(&on_drain_grace_time_expiry_, OnDrainGraceTimeExpiry,
591  this, nullptr);
593  ExecCtx::Get()->Now() +
595  listener_->args_,
597  {10 * 60 * GPR_MS_PER_SEC, 0, INT_MAX})),
599  drain_grace_timer_expiry_callback_pending_ = true;
600  shutdown_ = true;
601  }
602  }
603  if (transport != nullptr) {
606  "Server is stopping to serve requests.");
608  }
609 }
610 
611 void Chttp2ServerListener::ActiveConnection::Start(
612  RefCountedPtr<Chttp2ServerListener> listener, grpc_endpoint* endpoint,
614  RefCountedPtr<HandshakingState> handshaking_state_ref;
615  listener_ = std::move(listener);
616  {
617  MutexLock lock(&mu_);
618  if (shutdown_) return;
619  // Hold a ref to HandshakingState to allow starting the handshake outside
620  // the critical region.
621  handshaking_state_ref = handshaking_state_->Ref();
622  }
623  handshaking_state_ref->Start(endpoint, args);
624 }
625 
626 void Chttp2ServerListener::ActiveConnection::OnClose(
627  void* arg, grpc_error_handle /* error */) {
628  ActiveConnection* self = static_cast<ActiveConnection*>(arg);
629  OrphanablePtr<ActiveConnection> connection;
630  {
631  MutexLock listener_lock(&self->listener_->mu_);
632  MutexLock connection_lock(&self->mu_);
633  // The node was already deleted from the connections_ list if the connection
634  // is shutdown.
635  if (!self->shutdown_) {
636  auto it = self->listener_->connections_.find(self);
637  if (it != self->listener_->connections_.end()) {
638  connection = std::move(it->second);
639  self->listener_->connections_.erase(it);
640  }
641  self->shutdown_ = true;
642  }
643  // Cancel the drain_grace_timer_ if needed.
644  if (self->drain_grace_timer_expiry_callback_pending_) {
645  grpc_timer_cancel(&self->drain_grace_timer_);
646  }
647  }
648  self->Unref();
649 }
650 
651 void Chttp2ServerListener::ActiveConnection::OnDrainGraceTimeExpiry(
652  void* arg, grpc_error_handle error) {
653  ActiveConnection* self = static_cast<ActiveConnection*>(arg);
654  // If the drain_grace_timer_ was not cancelled, disconnect the transport
655  // immediately.
656  if (GRPC_ERROR_IS_NONE(error)) {
657  grpc_chttp2_transport* transport = nullptr;
658  {
659  MutexLock lock(&self->mu_);
660  transport = self->transport_;
661  }
663  op->disconnect_with_error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
664  "Drain grace time expired. Closing connection immediately.");
666  }
667  self->Unref();
668 }
669 
670 //
671 // Chttp2ServerListener
672 //
673 
674 grpc_error_handle Chttp2ServerListener::Create(
676  Chttp2ServerArgsModifier args_modifier, int* port_num) {
677  Chttp2ServerListener* listener = nullptr;
678  // The bulk of this method is inside of a lambda to make cleanup
679  // easier without using goto.
680  grpc_error_handle error = [&]() {
682  // Create Chttp2ServerListener.
683  listener = new Chttp2ServerListener(server, args, args_modifier);
684  error = grpc_tcp_server_create(&listener->tcp_server_shutdown_complete_,
685  args, &listener->tcp_server_);
686  if (!GRPC_ERROR_IS_NONE(error)) return error;
687  if (server->config_fetcher() != nullptr) {
688  listener->resolved_address_ = *addr;
689  // TODO(yashykt): Consider binding so as to be able to return the port
690  // number.
691  } else {
692  error = grpc_tcp_server_add_port(listener->tcp_server_, addr, port_num);
693  if (!GRPC_ERROR_IS_NONE(error)) return error;
694  }
695  // Create channelz node.
698  auto string_address = grpc_sockaddr_to_uri(addr);
699  if (!string_address.ok()) {
701  string_address.status().ToString());
702  }
703  listener->channelz_listen_socket_ =
704  MakeRefCounted<channelz::ListenSocketNode>(
705  *string_address,
706  absl::StrCat("chttp2 listener ", *string_address));
707  }
708  // Register with the server only upon success
709  server->AddListener(OrphanablePtr<Server::ListenerInterface>(listener));
710  return GRPC_ERROR_NONE;
711  }();
712  if (!GRPC_ERROR_IS_NONE(error)) {
713  if (listener != nullptr) {
714  if (listener->tcp_server_ != nullptr) {
715  // listener is deleted when tcp_server_ is shutdown.
716  grpc_tcp_server_unref(listener->tcp_server_);
717  } else {
718  delete listener;
719  }
720  } else {
722  }
723  }
724  return error;
725 }
726 
727 grpc_error_handle Chttp2ServerListener::CreateWithAcceptor(
728  Server* server, const char* name, grpc_channel_args* args,
729  Chttp2ServerArgsModifier args_modifier) {
730  Chttp2ServerListener* listener =
731  new Chttp2ServerListener(server, args, args_modifier);
733  &listener->tcp_server_shutdown_complete_, args, &listener->tcp_server_);
734  if (!GRPC_ERROR_IS_NONE(error)) {
735  delete listener;
736  return error;
737  }
738  // TODO(yangg) channelz
739  TcpServerFdHandler** arg_val =
740  grpc_channel_args_find_pointer<TcpServerFdHandler*>(args, name);
741  *arg_val = grpc_tcp_server_create_fd_handler(listener->tcp_server_);
742  server->AddListener(OrphanablePtr<Server::ListenerInterface>(listener));
743  return GRPC_ERROR_NONE;
744 }
745 
746 Chttp2ServerListener::Chttp2ServerListener(
748  Chttp2ServerArgsModifier args_modifier)
749  : server_(server),
750  args_modifier_(args_modifier),
751  args_(args),
753  GRPC_CLOSURE_INIT(&tcp_server_shutdown_complete_, TcpServerShutdownComplete,
754  this, grpc_schedule_on_exec_ctx);
755 }
756 
757 Chttp2ServerListener::~Chttp2ServerListener() {
758  // Flush queued work before destroying handshaker factory, since that
759  // may do a synchronous unref.
760  ExecCtx::Get()->Flush();
761  if (on_destroy_done_ != nullptr) {
762  ExecCtx::Run(DEBUG_LOCATION, on_destroy_done_, GRPC_ERROR_NONE);
763  ExecCtx::Get()->Flush();
764  }
766 }
767 
768 /* Server callback: start listening on our ports */
769 void Chttp2ServerListener::Start(
770  Server* /*server*/, const std::vector<grpc_pollset*>* /* pollsets */) {
771  if (server_->config_fetcher() != nullptr) {
772  auto watcher = absl::make_unique<ConfigFetcherWatcher>(Ref());
774  server_->config_fetcher()->StartWatch(
776  std::move(watcher));
777  } else {
778  {
779  MutexLock lock(&mu_);
780  started_ = true;
781  is_serving_ = true;
782  }
783  StartListening();
784  }
785 }
786 
787 void Chttp2ServerListener::StartListening() {
788  grpc_tcp_server_start(tcp_server_, &server_->pollsets(), OnAccept, this);
789 }
790 
791 void Chttp2ServerListener::SetOnDestroyDone(grpc_closure* on_destroy_done) {
792  MutexLock lock(&mu_);
793  on_destroy_done_ = on_destroy_done;
794 }
795 
796 void Chttp2ServerListener::OnAccept(void* arg, grpc_endpoint* tcp,
797  grpc_pollset* accepting_pollset,
798  grpc_tcp_server_acceptor* acceptor) {
799  Chttp2ServerListener* self = static_cast<Chttp2ServerListener*>(arg);
800  grpc_channel_args* args = self->args_;
801  grpc_channel_args* args_to_destroy = nullptr;
802  RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
803  connection_manager;
804  {
805  MutexLock lock(&self->mu_);
806  connection_manager = self->connection_manager_;
807  }
808  auto endpoint_cleanup = [&](grpc_error_handle error) {
811  gpr_free(acceptor);
812  };
813  if (self->server_->config_fetcher() != nullptr) {
814  if (connection_manager == nullptr) {
816  "No ConnectionManager configured. Closing connection.");
817  endpoint_cleanup(error);
818  return;
819  }
820  // TODO(yashykt): Maybe combine the following two arg modifiers into a
821  // single one.
822  // Make a copy of the args so as to avoid destroying the original.
825  connection_manager->UpdateChannelArgsForConnection(args, tcp);
826  if (!args_result.ok()) {
827  gpr_log(GPR_DEBUG, "Closing connection: %s",
828  args_result.status().ToString().c_str());
829  endpoint_cleanup(
830  GRPC_ERROR_CREATE_FROM_CPP_STRING(args_result.status().ToString()));
831  return;
832  }
834  args = self->args_modifier_(*args_result, &error);
835  if (!GRPC_ERROR_IS_NONE(error)) {
836  gpr_log(GPR_DEBUG, "Closing connection: %s",
838  endpoint_cleanup(error);
840  return;
841  }
842  args_to_destroy = args;
843  }
844  auto memory_owner = self->memory_quota_->CreateMemoryOwner(
845  absl::StrCat(grpc_endpoint_get_peer(tcp), ":server_channel"));
846  auto connection = memory_owner.MakeOrphanable<ActiveConnection>(
847  accepting_pollset, acceptor, args, std::move(memory_owner));
848  // We no longer own acceptor
849  acceptor = nullptr;
850  // Hold a ref to connection to allow starting handshake outside the
851  // critical region
852  RefCountedPtr<ActiveConnection> connection_ref = connection->Ref();
853  RefCountedPtr<Chttp2ServerListener> listener_ref;
854  {
855  MutexLock lock(&self->mu_);
856  // Shutdown the the connection if listener's stopped serving or if the
857  // connection manager has changed.
858  if (!self->shutdown_ && self->is_serving_ &&
859  connection_manager == self->connection_manager_) {
860  // This ref needs to be taken in the critical region after having made
861  // sure that the listener has not been Orphaned, so as to avoid
862  // heap-use-after-free issues where `Ref()` is invoked when the ref of
863  // tcp_server_ has already reached 0. (Ref() implementation of
864  // Chttp2ServerListener is grpc_tcp_server_ref().)
865  listener_ref = self->Ref();
866  self->connections_.emplace(connection.get(), std::move(connection));
867  }
868  }
869  if (connection != nullptr) {
870  endpoint_cleanup(GRPC_ERROR_NONE);
871  } else {
872  connection_ref->Start(std::move(listener_ref), tcp, args);
873  }
874  grpc_channel_args_destroy(args_to_destroy);
875 }
876 
877 void Chttp2ServerListener::TcpServerShutdownComplete(void* arg,
879  Chttp2ServerListener* self = static_cast<Chttp2ServerListener*>(arg);
880  self->channelz_listen_socket_.reset();
882  delete self;
883 }
884 
885 /* Server callback: destroy the tcp listener (so we don't generate further
886  callbacks) */
887 void Chttp2ServerListener::Orphan() {
888  // Cancel the watch before shutting down so as to avoid holding a ref to the
889  // listener in the watcher.
890  if (config_fetcher_watcher_ != nullptr) {
891  server_->config_fetcher()->CancelWatch(config_fetcher_watcher_);
892  }
893  std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections;
895  {
896  MutexLock lock(&mu_);
897  shutdown_ = true;
898  is_serving_ = false;
899  // Orphan the connections so that they can start cleaning up.
900  connections = std::move(connections_);
901  // If the listener is currently set to be serving but has not been started
902  // yet, it means that `grpc_tcp_server_start` is in progress. Wait for the
903  // operation to finish to avoid causing races.
904  while (is_serving_ && !started_) {
905  started_cv_.Wait(&mu_);
906  }
908  }
911 }
912 
913 } // namespace
914 
915 //
916 // Chttp2ServerAddPort()
917 //
918 
921  Chttp2ServerArgsModifier args_modifier,
922  int* port_num) {
923  if (addr == nullptr) {
925  "Invalid address: addr cannot be a nullptr.");
926  }
927  if (strncmp(addr, "external:", 9) == 0) {
928  return Chttp2ServerListener::CreateWithAcceptor(server, addr, args,
929  args_modifier);
930  }
931  *port_num = -1;
933  std::vector<grpc_error_handle> error_list;
934  std::string parsed_addr = URI::PercentDecode(addr);
935  absl::string_view parsed_addr_unprefixed{parsed_addr};
936  // Using lambda to avoid use of goto.
937  grpc_error_handle error = [&]() {
939  if (absl::ConsumePrefix(&parsed_addr_unprefixed, kUnixUriPrefix)) {
940  resolved_or = grpc_resolve_unix_domain_address(parsed_addr_unprefixed);
941  } else if (absl::ConsumePrefix(&parsed_addr_unprefixed,
942  kUnixAbstractUriPrefix)) {
943  resolved_or =
944  grpc_resolve_unix_abstract_domain_address(parsed_addr_unprefixed);
945  } else {
946  resolved_or = GetDNSResolver()->ResolveNameBlocking(parsed_addr, "https");
947  }
948  if (!resolved_or.ok()) {
949  return absl_status_to_grpc_error(resolved_or.status());
950  }
951  // Create a listener for each resolved address.
952  for (auto& addr : *resolved_or) {
953  // If address has a wildcard port (0), use the same port as a previous
954  // listener.
955  if (*port_num != -1 && grpc_sockaddr_get_port(&addr) == 0) {
956  grpc_sockaddr_set_port(&addr, *port_num);
957  }
958  int port_temp = -1;
959  error = Chttp2ServerListener::Create(server, &addr,
961  args_modifier, &port_temp);
962  if (!GRPC_ERROR_IS_NONE(error)) {
963  error_list.push_back(error);
964  } else {
965  if (*port_num == -1) {
966  *port_num = port_temp;
967  } else {
968  GPR_ASSERT(*port_num == port_temp);
969  }
970  }
971  }
972  if (error_list.size() == resolved_or->size()) {
974  "No address added out of total %" PRIuPTR " resolved for '%s'",
975  resolved_or->size(), addr);
977  msg.c_str(), error_list.data(), error_list.size());
978  } else if (!error_list.empty()) {
980  "Only %" PRIuPTR " addresses added out of total %" PRIuPTR
981  " resolved",
982  resolved_or->size() - error_list.size(), resolved_or->size());
984  msg.c_str(), error_list.data(), error_list.size());
985  gpr_log(GPR_INFO, "WARNING: %s", grpc_error_std_string(error).c_str());
987  // we managed to bind some addresses: continue without error
988  }
989  return GRPC_ERROR_NONE;
990  }(); // lambda end
991  for (const grpc_error_handle& error : error_list) {
993  }
995  if (!GRPC_ERROR_IS_NONE(error)) *port_num = 0;
996  return error;
997 }
998 
999 } // namespace grpc_core
1000 
1001 namespace {
1002 
1003 grpc_channel_args* ModifyArgsForConnection(grpc_channel_args* args,
1005  grpc_server_credentials* server_credentials =
1007  if (server_credentials == nullptr) {
1009  "Could not find server credentials");
1010  return args;
1011  }
1012  auto security_connector = server_credentials->create_security_connector(args);
1013  if (security_connector == nullptr) {
1015  absl::StrCat("Unable to create secure server with credentials of type ",
1016  server_credentials->type().name()));
1017  return args;
1018  }
1019  grpc_arg arg_to_add =
1020  grpc_security_connector_to_arg(security_connector.get());
1021  grpc_channel_args* new_args =
1022  grpc_channel_args_copy_and_add(args, &arg_to_add, 1);
1024  return new_args;
1025 }
1026 
1027 } // namespace
1028 
1030  grpc_server_credentials* creds) {
1034  int port_num = 0;
1035  grpc_channel_args* args = nullptr;
1037  GRPC_API_TRACE("grpc_server_add_http2_port(server=%p, addr=%s, creds=%p)", 3,
1038  (server, addr, creds));
1039  // Create security context.
1040  if (creds == nullptr) {
1042  "No credentials specified for secure server port (creds==NULL)");
1043  goto done;
1044  }
1045  // TODO(yashykt): Ideally, we would not want to have different behavior here
1046  // based on whether a config fetcher is configured or not. Currently, we have
1047  // a feature for SSL credentials reloading with an application callback that
1048  // assumes that there is a single security connector. If we delay the creation
1049  // of the security connector to after the creation of the listener(s), we
1050  // would have potentially multiple security connectors which breaks the
1051  // assumption for SSL creds reloading. When the API for SSL creds reloading is
1052  // rewritten, we would be able to make this workaround go away by removing
1053  // that assumption. As an immediate drawback of this workaround, config
1054  // fetchers need to be registered before adding ports to the server.
1055  if (core_server->config_fetcher() != nullptr) {
1056  // Create channel args.
1057  grpc_arg arg_to_add = grpc_server_credentials_to_arg(creds);
1059  &arg_to_add, 1);
1060  } else {
1061  sc = creds->create_security_connector(nullptr);
1062  if (sc == nullptr) {
1064  "Unable to create secure server with credentials of type ",
1065  creds->type().name()));
1066  goto done;
1067  }
1068  grpc_arg args_to_add[2];
1069  args_to_add[0] = grpc_server_credentials_to_arg(creds);
1070  args_to_add[1] = grpc_security_connector_to_arg(sc.get());
1072  core_server->channel_args(), args_to_add, GPR_ARRAY_SIZE(args_to_add));
1073  }
1074  // Add server port.
1075  err = grpc_core::Chttp2ServerAddPort(core_server, addr, args,
1076  ModifyArgsForConnection, &port_num);
1077 done:
1078  sc.reset(DEBUG_LOCATION, "server");
1079  if (!GRPC_ERROR_IS_NONE(err)) {
1081 
1083  }
1084  return port_num;
1085 }
1086 
1087 #ifdef GPR_SUPPORT_CHANNELS_FROM_FD
1089  grpc_server_credentials* creds) {
1090  // For now, we only support insecure server credentials
1091  if (creds == nullptr ||
1093  gpr_log(GPR_ERROR, "Failed to create channel due to invalid creds");
1094  return;
1095  }
1098 
1099  const grpc_channel_args* server_args = core_server->channel_args();
1100  std::string name = absl::StrCat("fd:", fd);
1101  auto memory_quota =
1102  grpc_core::ResourceQuotaFromChannelArgs(server_args)->memory_quota();
1103  grpc_endpoint* server_endpoint = grpc_tcp_create(
1104  grpc_fd_create(fd, name.c_str(), true), server_args, name);
1106  server_args, server_endpoint, false /* is_client */
1107  );
1109  core_server->SetupTransport(transport, nullptr, server_args, nullptr);
1110  if (GRPC_ERROR_IS_NONE(error)) {
1111  for (grpc_pollset* pollset : core_server->pollsets()) {
1112  grpc_endpoint_add_to_pollset(server_endpoint, pollset);
1113  }
1114  grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
1115  } else {
1116  gpr_log(GPR_ERROR, "Failed to create channel: %s",
1120  }
1121 }
1122 
1123 #else // !GPR_SUPPORT_CHANNELS_FROM_FD
1124 
1125 void grpc_server_add_channel_from_fd(grpc_server* /* server */, int /* fd */,
1126  grpc_server_credentials* /* creds */) {
1127  GPR_ASSERT(0);
1128 }
1129 
1130 #endif // GPR_SUPPORT_CHANNELS_FROM_FD
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
grpc_arg
Definition: grpc_types.h:103
trace.h
grpc_core::Server::SetupTransport
grpc_error_handle SetupTransport(grpc_transport *transport, grpc_pollset *accepting_pollset, const grpc_channel_args *args, const RefCountedPtr< channelz::SocketNode > &socket_node)
Definition: src/core/lib/surface/server.cc:605
mu_
OrphanablePtr< HandshakingState > handshaking_state_ ABSL_GUARDED_BY & mu_
Definition: chttp2_server.cc:206
grpc_tcp_server_shutdown_listeners
void grpc_tcp_server_shutdown_listeners(grpc_tcp_server *s)
Definition: tcp_server.cc:71
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
transport_
grpc_transport * transport_
Definition: binder_transport_test.cc:105
timer_
grpc_timer timer_
Definition: channel_connectivity.cc:218
grpc_core::Chttp2ServerArgsModifier
std::function< grpc_channel_args *(grpc_channel_args *, grpc_error_handle *)> Chttp2ServerArgsModifier
Definition: chttp2_server.h:39
grpc_core::MakeRefCounted
RefCountedPtr< T > MakeRefCounted(Args &&... args)
Definition: ref_counted_ptr.h:335
pollset.h
regen-readme.it
it
Definition: regen-readme.py:15
orphanable.h
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
grpc_tcp_server_create_fd_handler
grpc_core::TcpServerFdHandler * grpc_tcp_server_create_fd_handler(grpc_tcp_server *s)
Definition: tcp_server.cc:43
core_configuration.h
sockaddr_utils.h
MutexLock
#define MutexLock(x)
Definition: bloaty/third_party/re2/util/mutex.h:125
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
absl::StrFormat
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
Definition: abseil-cpp/absl/strings/str_format.h:338
Timestamp
Definition: bloaty/third_party/protobuf/src/google/protobuf/timestamp.pb.h:69
grpc_core::RefCountedPtr::get
T * get() const
Definition: ref_counted_ptr.h:146
internal.h
grpc_create_chttp2_transport
grpc_transport * grpc_create_chttp2_transport(const grpc_channel_args *channel_args, grpc_endpoint *ep, bool is_client)
Definition: chttp2_transport.cc:3122
connections
static uv_pipe_t connections[NUM_CLIENTS]
Definition: test-pipe-connect-multiple.c:41
grpc_core::Server::channel_args
const grpc_channel_args * channel_args() const
Definition: src/core/lib/surface/server.h:132
config_fetcher_watcher_
ConfigFetcherWatcher * config_fetcher_watcher_
Definition: chttp2_server.cc:264
insecure_credentials.h
grpc_core
Definition: call_metric_recorder.h:31
grpc_pollset_set
struct grpc_pollset_set grpc_pollset_set
Definition: iomgr_fwd.h:23
string.h
grpc_core::RefCountedPtr::reset
void reset(T *value=nullptr)
Definition: ref_counted_ptr.h:111
resolved_address_
grpc_resolved_address resolved_address_
Definition: chttp2_server.cc:262
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_pollset_set_create
grpc_pollset_set * grpc_pollset_set_create()
Definition: pollset_set.cc:29
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
useful.h
grpc_core::InsecureServerCredentials::Type
static UniqueTypeName Type()
Definition: core/lib/security/credentials/insecure/insecure_credentials.cc:57
grpc_transport_perform_op
void grpc_transport_perform_op(grpc_transport *transport, grpc_transport_op *op)
Definition: transport.cc:114
resolve_address.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
on_close
void on_close(uv_handle_t *handle)
Definition: libuv/docs/code/tcp-echo-server/main.c:28
grpc_endpoint_get_peer
absl::string_view grpc_endpoint_get_peer(grpc_endpoint *ep)
Definition: endpoint.cc:55
error_ref_leak.err
err
Definition: error_ref_leak.py:35
framework.rpc.grpc_channelz.Server
Server
Definition: grpc_channelz.py:42
grpc_resolve_unix_domain_address
absl::StatusOr< std::vector< grpc_resolved_address > > grpc_resolve_unix_domain_address(absl::string_view name)
Definition: unix_sockets_posix_noop.cc:37
grpc_resolved_address
Definition: resolved_address.h:34
tcp
static uv_tcp_t tcp
Definition: test-connection-fail.c:29
closure.h
grpc_tcp_server
Definition: tcp_server_utils_posix.h:53
ABSL_GUARDED_BY
#define ABSL_GUARDED_BY(x)
Definition: abseil-cpp/absl/base/thread_annotations.h:62
GRPC_ARG_ENABLE_CHANNELZ
#define GRPC_ARG_ENABLE_CHANNELZ
Definition: grpc_types.h:323
setup.name
name
Definition: setup.py:542
GRPC_CHTTP2_UNREF_TRANSPORT
#define GRPC_CHTTP2_UNREF_TRANSPORT(t, r)
Definition: src/core/ext/transport/chttp2/transport/internal.h:715
time.h
GRPC_ERROR_CANCELLED
#define GRPC_ERROR_CANCELLED
Definition: error.h:238
resolved_address.h
grpc_timer
Definition: iomgr/timer.h:33
channelz.h
grpc_sockaddr_to_string
absl::StatusOr< std::string > grpc_sockaddr_to_string(const grpc_resolved_address *resolved_addr, bool normalize)
Definition: sockaddr_utils.cc:194
grpc_tcp_server_unref
void grpc_tcp_server_unref(grpc_tcp_server *s)
Definition: tcp_server.cc:67
map
zval * map
Definition: php/ext/google/protobuf/encode_decode.c:480
credentials.h
grpc_channel_args_find_bool
bool grpc_channel_args_find_bool(const grpc_channel_args *args, const char *name, bool default_value)
Definition: channel_args.cc:465
grpc_channel_args
Definition: grpc_types.h:132
grpc_security_connector_to_arg
grpc_arg grpc_security_connector_to_arg(grpc_security_connector *sc)
Definition: security_connector.cc:101
grpc_transport_op
Definition: transport.h:452
server_
Server *const server_
Definition: chttp2_server.cc:260
grpc_tcp_server_ref
grpc_tcp_server * grpc_tcp_server_ref(grpc_tcp_server *s)
Definition: tcp_server.cc:58
grpc_tcp_server_start
void grpc_tcp_server_start(grpc_tcp_server *server, const std::vector< grpc_pollset * > *pollsets, grpc_tcp_server_cb on_accept_cb, void *cb_arg)
Definition: tcp_server.cc:31
GRPC_ENABLE_CHANNELZ_DEFAULT
#define GRPC_ENABLE_CHANNELZ_DEFAULT
Definition: channelz.h:57
grpc_types.h
absl::synchronization_internal::Get
static GraphId Get(const IdMap &id, int num)
Definition: abseil-cpp/absl/synchronization/internal/graphcycles_test.cc:44
deadline_
const Timestamp deadline_
Definition: chttp2_server.cc:175
grpc_core::HANDSHAKER_SERVER
@ HANDSHAKER_SERVER
Definition: handshaker_registry.h:36
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
absl::Milliseconds
constexpr Duration Milliseconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:415
grpc_tcp_server_add_port
grpc_error_handle grpc_tcp_server_add_port(grpc_tcp_server *s, const grpc_resolved_address *addr, int *out_port)
Definition: tcp_server.cc:37
chttp2_server.h
interested_parties_
grpc_pollset_set *const interested_parties_
Definition: chttp2_server.cc:179
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
grpc_core::Server::pollsets
const std::vector< grpc_pollset * > & pollsets() const
Definition: src/core/lib/surface/server.h:138
ABSL_ACQUIRED_AFTER
#define ABSL_ACQUIRED_AFTER(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:109
grpc_core::RefCountedPtr
Definition: ref_counted_ptr.h:35
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_pollset_set_del_pollset
void grpc_pollset_set_del_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
Definition: pollset_set.cc:42
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
ev_posix.h
grpc_core::InternallyRefCounted::Ref
RefCountedPtr< Child > Ref() GRPC_MUST_USE_RESULT
Definition: orphanable.h:90
grpc_sockaddr_set_port
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
Definition: sockaddr_utils.cc:324
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
transport
grpc_transport transport
Definition: filter_fuzzer.cc:146
grpc_server_add_http2_port
int grpc_server_add_http2_port(grpc_server *server, const char *addr, grpc_server_credentials *creds)
Definition: chttp2_server.cc:1029
grpc_fd_create
grpc_fd * grpc_fd_create(int fd, const char *name, bool track_err)
grpc_transport_destroy
void grpc_transport_destroy(grpc_transport *transport)
Definition: transport.cc:96
tcp_posix.h
grpc.h
grpc_pollset_set_destroy
void grpc_pollset_set_destroy(grpc_pollset_set *pollset_set)
Definition: pollset_set.cc:33
handshaker_registry.h
security_connector.h
grpc_tcp_create
grpc_endpoint * grpc_tcp_create(grpc_fd *fd, const grpc_channel_args *args, absl::string_view peer_string)
grpc_core::Server::config_fetcher
grpc_server_config_fetcher * config_fetcher() const
Definition: src/core/lib/surface/server.h:140
pollset_set.h
done
struct tab * done
Definition: bloaty/third_party/zlib/examples/enough.c:176
started_
bool started_
Definition: xds_cluster_impl.cc:357
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
arg
Definition: cmdline.cc:40
time.h
grpc_core::MemoryQuotaRefPtr
std::shared_ptr< MemoryQuota > MemoryQuotaRefPtr
Definition: memory_quota.h:455
grpc_channel_args_copy
grpc_channel_args * grpc_channel_args_copy(const grpc_channel_args *src)
Definition: channel_args.cc:285
grpc_server
struct grpc_server grpc_server
Definition: grpc_types.h:65
grpc_server_credentials_to_arg
grpc_arg grpc_server_credentials_to_arg(grpc_server_credentials *c)
Definition: credentials.cc:134
grpc_make_transport_op
grpc_transport_op * grpc_make_transport_op(grpc_closure *on_complete)
Definition: transport.cc:205
grpc_posix.h
grpc_core::UniqueTypeName::name
absl::string_view name() const
Definition: unique_type_name.h:94
grpc_endpoint_shutdown
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
Definition: endpoint.cc:49
slice_internal.h
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_server_credentials::type
virtual grpc_core::UniqueTypeName type() const =0
grpc_endpoint_destroy
void grpc_endpoint_destroy(grpc_endpoint *ep)
Definition: endpoint.cc:53
resource_quota.h
memory_quota_
MemoryQuotaRefPtr memory_quota_
Definition: chttp2_server.cc:282
grpc_server_credentials::create_security_connector
virtual grpc_core::RefCountedPtr< grpc_server_security_connector > create_security_connector(const grpc_channel_args *args)=0
grpc_core::ExecCtx
Definition: exec_ctx.h:97
transport_fwd.h
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
args_modifier_
const Chttp2ServerArgsModifier args_modifier_
Definition: chttp2_server.cc:263
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
drain_grace_timer_
grpc_timer drain_grace_timer_
Definition: chttp2_server.cc:211
frame.h
grpc_server_config_fetcher::WatcherInterface
Definition: src/core/lib/surface/server.h:507
grpc_chttp2_transport_get_socket_node
grpc_core::RefCountedPtr< grpc_core::channelz::SocketNode > grpc_chttp2_transport_get_socket_node(grpc_transport *transport)
Definition: chttp2_transport.cc:3116
unix_sockets_posix.h
value
const char * value
Definition: hpack_parser_table.cc:165
tcp_server
static uv_tcp_t tcp_server
Definition: blackhole-server.c:33
GRPC_CHTTP2_REF_TRANSPORT
#define GRPC_CHTTP2_REF_TRANSPORT(t, r)
Definition: src/core/ext/transport/chttp2/transport/internal.h:713
grpc_server_credentials
Definition: src/core/lib/security/credentials/credentials.h:259
grpc_timer_cancel
void grpc_timer_cancel(grpc_timer *timer)
Definition: iomgr/timer.cc:36
grpc_core::Duration::Milliseconds
static constexpr Duration Milliseconds(int64_t millis)
Definition: src/core/lib/gprpp/time.h:155
grpc_sockaddr_get_port
int grpc_sockaddr_get_port(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:303
absl::Now
ABSL_NAMESPACE_BEGIN Time Now()
Definition: abseil-cpp/absl/time/clock.cc:39
absl::StatusOr::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: abseil-cpp/absl/status/statusor.h:491
GPR_ARRAY_SIZE
#define GPR_ARRAY_SIZE(array)
Definition: useful.h:129
on_close_
grpc_closure on_close_
Definition: chttp2_server.cc:210
shutdown_
bool shutdown_
Definition: pick_first.cc:173
channelz_listen_socket_
RefCountedPtr< channelz::ListenSocketNode > channelz_listen_socket_
Definition: chttp2_server.cc:281
grpc_core::Server
Definition: src/core/lib/surface/server.h:75
absl_status_to_grpc_error
grpc_error_handle absl_status_to_grpc_error(absl::Status status)
Definition: error_utils.cc:167
debug_location.h
GRPC_MUST_USE_RESULT
#define GRPC_MUST_USE_RESULT
Definition: impl/codegen/port_platform.h:584
GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS
#define GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS
Definition: grpc_types.h:270
GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING
#define GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(desc, errs, count)
Definition: error.h:310
grpc_core::ResourceQuotaFromChannelArgs
ResourceQuotaRefPtr ResourceQuotaFromChannelArgs(const grpc_channel_args *args)
Definition: api.cc:40
grpc_find_server_credentials_in_args
grpc_server_credentials * grpc_find_server_credentials_in_args(const grpc_channel_args *args)
Definition: credentials.cc:149
server
Definition: examples/python/async_streaming/server.py:1
grpc_core::GetDNSResolver
DNSResolver * GetDNSResolver()
Definition: resolve_address.cc:38
grpc_tcp_server_acceptor
Definition: tcp_server.h:36
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
connection_
const RefCountedPtr< ActiveConnection > connection_
Definition: chttp2_server.cc:169
args_
grpc_channel_args * args_
Definition: chttp2_server.cc:265
GRPC_ERROR_CREATE_FROM_CPP_STRING
#define GRPC_ERROR_CREATE_FROM_CPP_STRING(desc)
Definition: error.h:297
alloc.h
google::protobuf.internal::Mutex
WrappedMutex Mutex
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/mutex.h:113
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
chttp2_transport.h
timeout_ms
int timeout_ms
Definition: rls_end2end_test.cc:239
GRPC_ARG_SERVER_CONFIG_CHANGE_DRAIN_GRACE_TIME_MS
#define GRPC_ARG_SERVER_CONFIG_CHANGE_DRAIN_GRACE_TIME_MS
Definition: grpc_types.h:456
acceptor_
grpc_tcp_server_acceptor * acceptor_
Definition: chttp2_server.cc:171
grpc_chttp2_transport
Definition: src/core/ext/transport/chttp2/transport/internal.h:238
arg
struct arg arg
grpc_core::MakeOrphanable
OrphanablePtr< T > MakeOrphanable(Args &&... args)
Definition: orphanable.h:67
exec_ctx.h
server.h
grpc_timer_init
void grpc_timer_init(grpc_timer *timer, grpc_core::Timestamp deadline, grpc_closure *closure)
Definition: iomgr/timer.cc:31
handshaker.h
unique_type_name.h
grpc_tcp_server_create
grpc_error_handle grpc_tcp_server_create(grpc_closure *shutdown_complete, const grpc_channel_args *args, grpc_tcp_server **server)
Definition: tcp_server.cc:25
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
ref_counted_ptr.h
grpc_transport
Definition: transport_impl.h:89
transport.h
memory_quota.h
watcher
ClusterWatcher * watcher
Definition: cds.cc:148
GPR_MS_PER_SEC
#define GPR_MS_PER_SEC
Definition: include/grpc/support/time.h:39
channel_args.h
on_timeout_
grpc_closure on_timeout_
Definition: channel_connectivity.cc:219
timer.h
tcp_server_
grpc_tcp_server * tcp_server_
Definition: chttp2_server.cc:261
grpc_slice_buffer_destroy_internal
void grpc_slice_buffer_destroy_internal(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:123
api_trace.h
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
uri_parser.h
on_drain_grace_time_expiry_
grpc_closure on_drain_grace_time_expiry_
Definition: chttp2_server.cc:212
iomgr_fwd.h
grpc_core::ExecCtx::Now
Timestamp Now()
Definition: exec_ctx.cc:90
endpoint.h
googletest-break-on-failure-unittest.Run
def Run(command)
Definition: bloaty/third_party/googletest/googletest/test/googletest-break-on-failure-unittest.py:76
grpc_error
Definition: error_internal.h:42
listener_
RefCountedPtr< Chttp2ServerListener > listener_
Definition: chttp2_server.cc:144
self
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/map.c:543
grpc_channel_args_find_integer
int grpc_channel_args_find_integer(const grpc_channel_args *args, const char *name, const grpc_integer_options options)
Definition: channel_args.cc:425
testing::Ref
internal::RefMatcher< T & > Ref(T &x)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:8628
grpc_endpoint_add_to_pollset
void grpc_endpoint_add_to_pollset(grpc_endpoint *ep, grpc_pollset *pollset)
Definition: endpoint.cc:35
grpc_core::CppImplOf< Server, grpc_server >::FromC
static Server * FromC(grpc_server *c_type)
Definition: cpp_impl_of.h:30
tcp_server.h
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
grpc_closure
Definition: closure.h:56
grpc_pollset_set_add_pollset
void grpc_pollset_set_add_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
Definition: pollset_set.cc:37
grpc_sockaddr_to_uri
absl::StatusOr< std::string > grpc_sockaddr_to_uri(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:260
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
grpc_endpoint
Definition: endpoint.h:105
grpc_core::DNSResolver::ResolveNameBlocking
virtual absl::StatusOr< std::vector< grpc_resolved_address > > ResolveNameBlocking(absl::string_view name, absl::string_view default_port)=0
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
grpc_core::Chttp2ServerAddPort
grpc_error_handle Chttp2ServerAddPort(Server *server, const char *addr, grpc_channel_args *args, Chttp2ServerArgsModifier args_modifier, int *port_num)
Definition: chttp2_server.cc:919
grpc_server_add_channel_from_fd
void grpc_server_add_channel_from_fd(grpc_server *, int, grpc_server_credentials *)
Definition: chttp2_server.cc:1125
sync.h
grpc_chttp2_transport_start_reading
void grpc_chttp2_transport_start_reading(grpc_transport *transport, grpc_slice_buffer *read_buffer, grpc_closure *notify_on_receive_settings, grpc_closure *notify_on_close)
Definition: chttp2_transport.cc:3128
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
grpc_channel_args_copy_and_add
grpc_channel_args * grpc_channel_args_copy_and_add(const grpc_channel_args *src, const grpc_arg *to_add, size_t num_to_add)
Definition: channel_args.cc:224
GRPC_API_TRACE
#define GRPC_API_TRACE(fmt, nargs, args)
Definition: api_trace.h:48
accepting_pollset_
grpc_pollset *const accepting_pollset_
Definition: chttp2_server.cc:170
grpc_resolve_unix_abstract_domain_address
absl::StatusOr< std::vector< grpc_resolved_address > > grpc_resolve_unix_abstract_domain_address(absl::string_view name)
Definition: unix_sockets_posix_noop.cc:42
absl::StatusOr::status
const Status & status() const &
Definition: abseil-cpp/absl/status/statusor.h:678
error_utils.h
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
api.h
port_platform.h
absl::ConsumePrefix
ABSL_NAMESPACE_BEGIN bool ConsumePrefix(absl::string_view *str, absl::string_view expected)
Definition: abseil-cpp/absl/strings/strip.h:46


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:45