reconnect_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 
21 #include <string.h>
22 
23 #include "absl/strings/string_view.h"
24 
25 #include <grpc/grpc.h>
26 #include <grpc/support/alloc.h>
27 #include <grpc/support/log.h>
29 #include <grpc/support/sync.h>
30 #include <grpc/support/time.h>
31 
35 #include "test/core/util/port.h"
37 
40  int i = 1;
41  double expected_backoff = 1000.0, backoff;
42  timestamp_list* head = server->head;
43  gpr_log(GPR_INFO, "reconnect server: new connection");
44  for (head = server->head; head && head->next; head = head->next, i++) {
45  diff = gpr_time_sub(head->next->timestamp, head->timestamp);
46  backoff = gpr_time_to_millis(diff);
48  "retry %2d:backoff %6.2fs,expected backoff %6.2fs, jitter %4.2f%%",
49  i, backoff / 1000.0, expected_backoff / 1000.0,
50  (backoff - expected_backoff) * 100.0 / expected_backoff);
51  expected_backoff *= 1.6;
52  int max_reconnect_backoff_ms = 120 * 1000;
53  if (server->max_reconnect_backoff_ms > 0) {
54  max_reconnect_backoff_ms = server->max_reconnect_backoff_ms;
55  }
56  if (expected_backoff > max_reconnect_backoff_ms) {
57  expected_backoff = max_reconnect_backoff_ms;
58  }
59  }
60 }
61 
62 static void on_connect(void* arg, grpc_endpoint* tcp,
63  grpc_pollset* /*accepting_pollset*/,
64  grpc_tcp_server_acceptor* acceptor) {
65  gpr_free(acceptor);
66  absl::string_view peer;
68  reconnect_server* server = static_cast<reconnect_server*>(arg);
70  timestamp_list* new_tail;
75  last_colon = peer.rfind(':');
76  if (server->peer == nullptr) {
77  server->peer = new std::string(peer);
78  } else {
79  if (last_colon == std::string::npos) {
80  gpr_log(GPR_ERROR, "peer does not contain a ':'");
81  } else if (peer.compare(0, static_cast<size_t>(last_colon),
82  *server->peer) != 0) {
83  gpr_log(GPR_ERROR, "mismatched peer! %s vs %s", server->peer->c_str(),
84  std::string(peer).c_str());
85  }
86  }
87  new_tail = static_cast<timestamp_list*>(gpr_malloc(sizeof(timestamp_list)));
88  new_tail->timestamp = now;
89  new_tail->next = nullptr;
90  if (server->tail == nullptr) {
91  server->head = new_tail;
92  server->tail = new_tail;
93  } else {
94  server->tail->next = new_tail;
95  server->tail = new_tail;
96  }
98 }
99 
102  server->head = nullptr;
103  server->tail = nullptr;
104  server->peer = nullptr;
105  server->max_reconnect_backoff_ms = 0;
106 }
107 
109  test_tcp_server_start(&server->tcp_server, port);
110 }
111 
113  test_tcp_server_poll(&server->tcp_server, 1000 * seconds);
114 }
115 
117  timestamp_list* new_head = server->head;
118  while (server->head) {
119  new_head = server->head->next;
120  gpr_free(server->head);
121  server->head = new_head;
122  }
123  server->tail = nullptr;
124  delete server->peer;
125  server->peer = nullptr;
126 }
127 
130  test_tcp_server_destroy(&server->tcp_server);
131 }
timestamp_list::next
struct timestamp_list * next
Definition: reconnect_server.h:29
absl::time_internal::cctz::seconds
std::chrono::duration< std::int_fast64_t > seconds
Definition: abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h:40
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
test_tcp_server_init
void test_tcp_server_init(test_tcp_server *server, grpc_tcp_server_cb on_connect, void *user_data)
Definition: test_tcp_server.cc:43
reconnect_server_destroy
void reconnect_server_destroy(reconnect_server *server)
Definition: reconnect_server.cc:128
now
static double now(void)
Definition: test/core/fling/client.cc:130
log.h
port.h
test_tcp_server_start
void test_tcp_server_start(test_tcp_server *server, int port)
Definition: test_tcp_server.cc:57
string.h
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
reconnect_server_clear_timestamps
void reconnect_server_clear_timestamps(reconnect_server *server)
Definition: reconnect_server.cc:116
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_endpoint_get_peer
absl::string_view grpc_endpoint_get_peer(grpc_endpoint *ep)
Definition: endpoint.cc:55
tcp
static uv_tcp_t tcp
Definition: test-connection-fail.c:29
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
time.h
sockaddr.h
test_tcp_server_destroy
void test_tcp_server_destroy(test_tcp_server *server)
Definition: test_tcp_server.cc:103
string_util.h
test_tcp_server.h
gpr_time_sub
GPRAPI gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:168
pretty_print_backoffs
static void pretty_print_backoffs(reconnect_server *server)
Definition: reconnect_server.cc:38
timestamp_list::timestamp
gpr_timespec timestamp
Definition: reconnect_server.h:28
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc.h
reconnect_server
Definition: reconnect_server.h:32
on_connect
static void on_connect(void *arg, grpc_endpoint *tcp, grpc_pollset *, grpc_tcp_server_acceptor *acceptor)
Definition: reconnect_server.cc:62
timestamp_list
Definition: reconnect_server.h:27
gpr_time_to_millis
GPRAPI int32_t gpr_time_to_millis(gpr_timespec timespec)
Definition: src/core/lib/gpr/time.cc:221
test_tcp_server_poll
void test_tcp_server_poll(test_tcp_server *server, int milliseconds)
Definition: test_tcp_server.cc:87
bm_diff.diff
diff
Definition: bm_diff.py:274
arg
Definition: cmdline.cc:40
grpc_endpoint_shutdown
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
Definition: endpoint.cc:49
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_endpoint_destroy
void grpc_endpoint_destroy(grpc_endpoint *ep)
Definition: endpoint.cc:53
gpr_now
GPRAPI gpr_timespec gpr_now(gpr_clock_type clock)
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
absl::string_view::size_type
size_t size_type
Definition: abseil-cpp/absl/strings/string_view.h:179
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
reconnect_server.h
server
Definition: examples/python/async_streaming/server.py:1
grpc_tcp_server_acceptor
Definition: tcp_server.h:36
absl::string_view::rfind
size_type rfind(string_view s, size_type pos=npos) const noexcept
Definition: abseil-cpp/absl/strings/string_view.cc:101
alloc.h
absl::string_view::compare
constexpr int compare(string_view x) const noexcept
Definition: abseil-cpp/absl/strings/string_view.h:413
reconnect_server_poll
void reconnect_server_poll(reconnect_server *server, int seconds)
Definition: reconnect_server.cc:112
arg
struct arg arg
reconnect_server_start
void reconnect_server_start(reconnect_server *server, int port)
Definition: reconnect_server.cc:108
reconnect_server_init
void reconnect_server_init(reconnect_server *server)
Definition: reconnect_server.cc:100
gpr_timespec
Definition: gpr_types.h:50
endpoint.h
GPR_CLOCK_REALTIME
@ GPR_CLOCK_REALTIME
Definition: gpr_types.h:39
tcp_server.h
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
sync.h
grpc_endpoint
Definition: endpoint.h:105
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:07