close_fd_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2019 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  * close_fd_test tests the behavior of grpc core when the transport gets
18  * disconnected.
19  * The test creates an http2 transport over a socket pair and closes the
20  * client or server file descriptor to simulate connection breakage while
21  * an RPC call is in progress.
22  *
23  */
25 
26 // This test won't work except with posix sockets enabled
27 #ifdef GRPC_POSIX_SOCKET_TCP
28 
29 #include <stdio.h>
30 #include <string.h>
31 #include <unistd.h>
32 
33 #include <grpc/byte_buffer.h>
35 #include <grpc/grpc.h>
36 #include <grpc/support/alloc.h>
37 #include <grpc/support/log.h>
38 #include <grpc/support/time.h>
39 
46 
47 static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
48 
49 typedef struct test_ctx test_ctx;
50 
51 struct test_ctx {
52  /* completion queue for call notifications on the server */
54  /* completion queue registered to server for shutdown events */
55  grpc_completion_queue* shutdown_cq;
56  /* client's completion queue */
57  grpc_completion_queue* client_cq;
58  /* completion queue bound to call on the server */
59  grpc_completion_queue* bound_cq;
60  /* Server responds to client calls */
62  /* Client calls are sent over the channel */
64  /* encapsulates client, server endpoints */
66 };
67 
68 static test_ctx g_ctx;
69 
70 /* chttp2 transport that is immediately available (used for testing
71  connected_channel without a client_channel */
72 
75  grpc_endpoint_add_to_pollset(g_ctx.ep->server, grpc_cq_pollset(g_ctx.cq));
76  grpc_core::Server* core_server = grpc_core::Server::FromC(g_ctx.server);
78  "SetupTransport",
79  core_server->SetupTransport(transport, nullptr,
80  core_server->channel_args(), nullptr)));
81 }
82 
85  grpc_endpoint_add_to_pollset(g_ctx.ep->client,
86  grpc_cq_pollset(g_ctx.client_cq));
88  const_cast<char*>(GRPC_ARG_DEFAULT_AUTHORITY),
89  const_cast<char*>("test-authority"));
91  grpc_channel_args_copy_and_add(nullptr, &authority_arg, 1);
92  /* TODO (pjaikumar): use GRPC_CLIENT_CHANNEL instead of
93  * GRPC_CLIENT_DIRECT_CHANNEL */
94  g_ctx.client = (*grpc_core::Channel::Create(
95  "socketpair-target", grpc_core::ChannelArgs::FromC(args),
97  ->c_ptr();
99 }
100 
101 static void init_client() {
104  transport = grpc_create_chttp2_transport(nullptr, g_ctx.ep->client, true);
106  GPR_ASSERT(g_ctx.client);
107  grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
108 }
109 
110 static void init_server() {
113  GPR_ASSERT(!g_ctx.server);
114  g_ctx.server = grpc_server_create(nullptr, nullptr);
115  grpc_server_register_completion_queue(g_ctx.server, g_ctx.cq, nullptr);
116  grpc_server_start(g_ctx.server);
117  transport = grpc_create_chttp2_transport(nullptr, g_ctx.ep->server, false);
119  grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
120 }
121 
122 static void test_init() {
123  grpc_endpoint_pair* sfd =
124  static_cast<grpc_endpoint_pair*>(gpr_malloc(sizeof(grpc_endpoint_pair)));
125  memset(&g_ctx, 0, sizeof(g_ctx));
126  g_ctx.ep = sfd;
127  g_ctx.cq = grpc_completion_queue_create_for_next(nullptr);
128  g_ctx.shutdown_cq = grpc_completion_queue_create_for_pluck(nullptr);
129  g_ctx.bound_cq = grpc_completion_queue_create_for_next(nullptr);
130  g_ctx.client_cq = grpc_completion_queue_create_for_next(nullptr);
131 
132  /* Create endpoints */
133  *sfd = grpc_iomgr_create_endpoint_pair("fixture", nullptr);
134  /* Create client, server and setup transport over endpoint pair */
135  init_server();
136  init_client();
137 }
138 
139 static void drain_cq(grpc_completion_queue* cq) {
140  grpc_event event;
141  do {
143  nullptr);
144  } while (event.type != GRPC_QUEUE_SHUTDOWN);
145 }
146 
147 static void drain_and_destroy_cq(grpc_completion_queue* cq) {
149  drain_cq(cq);
151 }
152 
153 static void shutdown_server() {
154  if (!g_ctx.server) return;
155  grpc_server_shutdown_and_notify(g_ctx.server, g_ctx.shutdown_cq, tag(1000));
156  GPR_ASSERT(grpc_completion_queue_pluck(g_ctx.shutdown_cq, tag(1000),
158  nullptr)
159  .type == GRPC_OP_COMPLETE);
160  grpc_server_destroy(g_ctx.server);
161  g_ctx.server = nullptr;
162 }
163 
164 static void shutdown_client() {
165  if (!g_ctx.client) return;
166  grpc_channel_destroy(g_ctx.client);
167  g_ctx.client = nullptr;
168 }
169 
170 static void end_test() {
171  shutdown_server();
172  shutdown_client();
173 
174  drain_and_destroy_cq(g_ctx.cq);
175  drain_and_destroy_cq(g_ctx.client_cq);
176  drain_and_destroy_cq(g_ctx.bound_cq);
177  grpc_completion_queue_destroy(g_ctx.shutdown_cq);
178  gpr_free(g_ctx.ep);
179 }
180 
181 typedef enum fd_type { CLIENT_FD, SERVER_FD } fd_type;
182 
183 static const char* fd_type_str(fd_type fdtype) {
184  if (fdtype == CLIENT_FD) {
185  return "client";
186  } else if (fdtype == SERVER_FD) {
187  return "server";
188  } else {
189  gpr_log(GPR_ERROR, "Unexpected fd_type %d", fdtype);
190  abort();
191  }
192 }
193 
194 static void _test_close_before_server_recv(fd_type fdtype) {
196  grpc_call* call;
197  grpc_call* server_call;
198  grpc_event event;
199  grpc_slice request_payload_slice =
200  grpc_slice_from_copied_string("hello world");
201  grpc_slice response_payload_slice =
202  grpc_slice_from_copied_string("hello you");
203  grpc_byte_buffer* request_payload =
204  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
205  grpc_byte_buffer* response_payload =
206  grpc_raw_byte_buffer_create(&response_payload_slice, 1);
207  gpr_log(GPR_INFO, "Running test: test_close_%s_before_server_recv",
208  fd_type_str(fdtype));
209  test_init();
210 
211  grpc_op ops[6];
212  grpc_op* op;
216  grpc_byte_buffer* request_payload_recv = nullptr;
222 
225  g_ctx.client, nullptr, GRPC_PROPAGATE_DEFAULTS, g_ctx.client_cq,
226  grpc_slice_from_static_string("/foo"), nullptr, deadline, nullptr);
227  GPR_ASSERT(call);
228 
233 
234  memset(ops, 0, sizeof(ops));
235  op = ops;
238  op->flags = 0;
239  op->reserved = nullptr;
240  op++;
242  op->data.send_message.send_message = request_payload;
243  op->flags = 0;
244  op->reserved = nullptr;
245  op++;
247  op->flags = 0;
248  op->reserved = nullptr;
249  op++;
252  op->flags = 0;
253  op->reserved = nullptr;
254  op++;
257  op->flags = 0;
258  op->reserved = nullptr;
259  op++;
264  op->flags = 0;
265  op->reserved = nullptr;
266  op++;
267  error = grpc_call_start_batch(call, ops, static_cast<size_t>(op - ops),
268  tag(1), nullptr);
270 
271  error = grpc_server_request_call(g_ctx.server, &server_call, &call_details,
272  &request_metadata_recv, g_ctx.bound_cq,
273  g_ctx.cq, tag(101));
276  g_ctx.cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
277  GPR_ASSERT(event.success == 1);
278  GPR_ASSERT(event.tag == tag(101));
279  GPR_ASSERT(event.type == GRPC_OP_COMPLETE);
280 
281  memset(ops, 0, sizeof(ops));
282  op = ops;
285  op->flags = 0;
286  op->reserved = nullptr;
287  op++;
289  op->data.recv_message.recv_message = &request_payload_recv;
290  op->flags = 0;
291  op->reserved = nullptr;
292  op++;
293 
294  grpc_endpoint_pair* sfd = g_ctx.ep;
295  int fd;
296  if (fdtype == SERVER_FD) {
297  fd = sfd->server->vtable->get_fd(sfd->server);
298  } else {
299  GPR_ASSERT(fdtype == CLIENT_FD);
300  fd = sfd->client->vtable->get_fd(sfd->client);
301  }
302  /* Connection is closed before the server receives the client's message. */
303  close(fd);
304 
305  error = grpc_call_start_batch(server_call, ops, static_cast<size_t>(op - ops),
306  tag(102), nullptr);
308 
310  g_ctx.bound_cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
311 
312  /* Batch operation completes on the server side.
313  * event.success will be true if the op completes successfully.
314  * event.success will be false if the op completes with an error. This can
315  * happen due to a race with closing the fd resulting in pending writes
316  * failing due to stream closure.
317  * */
318  GPR_ASSERT(event.type == GRPC_OP_COMPLETE);
319  GPR_ASSERT(event.tag == tag(102));
320 
322  g_ctx.client_cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
323  /* When the client fd is closed, the server gets EPIPE.
324  * When server fd is closed, server gets EBADF.
325  * In both cases server sends GRPC_STATUS_UNAVALABLE to the client. However,
326  * the client may not receive this grpc_status as it's socket is being closed.
327  * If the client didn't get grpc_status from the server it will time out
328  * waiting on the completion queue. So there 2 2 possibilities:
329  * 1. client times out waiting for server's response
330  * 2. client receives GRPC_STATUS_UNAVAILABLE from server
331  */
332  if (event.type == GRPC_QUEUE_TIMEOUT) {
333  GPR_ASSERT(event.success == 0);
334  /* status is not initialized */
336  } else {
337  GPR_ASSERT(event.type == GRPC_OP_COMPLETE);
338  GPR_ASSERT(event.success == 1);
339  GPR_ASSERT(event.tag == tag(1));
341  }
342 
347 
349  grpc_call_unref(server_call);
350 
351  grpc_byte_buffer_destroy(request_payload);
352  grpc_byte_buffer_destroy(response_payload);
353  grpc_byte_buffer_destroy(request_payload_recv);
355 
356  end_test();
357 }
358 
359 static void test_close_before_server_recv() {
360  /* Close client side of the connection before server receives message from
361  * client */
362  _test_close_before_server_recv(CLIENT_FD);
363  /* Close server side of the connection before server receives message from
364  * client */
365  _test_close_before_server_recv(SERVER_FD);
366 }
367 
368 static void _test_close_before_server_send(fd_type fdtype) {
370  grpc_call* call;
371  grpc_call* server_call;
372  grpc_event event;
373  grpc_slice request_payload_slice =
374  grpc_slice_from_copied_string("hello world");
375  grpc_slice response_payload_slice =
376  grpc_slice_from_copied_string("hello you");
377  grpc_byte_buffer* request_payload =
378  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
379  grpc_byte_buffer* response_payload =
380  grpc_raw_byte_buffer_create(&response_payload_slice, 1);
381  gpr_log(GPR_INFO, "Running test: test_close_%s_before_server_send",
382  fd_type_str(fdtype));
383  test_init();
384 
385  grpc_op ops[6];
386  grpc_op* op;
390  grpc_byte_buffer* request_payload_recv = nullptr;
396  int was_cancelled = 2;
397 
400  g_ctx.client, nullptr, GRPC_PROPAGATE_DEFAULTS, g_ctx.client_cq,
401  grpc_slice_from_static_string("/foo"), nullptr, deadline, nullptr);
402  GPR_ASSERT(call);
403 
408 
409  memset(ops, 0, sizeof(ops));
410  op = ops;
413  op->flags = 0;
414  op->reserved = nullptr;
415  op++;
417  op->data.send_message.send_message = request_payload;
418  op->flags = 0;
419  op->reserved = nullptr;
420  op++;
422  op->flags = 0;
423  op->reserved = nullptr;
424  op++;
427  op->flags = 0;
428  op->reserved = nullptr;
429  op++;
432  op->flags = 0;
433  op->reserved = nullptr;
434  op++;
439  op->flags = 0;
440  op->reserved = nullptr;
441  op++;
442  error = grpc_call_start_batch(call, ops, static_cast<size_t>(op - ops),
443  tag(1), nullptr);
445 
446  error = grpc_server_request_call(g_ctx.server, &server_call, &call_details,
447  &request_metadata_recv, g_ctx.bound_cq,
448  g_ctx.cq, tag(101));
451  g_ctx.cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
452  GPR_ASSERT(event.success == 1);
453  GPR_ASSERT(event.tag == tag(101));
454  GPR_ASSERT(event.type == GRPC_OP_COMPLETE);
455 
456  memset(ops, 0, sizeof(ops));
457  op = ops;
460  op->flags = 0;
461  op->reserved = nullptr;
462  op++;
464  op->data.recv_message.recv_message = &request_payload_recv;
465  op->flags = 0;
466  op->reserved = nullptr;
467  op++;
468  error = grpc_call_start_batch(server_call, ops, static_cast<size_t>(op - ops),
469  tag(102), nullptr);
471 
473  g_ctx.bound_cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
474  GPR_ASSERT(event.type == GRPC_OP_COMPLETE);
475  GPR_ASSERT(event.success == 1);
476  GPR_ASSERT(event.tag == tag(102));
477 
478  memset(ops, 0, sizeof(ops));
479  op = ops;
482  op->flags = 0;
483  op->reserved = nullptr;
484  op++;
486  op->data.send_message.send_message = response_payload;
487  op->flags = 0;
488  op->reserved = nullptr;
489  op++;
493  grpc_slice status_details = grpc_slice_from_static_string("xyz");
494  op->data.send_status_from_server.status_details = &status_details;
495  op->flags = 0;
496  op->reserved = nullptr;
497  op++;
498 
499  grpc_endpoint_pair* sfd = g_ctx.ep;
500  int fd;
501  if (fdtype == SERVER_FD) {
502  fd = sfd->server->vtable->get_fd(sfd->server);
503  } else {
504  GPR_ASSERT(fdtype == CLIENT_FD);
505  fd = sfd->client->vtable->get_fd(sfd->client);
506  }
507 
508  /* Connection is closed before the server sends message and status to the
509  * client. */
510  close(fd);
511  error = grpc_call_start_batch(server_call, ops, static_cast<size_t>(op - ops),
512  tag(103), nullptr);
514 
515  /* Batch operation succeeds on the server side */
517  g_ctx.bound_cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
518  GPR_ASSERT(event.type == GRPC_OP_COMPLETE);
519  GPR_ASSERT(event.success == 1);
520  GPR_ASSERT(event.tag == tag(103));
521 
523  g_ctx.client_cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
524  /* In both cases server sends GRPC_STATUS_UNAVALABLE to the client. However,
525  * the client may not receive this grpc_status as it's socket is being closed.
526  * If the client didn't get grpc_status from the server it will time out
527  * waiting on the completion queue
528  */
529  if (event.type == GRPC_OP_COMPLETE) {
530  GPR_ASSERT(event.success == 1);
531  GPR_ASSERT(event.tag == tag(1));
533  } else {
535  GPR_ASSERT(event.success == 0);
536  /* status is not initialized */
538  }
540 
545 
547  grpc_call_unref(server_call);
548 
549  grpc_byte_buffer_destroy(request_payload);
550  grpc_byte_buffer_destroy(response_payload);
551  grpc_byte_buffer_destroy(request_payload_recv);
553 
554  end_test();
555 }
556 
557 static void test_close_before_server_send() {
558  /* Close client side of the connection before server sends message to client
559  * */
560  _test_close_before_server_send(CLIENT_FD);
561  /* Close server side of the connection before server sends message to client
562  * */
563  _test_close_before_server_send(SERVER_FD);
564 }
565 
566 static void _test_close_before_client_send(fd_type fdtype) {
568  grpc_call* call;
569  grpc_event event;
570  grpc_slice request_payload_slice =
571  grpc_slice_from_copied_string("hello world");
572  grpc_slice response_payload_slice =
573  grpc_slice_from_copied_string("hello you");
574  grpc_byte_buffer* request_payload =
575  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
576  grpc_byte_buffer* response_payload =
577  grpc_raw_byte_buffer_create(&response_payload_slice, 1);
578  gpr_log(GPR_INFO, "Running test: test_close_%s_before_client_send",
579  fd_type_str(fdtype));
580  test_init();
581 
582  grpc_op ops[6];
583  grpc_op* op;
587  grpc_byte_buffer* request_payload_recv = nullptr;
593 
596  g_ctx.client, nullptr, GRPC_PROPAGATE_DEFAULTS, g_ctx.client_cq,
597  grpc_slice_from_static_string("/foo"), nullptr, deadline, nullptr);
598  GPR_ASSERT(call);
599 
604 
605  memset(ops, 0, sizeof(ops));
606  op = ops;
609  op->flags = 0;
610  op->reserved = nullptr;
611  op++;
613  op->data.send_message.send_message = request_payload;
614  op->flags = 0;
615  op->reserved = nullptr;
616  op++;
618  op->flags = 0;
619  op->reserved = nullptr;
620  op++;
623  op->flags = 0;
624  op->reserved = nullptr;
625  op++;
628  op->flags = 0;
629  op->reserved = nullptr;
630  op++;
635  op->flags = 0;
636  op->reserved = nullptr;
637  op++;
638 
639  grpc_endpoint_pair* sfd = g_ctx.ep;
640  int fd;
641  if (fdtype == SERVER_FD) {
642  fd = sfd->server->vtable->get_fd(sfd->server);
643  } else {
644  GPR_ASSERT(fdtype == CLIENT_FD);
645  fd = sfd->client->vtable->get_fd(sfd->client);
646  }
647  /* Connection is closed before the client sends a batch to the server */
648  close(fd);
649 
650  error = grpc_call_start_batch(call, ops, static_cast<size_t>(op - ops),
651  tag(1), nullptr);
653 
654  /* Status unavailable is returned to the client when client or server fd is
655  * closed */
657  g_ctx.client_cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
658  GPR_ASSERT(event.success == 1);
659  GPR_ASSERT(event.type == GRPC_OP_COMPLETE);
660  GPR_ASSERT(event.tag == tag(1));
662 
663  /* No event is received on the server */
665  g_ctx.cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
666  GPR_ASSERT(event.success == 0);
668 
674 
676 
677  grpc_byte_buffer_destroy(request_payload);
678  grpc_byte_buffer_destroy(response_payload);
679  grpc_byte_buffer_destroy(request_payload_recv);
681 
682  end_test();
683 }
684 static void test_close_before_client_send() {
685  /* Close client side of the connection before client sends message to server
686  * */
687  _test_close_before_client_send(CLIENT_FD);
688  /* Close server side of the connection before client sends message to server
689  * */
690  _test_close_before_client_send(SERVER_FD);
691 }
692 
693 static void _test_close_before_call_create(fd_type fdtype) {
695  grpc_call* call;
696  grpc_event event;
697  test_init();
698 
700 
701  grpc_endpoint_pair* sfd = g_ctx.ep;
702  int fd;
703  if (fdtype == SERVER_FD) {
704  fd = sfd->server->vtable->get_fd(sfd->server);
705  } else {
706  GPR_ASSERT(fdtype == CLIENT_FD);
707  fd = sfd->client->vtable->get_fd(sfd->client);
708  }
709  /* Connection is closed before the client creates a call */
710  close(fd);
711 
713  g_ctx.client, nullptr, GRPC_PROPAGATE_DEFAULTS, g_ctx.client_cq,
714  grpc_slice_from_static_string("/foo"), nullptr, deadline, nullptr);
715  GPR_ASSERT(call);
716 
717  /* Client and server time out waiting on their completion queues and nothing
718  * is sent or received */
720  g_ctx.client_cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
722  GPR_ASSERT(event.success == 0);
723 
725  g_ctx.cq, grpc_timeout_milliseconds_to_deadline(100), nullptr);
727  GPR_ASSERT(event.success == 0);
728 
730  end_test();
731 }
732 
733 static void test_close_before_call_create() {
734  /* Close client side of the connection before client creates a call */
735  _test_close_before_call_create(CLIENT_FD);
736  /* Close server side of the connection before client creates a call */
737  _test_close_before_call_create(SERVER_FD);
738 }
739 
740 int main(int argc, char** argv) {
741  grpc::testing::TestEnvironment env(&argc, argv);
742  /* Init grpc */
743  grpc_init();
744  int iterations = 10;
745 
746  for (int i = 0; i < iterations; ++i) {
747  test_close_before_call_create();
748  test_close_before_client_send();
749  test_close_before_server_recv();
750  test_close_before_server_send();
751  }
752 
753  grpc_shutdown();
754 
755  return 0;
756 }
757 
758 #else /* GRPC_POSIX_SOCKET_TCP */
759 
760 int main(int argc, char** argv) { return 1; }
761 
762 #endif /* GRPC_POSIX_SOCKET_TCP */
grpc_arg
Definition: grpc_types.h:103
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
grpc_slice_unref
GPRAPI void grpc_slice_unref(grpc_slice s)
Definition: slice_api.cc:32
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
grpc_op::grpc_op_data::grpc_op_send_message::send_message
struct grpc_byte_buffer * send_message
Definition: grpc_types.h:668
grpc_op::flags
uint32_t flags
Definition: grpc_types.h:644
grpc_call_error
grpc_call_error
Definition: grpc_types.h:464
grpc_call_details_destroy
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details)
Definition: call_details.cc:36
grpc_call_details_init
GRPCAPI void grpc_call_details_init(grpc_call_details *details)
Definition: call_details.cc:30
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::trailing_metadata
grpc_metadata_array * trailing_metadata
Definition: grpc_types.h:701
grpc_timeout_seconds_to_deadline
gpr_timespec grpc_timeout_seconds_to_deadline(int64_t time_s)
Definition: test/core/util/test_config.cc:81
log.h
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::status
grpc_status_code * status
Definition: grpc_types.h:702
GRPC_STATUS_UNAVAILABLE
@ GRPC_STATUS_UNAVAILABLE
Definition: include/grpc/impl/codegen/status.h:143
grpc_raw_byte_buffer_create
GRPCAPI grpc_byte_buffer * grpc_raw_byte_buffer_create(grpc_slice *slices, size_t nslices)
Definition: byte_buffer.cc:34
generate.env
env
Definition: generate.py:37
memset
return memset(p, 0, total)
grpc_completion_queue_create_for_pluck
GRPCAPI grpc_completion_queue * grpc_completion_queue_create_for_pluck(void *reserved)
Definition: completion_queue_factory.cc:69
grpc_slice_from_copied_string
GPRAPI grpc_slice grpc_slice_from_copied_string(const char *source)
Definition: slice/slice.cc:177
grpc_op::grpc_op_data::send_initial_metadata
struct grpc_op::grpc_op_data::grpc_op_send_initial_metadata send_initial_metadata
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
grpc_core::Server::channel_args
const grpc_channel_args * channel_args() const
Definition: src/core/lib/surface/server.h:132
grpc::testing::end_test
static void end_test(grpc_end2end_test_fixture *f)
Definition: h2_ssl_cert_test.cc:295
grpc_metadata_array
Definition: grpc_types.h:579
grpc_call_details
Definition: grpc_types.h:585
GRPC_CLIENT_DIRECT_CHANNEL
@ GRPC_CLIENT_DIRECT_CHANNEL
Definition: channel_stack_type.h:34
grpc_op::reserved
void * reserved
Definition: grpc_types.h:646
string.h
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
test_init
static void test_init()
Definition: fork_test.cc:24
grpc_endpoint::vtable
const grpc_endpoint_vtable * vtable
Definition: endpoint.h:106
error
grpc_error_handle error
Definition: retry_filter.cc:499
grpc_status_code
grpc_status_code
Definition: include/grpc/impl/codegen/status.h:28
GRPC_QUEUE_SHUTDOWN
@ GRPC_QUEUE_SHUTDOWN
Definition: grpc_types.h:554
GRPC_OP_COMPLETE
@ GRPC_OP_COMPLETE
Definition: grpc_types.h:558
grpc_core::ChannelArgs::FromC
static ChannelArgs FromC(const grpc_channel_args *args)
Definition: channel_args.cc:84
completion_queue.h
grpc_server_create
GRPCAPI grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
Definition: src/core/lib/surface/server.cc:1456
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
GRPC_CALL_OK
@ GRPC_CALL_OK
Definition: grpc_types.h:466
status
absl::Status status
Definition: rls.cc:251
grpc_server_register_completion_queue
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
Definition: src/core/lib/surface/server.cc:1466
grpc_endpoint_pair::server
grpc_endpoint * server
Definition: endpoint_pair.h:28
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
time.h
grpc_channel_arg_string_create
grpc_arg grpc_channel_arg_string_create(char *name, char *value)
Definition: channel_args.cc:476
grpc_channel_args
Definition: grpc_types.h:132
grpc_op::grpc_op_data::recv_message
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
call
FilterStackCall * call
Definition: call.cc:750
grpc_op::data
union grpc_op::grpc_op_data data
byte_buffer_reader.h
client
static uv_tcp_t client
Definition: test-callback-stack.c:33
endpoint_pair.h
grpc_metadata_array_destroy
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
Definition: metadata_array.cc:35
grpc_op::grpc_op_data::grpc_op_recv_message::recv_message
struct grpc_byte_buffer ** recv_message
Definition: grpc_types.h:693
grpc_server_request_call
GRPCAPI grpc_call_error grpc_server_request_call(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
Definition: src/core/lib/surface/server.cc:1526
trailing_metadata_recv
static grpc_metadata_array trailing_metadata_recv
Definition: test/core/fling/client.cc:43
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
GRPC_ARG_DEFAULT_AUTHORITY
#define GRPC_ARG_DEFAULT_AUTHORITY
Definition: grpc_types.h:251
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GRPC_STATUS_OK
@ GRPC_STATUS_OK
Definition: include/grpc/impl/codegen/status.h:30
GRPC_OP_RECV_INITIAL_METADATA
@ GRPC_OP_RECV_INITIAL_METADATA
Definition: grpc_types.h:617
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc::testing::shutdown_server
static void shutdown_server(grpc_end2end_test_fixture *f)
Definition: h2_ssl_cert_test.cc:280
GRPC_OP_SEND_STATUS_FROM_SERVER
@ GRPC_OP_SEND_STATUS_FROM_SERVER
Definition: grpc_types.h:612
tag
static void * tag(intptr_t t)
Definition: bad_client.cc:318
grpc_call_unref
GRPCAPI void grpc_call_unref(grpc_call *call)
Definition: call.cc:1770
grpc_op::grpc_op_data::grpc_op_send_status_from_server::status
grpc_status_code status
Definition: grpc_types.h:673
grpc_timeout_milliseconds_to_deadline
gpr_timespec grpc_timeout_milliseconds_to_deadline(int64_t time_ms)
Definition: test/core/util/test_config.cc:89
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_event
Definition: grpc_types.h:564
grpc_completion_queue
Definition: completion_queue.cc:347
transport
grpc_transport transport
Definition: filter_fuzzer.cc:146
test_ctx
Definition: test-ipc-send-recv.c:43
grpc.h
grpc_call
struct grpc_call grpc_call
Definition: grpc_types.h:70
response_payload_recv
static grpc_byte_buffer * response_payload_recv
Definition: test/core/fling/client.cc:44
grpc_byte_buffer
Definition: grpc_types.h:43
grpc_cq_pollset
grpc_pollset * grpc_cq_pollset(grpc_completion_queue *cq)
Definition: completion_queue.cc:1433
grpc_op
Definition: grpc_types.h:640
GRPC_OP_SEND_MESSAGE
@ GRPC_OP_SEND_MESSAGE
Definition: grpc_types.h:602
main
int main(int argc, char **argv)
Definition: close_fd_test.cc:760
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
grpc_slice_from_static_string
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
Definition: slice/slice.cc:89
was_cancelled
static int was_cancelled
Definition: test/core/fling/server.cc:58
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
close
#define close
Definition: test-fs.c:48
grpc_server
struct grpc_server grpc_server
Definition: grpc_types.h:65
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
request_metadata_recv
static grpc_metadata_array request_metadata_recv
Definition: test/core/fling/server.cc:48
grpc_server_destroy
GRPCAPI void grpc_server_destroy(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1519
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
client_setup_transport
static void client_setup_transport(void *ts, grpc_transport *transport)
Definition: h2_sockpair+trace.cc:75
grpc_core::ExecCtx
Definition: exec_ctx.h:97
grpc_op::op
grpc_op_type op
Definition: grpc_types.h:642
grpc_op::grpc_op_data::grpc_op_send_initial_metadata::count
size_t count
Definition: grpc_types.h:653
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::status_details
grpc_slice * status_details
Definition: grpc_types.h:703
details
static grpc_slice details
Definition: test/core/fling/client.cc:46
test_config.h
grpc_channel_create_call
GRPCAPI grpc_call * grpc_channel_create_call(grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask, grpc_completion_queue *completion_queue, grpc_slice method, const grpc_slice *host, gpr_timespec deadline, void *reserved)
Definition: channel.cc:311
grpc_op::grpc_op_data::recv_close_on_server
struct grpc_op::grpc_op_data::grpc_op_recv_close_on_server recv_close_on_server
GRPC_OP_RECV_MESSAGE
@ GRPC_OP_RECV_MESSAGE
Definition: grpc_types.h:621
grpc_completion_queue_pluck
GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cq, void *tag, gpr_timespec deadline, void *reserved)
Definition: completion_queue.cc:1328
GRPC_STATUS__DO_NOT_USE
@ GRPC_STATUS__DO_NOT_USE
Definition: include/grpc/impl/codegen/status.h:149
server_setup_transport
static void server_setup_transport(void *ts, grpc_transport *transport)
Definition: bad_client.cc:67
grpc_core::Server
Definition: src/core/lib/surface/server.h:75
GRPC_PROPAGATE_DEFAULTS
#define GRPC_PROPAGATE_DEFAULTS
Definition: propagation_bits.h:45
grpc_op::grpc_op_data::send_status_from_server
struct grpc_op::grpc_op_data::grpc_op_send_status_from_server send_status_from_server
grpc_completion_queue_destroy
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq)
Definition: completion_queue.cc:1424
GRPC_OP_SEND_INITIAL_METADATA
@ GRPC_OP_SEND_INITIAL_METADATA
Definition: grpc_types.h:598
port.h
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_endpoint_pair::client
grpc_endpoint * client
Definition: endpoint_pair.h:27
grpc_op::grpc_op_data::send_message
struct grpc_op::grpc_op_data::grpc_op_send_message send_message
absl::str_format_internal::LengthMod::t
@ t
alloc.h
grpc_op::grpc_op_data::recv_status_on_client
struct grpc_op::grpc_op_data::grpc_op_recv_status_on_client recv_status_on_client
grpc_iomgr_create_endpoint_pair
grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(const char *name, grpc_channel_args *args)
grpc_op::grpc_op_data::grpc_op_send_status_from_server::trailing_metadata_count
size_t trailing_metadata_count
Definition: grpc_types.h:671
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
shutdown_client
static void shutdown_client(grpc_endpoint **client_fd)
Definition: bad_client.cc:85
chttp2_transport.h
grpc_server_shutdown_and_notify
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
Definition: src/core/lib/surface/server.cc:1503
grpc_byte_buffer_destroy
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)
Definition: byte_buffer.cc:81
grpc_completion_queue_next
GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq, gpr_timespec deadline, void *reserved)
Definition: completion_queue.cc:1133
grpc_completion_queue_shutdown
GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue *cq)
Definition: completion_queue.cc:1416
grpc_channel_destroy
GRPCAPI void grpc_channel_destroy(grpc_channel *channel)
Definition: channel.cc:437
server.h
grpc_channel
struct grpc_channel grpc_channel
Definition: grpc_types.h:62
grpc_transport
Definition: transport_impl.h:89
GRPC_OP_RECV_CLOSE_ON_SERVER
@ GRPC_OP_RECV_CLOSE_ON_SERVER
Definition: grpc_types.h:633
grpc_endpoint_vtable::get_fd
int(* get_fd)(grpc_endpoint *ep)
Definition: endpoint.h:51
grpc_completion_queue_create_for_next
GRPCAPI grpc_completion_queue * grpc_completion_queue_create_for_next(void *reserved)
Definition: completion_queue_factory.cc:62
grpc_op::grpc_op_data::recv_initial_metadata
struct grpc_op::grpc_op_data::grpc_op_recv_initial_metadata recv_initial_metadata
grpc_op::grpc_op_data::grpc_op_send_status_from_server::status_details
grpc_slice * status_details
Definition: grpc_types.h:677
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
gpr_timespec
Definition: gpr_types.h:50
grpc_event::type
grpc_completion_type type
Definition: grpc_types.h:566
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_server_start
GRPCAPI void grpc_server_start(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1497
GRPC_OP_RECV_STATUS_ON_CLIENT
@ GRPC_OP_RECV_STATUS_ON_CLIENT
Definition: grpc_types.h:627
grpc_op::grpc_op_data::grpc_op_recv_initial_metadata::recv_initial_metadata
grpc_metadata_array * recv_initial_metadata
Definition: grpc_types.h:685
grpc_endpoint_pair
Definition: endpoint_pair.h:26
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
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
grpc_event::success
int success
Definition: grpc_types.h:572
ops
static grpc_op ops[6]
Definition: test/core/fling/client.cc:39
initial_metadata_recv
static grpc_metadata_array initial_metadata_recv
Definition: test/core/fling/client.cc:42
GRPC_QUEUE_TIMEOUT
@ GRPC_QUEUE_TIMEOUT
Definition: grpc_types.h:556
grpc_call_start_batch
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, size_t nops, void *tag, void *reserved)
Definition: call.cc:1831
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
grpc::testing::drain_cq
static void drain_cq(grpc_completion_queue *cq)
Definition: h2_ssl_cert_test.cc:271
grpc_event::tag
void * tag
Definition: grpc_types.h:576
grpc_op::grpc_op_data::grpc_op_recv_close_on_server::cancelled
int * cancelled
Definition: grpc_types.h:714
grpc_core::Channel::Create
static absl::StatusOr< RefCountedPtr< Channel > > Create(const char *target, ChannelArgs args, grpc_channel_stack_type channel_stack_type, grpc_transport *optional_transport)
Definition: channel.cc:202
cq
static grpc_completion_queue * cq
Definition: test/core/fling/client.cc:37
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_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_OP_SEND_CLOSE_FROM_CLIENT
@ GRPC_OP_SEND_CLOSE_FROM_CLIENT
Definition: grpc_types.h:607
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
call_details
static grpc_call_details call_details
Definition: test/core/fling/server.cc:47
grpc_metadata_array_init
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array)
Definition: metadata_array.cc:30
channel.h


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:56