test/core/fling/client.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 
19 #include <stdio.h>
20 #include <string.h>
21 
22 #include <grpc/grpc.h>
23 #include <grpc/grpc_security.h>
24 #include <grpc/support/log.h>
25 #include <grpc/support/time.h>
26 
29 #include "test/core/util/cmdline.h"
33 
38 static grpc_call* call;
39 static grpc_op ops[6];
47 static grpc_op* op;
48 
49 static void init_ping_pong_request(void) {
52 
53  memset(ops, 0, sizeof(ops));
54  op = ops;
55 
58  op++;
61  op++;
63  op++;
66  op++;
69  op++;
74  op++;
75 }
76 
77 static void step_ping_pong_request(void) {
78  GPR_TIMER_SCOPE("ping_pong", 1);
79  grpc_slice host = grpc_slice_from_static_string("localhost");
82  grpc_slice_from_static_string("/Reflector/reflectUnary"), &host,
85  (size_t)(op - ops), (void*)1,
86  nullptr));
90  call = nullptr;
91 }
92 
93 static void init_ping_pong_stream(void) {
95 
97  grpc_slice host = grpc_slice_from_static_string("localhost");
100  grpc_slice_from_static_string("/Reflector/reflectStream"), &host,
108  reinterpret_cast<void*>(1), nullptr);
111 
113 
118 }
119 
120 static void step_ping_pong_stream(void) {
121  GPR_TIMER_SCOPE("ping_pong", 1);
124  reinterpret_cast<void*>(1), nullptr);
128 }
129 
130 static double now(void) {
132  return 1e9 * static_cast<double>(tv.tv_sec) + tv.tv_nsec;
133 }
134 
135 typedef struct {
136  const char* name;
137  void (*init)();
138  void (*do_one_step)();
139 } scenario;
140 
141 static const scenario scenarios[] = {
142  {"ping-pong-request", init_ping_pong_request, step_ping_pong_request},
143  {"ping-pong-stream", init_ping_pong_stream, step_ping_pong_stream},
144 };
145 
146 int main(int argc, char** argv) {
148  double start, stop;
149  unsigned i;
150 
151  int fake_argc = 1;
152  char* fake_argv[1];
153 
154  int payload_size = 1;
155  int secure = 0;
156  const char* target = "localhost:443";
157  gpr_cmdline* cl;
158  grpc_event event;
159  const char* scenario_name = "ping-pong-request";
160  scenario sc = {nullptr, nullptr, nullptr};
161 
162  gpr_timers_set_log_filename("latency_trace.fling_client.txt");
163 
164  GPR_ASSERT(argc >= 1);
165  fake_argv[0] = argv[0];
166  grpc::testing::TestEnvironment env(&fake_argc, fake_argv);
167 
168  grpc_init();
169 
170  int warmup_seconds = 1;
171  int benchmark_seconds = 5;
172 
173  cl = gpr_cmdline_create("fling client");
174  gpr_cmdline_add_int(cl, "payload_size", "Size of the payload to send",
175  &payload_size);
176  gpr_cmdline_add_string(cl, "target", "Target host:port", &target);
177  gpr_cmdline_add_flag(cl, "secure", "Run with security?", &secure);
178  gpr_cmdline_add_string(cl, "scenario", "Scenario", &scenario_name);
179  gpr_cmdline_add_int(cl, "warmup", "Warmup seconds", &warmup_seconds);
180  gpr_cmdline_add_int(cl, "benchmark", "Benchmark seconds", &benchmark_seconds);
181  gpr_cmdline_parse(cl, argc, argv);
183 
184  for (i = 0; i < GPR_ARRAY_SIZE(scenarios); i++) {
185  if (0 == strcmp(scenarios[i].name, scenario_name)) {
186  sc = scenarios[i];
187  }
188  }
189  if (!sc.name) {
190  fprintf(stderr, "unsupported scenario '%s'. Valid are:", scenario_name);
191  fflush(stderr);
192  for (i = 0; i < GPR_ARRAY_SIZE(scenarios); i++) {
193  fprintf(stderr, " %s", scenarios[i].name);
194  fflush(stderr);
195  }
196  return 1;
197  }
198 
200  channel = grpc_channel_create(target, creds, nullptr);
203  the_buffer =
204  grpc_raw_byte_buffer_create(&slice, static_cast<size_t>(payload_size));
205  histogram = grpc_histogram_create(0.01, 60e9);
206 
207  sc.init();
208 
209  gpr_timespec end_warmup = grpc_timeout_seconds_to_deadline(warmup_seconds);
210  gpr_timespec end_profiling =
211  grpc_timeout_seconds_to_deadline(warmup_seconds + benchmark_seconds);
212 
213  while (gpr_time_cmp(gpr_now(end_warmup.clock_type), end_warmup) < 0) {
214  sc.do_one_step();
215  }
216 
217  gpr_log(GPR_INFO, "start profiling");
218  grpc_profiler_start("client.prof");
219  while (gpr_time_cmp(gpr_now(end_profiling.clock_type), end_profiling) < 0) {
220  start = now();
221  sc.do_one_step();
222  stop = now();
224  }
226 
227  if (call) {
229  }
230 
233  do {
235  nullptr);
236  } while (event.type != GRPC_QUEUE_SHUTDOWN);
240 
241  gpr_log(GPR_INFO, "latency (50/95/99/99.9): %f/%f/%f/%f",
247 
248  grpc_shutdown();
249 
250  return 0;
251 }
gpr_timespec::tv_nsec
int32_t tv_nsec
Definition: gpr_types.h:52
grpc_slice_unref
GPRAPI void grpc_slice_unref(grpc_slice s)
Definition: slice_api.cc:32
gpr_timespec::tv_sec
int64_t tv_sec
Definition: gpr_types.h:51
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_call_error
grpc_call_error
Definition: grpc_types.h:464
now
static double now(void)
Definition: test/core/fling/client.cc:130
init
const char * init
Definition: upb/upb/bindings/lua/main.c:49
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_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)
init_ping_pong_request
static void init_ping_pong_request(void)
Definition: test/core/fling/client.cc:49
timers.h
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
GPR_TIMER_SCOPE
#define GPR_TIMER_SCOPE(tag, important)
Definition: src/core/lib/profiling/timers.h:43
grpc_metadata_array
Definition: grpc_types.h:579
string.h
step_ping_pong_stream
static void step_ping_pong_stream(void)
Definition: test/core/fling/client.cc:120
useful.h
gpr_cmdline_destroy
void gpr_cmdline_destroy(gpr_cmdline *cl)
Definition: cmdline.cc:79
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
scenario::name
const char * name
Definition: test/core/fling/client.cc:136
GRPC_CALL_OK
@ GRPC_CALL_OK
Definition: grpc_types.h:466
the_buffer
static grpc_byte_buffer * the_buffer
Definition: test/core/fling/client.cc:35
gpr_inf_future
GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type)
Definition: src/core/lib/gpr/time.cc:55
setup.name
name
Definition: setup.py:542
time.h
grpc_security.h
gpr_cmdline_add_flag
void gpr_cmdline_add_flag(gpr_cmdline *cl, const char *name, const char *help, int *value)
Definition: cmdline.cc:110
step_ping_pong_request
static void step_ping_pong_request(void)
Definition: test/core/fling/client.cc:77
stream_init_ops
static grpc_op stream_init_ops[2]
Definition: test/core/fling/client.cc:40
init_ping_pong_stream
static void init_ping_pong_stream(void)
Definition: test/core/fling/client.cc:93
grpc_op::grpc_op_data::recv_message
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
scenario
Definition: test/core/fling/client.cc:135
grpc_profiler_start
void grpc_profiler_start(const char *filename)
Definition: grpc_profiler.cc:30
python_utils.port_server.stderr
stderr
Definition: port_server.py:51
grpc_op::data
union grpc_op::grpc_op_data data
stream_step_ops
static grpc_op stream_step_ops[2]
Definition: test/core/fling/client.cc:41
grpc_op::grpc_op_data::grpc_op_recv_message::recv_message
struct grpc_byte_buffer ** recv_message
Definition: grpc_types.h:693
trailing_metadata_recv
static grpc_metadata_array trailing_metadata_recv
Definition: test/core/fling/client.cc:43
start
static uint64_t start
Definition: benchmark-pound.c:74
performance.loadtest_config.scenario_name
def scenario_name(str base_name, Optional[int] client_channels, Optional[int] server_threads, Optional[int] offered_load)
Definition: loadtest_config.py:121
gpr_timers_set_log_filename
void gpr_timers_set_log_filename(const char *)
Definition: basic_timers.cc:292
grpc_histogram_destroy
void grpc_histogram_destroy(grpc_histogram *h)
Definition: histogram.cc:99
grpc_histogram
Definition: histogram.cc:37
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
scenario::init
void(* init)()
Definition: test/core/fling/client.cc:137
gpr_time_cmp
GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:30
grpc_call_unref
GRPCAPI void grpc_call_unref(grpc_call *call)
Definition: call.cc:1770
slice
grpc_slice slice
Definition: src/core/lib/surface/server.cc:467
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
gpr_cmdline_add_string
void gpr_cmdline_add_string(gpr_cmdline *cl, const char *name, const char *help, const char **value)
Definition: cmdline.cc:115
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_insecure_credentials_create
GRPCAPI grpc_channel_credentials * grpc_insecure_credentials_create()
Definition: core/lib/security/credentials/insecure/insecure_credentials.cc:64
grpc_op
Definition: grpc_types.h:640
GRPC_OP_SEND_MESSAGE
@ GRPC_OP_SEND_MESSAGE
Definition: grpc_types.h:602
histogram
static grpc_histogram * histogram
Definition: test/core/fling/client.cc:34
grpc_slice_from_static_string
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
Definition: slice/slice.cc:89
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
status
static grpc_status_code status
Definition: test/core/fling/client.cc:45
scenarios
static const scenario scenarios[]
Definition: test/core/fling/client.cc:141
grpc_histogram_percentile
double grpc_histogram_percentile(grpc_histogram *h, double percentile)
Definition: histogram.cc:198
grpc_profiler.h
histogram.h
gpr_now
GPRAPI gpr_timespec gpr_now(gpr_clock_type clock)
grpc_histogram_create
grpc_histogram * grpc_histogram_create(double resolution, double max_bucket_start)
Definition: histogram.cc:77
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
gpr_timespec::clock_type
gpr_clock_type clock_type
Definition: gpr_types.h:55
details
static grpc_slice details
Definition: test/core/fling/client.cc:46
test_config.h
grpc_channel_credentials_release
GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials *creds)
Definition: credentials.cc:36
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_RECV_MESSAGE
@ GRPC_OP_RECV_MESSAGE
Definition: grpc_types.h:621
GPR_ARRAY_SIZE
#define GPR_ARRAY_SIZE(array)
Definition: useful.h:129
grpc_channel_create
GRPCAPI grpc_channel * grpc_channel_create(const char *target, grpc_channel_credentials *creds, const grpc_channel_args *args)
Definition: chttp2_connector.cc:366
gpr_cmdline_add_int
void gpr_cmdline_add_int(gpr_cmdline *cl, const char *name, const char *help, int *value)
Definition: cmdline.cc:105
GRPC_PROPAGATE_DEFAULTS
#define GRPC_PROPAGATE_DEFAULTS
Definition: propagation_bits.h:45
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
grpc_op::grpc_op_data::send_message
struct grpc_op::grpc_op_data::grpc_op_send_message send_message
call
static grpc_call * call
Definition: test/core/fling/client.cc:38
cmdline.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::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
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_profiler_stop
void grpc_profiler_stop(void)
Definition: grpc_profiler.cc:44
grpc_completion_queue_shutdown
GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue *cq)
Definition: completion_queue.cc:1416
gpr_cmdline_create
gpr_cmdline * gpr_cmdline_create(const char *description)
Definition: cmdline.cc:66
grpc_channel_destroy
GRPCAPI void grpc_channel_destroy(grpc_channel *channel)
Definition: channel.cc:437
grpc_channel
struct grpc_channel grpc_channel
Definition: grpc_types.h:62
stop
static const char stop[]
Definition: benchmark-async-pummel.c:35
gpr_cmdline
Definition: cmdline.cc:48
grpc_histogram_add
void grpc_histogram_add(grpc_histogram *h, double x)
Definition: histogram.cc:104
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
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_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
GPR_CLOCK_REALTIME
@ GPR_CLOCK_REALTIME
Definition: gpr_types.h:39
scenario::do_one_step
void(* do_one_step)()
Definition: test/core/fling/client.cc:138
main
int main(int argc, char **argv)
Definition: test/core/fling/client.cc:146
channel
static grpc_channel * channel
Definition: test/core/fling/client.cc:36
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
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_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
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
grpc_channel_credentials
Definition: src/core/lib/security/credentials/credentials.h:96
cq
static grpc_completion_queue * cq
Definition: test/core/fling/client.cc:37
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
grpc_metadata_array_init
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array)
Definition: metadata_array.cc:30
gpr_cmdline_parse
int gpr_cmdline_parse(gpr_cmdline *cl, int argc, char **argv)
Definition: cmdline.cc:309


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