grpc 1.65.0.pre2 → 1.65.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e1c684cfc2c4e1df05e4701975712425fac876386cea081d92d5183693e26117
4
- data.tar.gz: 24d0aa0073447a1473138d065145692d60e700be516ff58d7a0660976436fe0d
3
+ metadata.gz: d88e35610af868428e19e63fc9fb6018ee4fc56996eb09a3c6631fb811be880f
4
+ data.tar.gz: 7d92092c09d6eb7eefc895f1fcdae769a6b24f045c1d8d9c2800f468ae18af4f
5
5
  SHA512:
6
- metadata.gz: de0f1955ca4d661808ec6577dc6f2a9813899a3b1efaf7c25944036a2ca772ce57fe6c7e5865221a08ba85e07bdb432aef22f8d3a8c3cff4fd73547e4fbed107
7
- data.tar.gz: ccd6b4946c590e00b8b36abe813fb5301451b0489438a327a3df7ed4059ef9296964bf3bc0e38760806b6efd1069c0ca865521b1d055951cd5c9c117e4a72b84
6
+ metadata.gz: f66411122b76358dde1eae1d1ae9e54a5e1a01263b6dce493aa025bd40bcc9a247fff47396856ecb6dc07a7bda36e53d77b0d5d040191e3ff6ba05603a59f9e0
7
+ data.tar.gz: 2ff59d840774abd6adba54950d5d75f4d3208e27fb70dcf493c24ee92f932371cab38e15b5d8de3ceb2afc3ceca7da6f40e9422b96f0466d5291d55990a3e912
data/Makefile CHANGED
@@ -368,7 +368,7 @@ Q = @
368
368
  endif
369
369
 
370
370
  CORE_VERSION = 42.0.0
371
- CPP_VERSION = 1.65.0-pre2
371
+ CPP_VERSION = 1.65.1
372
372
 
373
373
  CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
374
374
  CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
@@ -70,8 +70,8 @@ class InprocServerTransport final : public ServerTransport {
70
70
  void SetPollset(grpc_stream*, grpc_pollset*) override {}
71
71
  void SetPollsetSet(grpc_stream*, grpc_pollset_set*) override {}
72
72
  void PerformOp(grpc_transport_op* op) override {
73
- gpr_log(GPR_INFO, "inproc server op: %s",
74
- grpc_transport_op_string(op).c_str());
73
+ GRPC_TRACE_LOG(inproc, INFO)
74
+ << "inproc server op: " << grpc_transport_op_string(op);
75
75
  if (op->start_connectivity_watch != nullptr) {
76
76
  MutexLock lock(&state_tracker_mu_);
77
77
  state_tracker_.AddWatcher(op->start_connectivity_watch_state,
@@ -330,8 +330,8 @@ void HttpConnectHandshaker::DoHandshake(grpc_tcp_server_acceptor* /*acceptor*/,
330
330
  // Log connection via proxy.
331
331
  std::string proxy_name(grpc_endpoint_get_peer(args->endpoint));
332
332
  std::string server_name_string(*server_name);
333
- gpr_log(GPR_INFO, "Connecting to server %s via HTTP proxy %s",
334
- server_name_string.c_str(), proxy_name.c_str());
333
+ VLOG(2) << "Connecting to server " << server_name_string << " via HTTP proxy "
334
+ << proxy_name;
335
335
  // Construct HTTP CONNECT request.
336
336
  grpc_http_request request;
337
337
  request.method = const_cast<char*>("CONNECT");
@@ -356,7 +356,8 @@ Epoll1Poller::Epoll1Poller(Scheduler* scheduler)
356
356
  wakeup_fd_ = *CreateWakeupFd();
357
357
  CHECK(wakeup_fd_ != nullptr);
358
358
  CHECK_GE(g_epoll_set_.epfd, 0);
359
- LOG(INFO) << "grpc epoll fd: " << g_epoll_set_.epfd;
359
+ GRPC_TRACE_LOG(event_engine_poller, INFO)
360
+ << "grpc epoll fd: " << g_epoll_set_.epfd;
360
361
  struct epoll_event ev;
361
362
  ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLET);
362
363
  ev.data.ptr = wakeup_fd_.get();
@@ -627,12 +627,15 @@ void PosixSocketWrapper::TrySetSocketTcpUserTimeout(
627
627
  // if it is available.
628
628
  if (g_socket_supports_tcp_user_timeout.load() == 0) {
629
629
  if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
630
+ // This log is intentionally not protected behind a flag, so that users
631
+ // know that TCP_USER_TIMEOUT is not being used.
630
632
  LOG(INFO) << "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT "
631
633
  "won't be used thereafter";
632
634
  g_socket_supports_tcp_user_timeout.store(-1);
633
635
  } else {
634
- LOG(INFO) << "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be "
635
- "used thereafter";
636
+ GRPC_TRACE_LOG(tcp, INFO)
637
+ << "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be "
638
+ "used thereafter";
636
639
  g_socket_supports_tcp_user_timeout.store(1);
637
640
  }
638
641
  }
@@ -266,7 +266,6 @@ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::StartThread() {
266
266
  }
267
267
 
268
268
  void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Quiesce() {
269
- LOG(INFO) << "WorkStealingThreadPoolImpl::Quiesce";
270
269
  SetShutdown(true);
271
270
  // Wait until all threads have exited.
272
271
  // Note that if this is a threadpool thread then we won't exit this thread
@@ -501,7 +501,7 @@ const ExperimentMetadata g_experiment_metadata[] = {
501
501
  additional_constraints_work_serializer_clears_time_cache, nullptr, 0, true,
502
502
  true},
503
503
  {"work_serializer_dispatch", description_work_serializer_dispatch,
504
- additional_constraints_work_serializer_dispatch, nullptr, 0, true, true},
504
+ additional_constraints_work_serializer_dispatch, nullptr, 0, false, true},
505
505
  };
506
506
 
507
507
  } // namespace grpc_core
@@ -158,8 +158,7 @@ inline bool IsTraceRecordCallopsEnabled() { return true; }
158
158
  inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { return false; }
159
159
  #define GRPC_EXPERIMENT_IS_INCLUDED_WORK_SERIALIZER_CLEARS_TIME_CACHE
160
160
  inline bool IsWorkSerializerClearsTimeCacheEnabled() { return true; }
161
- #define GRPC_EXPERIMENT_IS_INCLUDED_WORK_SERIALIZER_DISPATCH
162
- inline bool IsWorkSerializerDispatchEnabled() { return true; }
161
+ inline bool IsWorkSerializerDispatchEnabled() { return false; }
163
162
  #endif
164
163
 
165
164
  #else
@@ -93,9 +93,9 @@ class DualRefCounted : public Impl {
93
93
  #ifndef NDEBUG
94
94
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
95
95
  if (trace_ != nullptr) {
96
- LOG(INFO) << trace_ << ":" << this << " unref " << strong_refs << " -> "
97
- << strong_refs - 1 << ", weak_ref " << weak_refs << " -> "
98
- << weak_refs + 1;
96
+ VLOG(2) << trace_ << ":" << this << " unref " << strong_refs << " -> "
97
+ << strong_refs - 1 << ", weak_ref " << weak_refs << " -> "
98
+ << weak_refs + 1;
99
99
  }
100
100
  CHECK_GT(strong_refs, 0u);
101
101
  #endif
@@ -112,10 +112,10 @@ class DualRefCounted : public Impl {
112
112
  #ifndef NDEBUG
113
113
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
114
114
  if (trace_ != nullptr) {
115
- LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":"
116
- << location.line() << " unref " << strong_refs << " -> "
117
- << strong_refs - 1 << ", weak_ref " << weak_refs << " -> "
118
- << weak_refs + 1 << ") " << reason;
115
+ VLOG(2) << trace_ << ":" << this << " " << location.file() << ":"
116
+ << location.line() << " unref " << strong_refs << " -> "
117
+ << strong_refs - 1 << ", weak_ref " << weak_refs << " -> "
118
+ << weak_refs + 1 << ") " << reason;
119
119
  }
120
120
  CHECK_GT(strong_refs, 0u);
121
121
  #else
@@ -137,9 +137,9 @@ class DualRefCounted : public Impl {
137
137
  #ifndef NDEBUG
138
138
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
139
139
  if (trace_ != nullptr) {
140
- LOG(INFO) << trace_ << ":" << this << " ref_if_non_zero " << strong_refs
141
- << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs
142
- << ")";
140
+ VLOG(2) << trace_ << ":" << this << " ref_if_non_zero " << strong_refs
141
+ << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs
142
+ << ")";
143
143
  }
144
144
  #endif
145
145
  if (strong_refs == 0) return nullptr;
@@ -156,10 +156,10 @@ class DualRefCounted : public Impl {
156
156
  #ifndef NDEBUG
157
157
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
158
158
  if (trace_ != nullptr) {
159
- LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":"
160
- << location.line() << " ref_if_non_zero " << strong_refs
161
- << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs
162
- << ") " << reason;
159
+ VLOG(2) << trace_ << ":" << this << " " << location.file() << ":"
160
+ << location.line() << " ref_if_non_zero " << strong_refs
161
+ << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs
162
+ << ") " << reason;
163
163
  }
164
164
  #else
165
165
  // Avoid unused-parameter warnings for debug-only parameters
@@ -214,8 +214,8 @@ class DualRefCounted : public Impl {
214
214
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
215
215
  const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
216
216
  if (trace != nullptr) {
217
- LOG(INFO) << trace << ":" << this << " weak_unref " << weak_refs << " -> "
218
- << weak_refs - 1 << " (refs=" << strong_refs << ")";
217
+ VLOG(2) << trace << ":" << this << " weak_unref " << weak_refs << " -> "
218
+ << weak_refs - 1 << " (refs=" << strong_refs << ")";
219
219
  }
220
220
  CHECK_GT(weak_refs, 0u);
221
221
  #endif
@@ -236,9 +236,9 @@ class DualRefCounted : public Impl {
236
236
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
237
237
  const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
238
238
  if (trace != nullptr) {
239
- LOG(INFO) << trace << ":" << this << " " << location.file() << ":"
240
- << location.line() << " weak_unref " << weak_refs << " -> "
241
- << weak_refs - 1 << " (refs=" << strong_refs << ") " << reason;
239
+ VLOG(2) << trace << ":" << this << " " << location.file() << ":"
240
+ << location.line() << " weak_unref " << weak_refs << " -> "
241
+ << weak_refs - 1 << " (refs=" << strong_refs << ") " << reason;
242
242
  }
243
243
  CHECK_GT(weak_refs, 0u);
244
244
  #else
@@ -301,8 +301,8 @@ class DualRefCounted : public Impl {
301
301
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
302
302
  CHECK_NE(strong_refs, 0u);
303
303
  if (trace_ != nullptr) {
304
- LOG(INFO) << trace_ << ":" << this << " ref " << strong_refs << " -> "
305
- << strong_refs + 1 << "; (weak_refs=" << weak_refs << ")";
304
+ VLOG(2) << trace_ << ":" << this << " ref " << strong_refs << " -> "
305
+ << strong_refs + 1 << "; (weak_refs=" << weak_refs << ")";
306
306
  }
307
307
  #else
308
308
  refs_.fetch_add(MakeRefPair(1, 0), std::memory_order_relaxed);
@@ -316,10 +316,10 @@ class DualRefCounted : public Impl {
316
316
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
317
317
  CHECK_NE(strong_refs, 0u);
318
318
  if (trace_ != nullptr) {
319
- LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":"
320
- << location.line() << " ref " << strong_refs << " -> "
321
- << strong_refs + 1 << " (weak_refs=" << weak_refs << ") "
322
- << reason;
319
+ VLOG(2) << trace_ << ":" << this << " " << location.file() << ":"
320
+ << location.line() << " ref " << strong_refs << " -> "
321
+ << strong_refs + 1 << " (weak_refs=" << weak_refs << ") "
322
+ << reason;
323
323
  }
324
324
  #else
325
325
  // Use conditionally-important parameters
@@ -336,8 +336,8 @@ class DualRefCounted : public Impl {
336
336
  const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
337
337
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
338
338
  if (trace_ != nullptr) {
339
- LOG(INFO) << trace_ << ":" << this << " weak_ref " << weak_refs << " -> "
340
- << weak_refs + 1 << "; (refs=" << strong_refs << ")";
339
+ VLOG(2) << trace_ << ":" << this << " weak_ref " << weak_refs << " -> "
340
+ << weak_refs + 1 << "; (refs=" << strong_refs << ")";
341
341
  }
342
342
  if (strong_refs == 0) CHECK_NE(weak_refs, 0u);
343
343
  #else
@@ -352,9 +352,9 @@ class DualRefCounted : public Impl {
352
352
  const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
353
353
  const uint32_t weak_refs = GetWeakRefs(prev_ref_pair);
354
354
  if (trace_ != nullptr) {
355
- LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":"
356
- << location.line() << " weak_ref " << weak_refs << " -> "
357
- << weak_refs + 1 << " (refs=" << strong_refs << ") " << reason;
355
+ VLOG(2) << trace_ << ":" << this << " " << location.file() << ":"
356
+ << location.line() << " weak_ref " << weak_refs << " -> "
357
+ << weak_refs + 1 << " (refs=" << strong_refs << ") " << reason;
358
358
  }
359
359
  if (strong_refs == 0) CHECK_NE(weak_refs, 0u);
360
360
  #else
@@ -122,7 +122,7 @@ static bool epoll_set_init() {
122
122
  return false;
123
123
  }
124
124
 
125
- gpr_log(GPR_INFO, "grpc epoll fd: %d", g_epoll_set.epfd);
125
+ GRPC_TRACE_LOG(polling, INFO) << "grpc epoll fd: " << g_epoll_set.epfd;
126
126
  gpr_atm_no_barrier_store(&g_epoll_set.num_events, 0);
127
127
  gpr_atm_no_barrier_store(&g_epoll_set.cursor, 0);
128
128
  return true;
@@ -374,22 +374,21 @@ grpc_error_handle grpc_set_socket_tcp_user_timeout(
374
374
  // if it is available.
375
375
  if (g_socket_supports_tcp_user_timeout.load() == 0) {
376
376
  if (0 != getsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
377
- gpr_log(GPR_INFO,
378
- "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT won't "
379
- "be used thereafter");
377
+ GRPC_TRACE_LOG(tcp, INFO)
378
+ << "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT won't be "
379
+ "used thereafter";
380
380
  g_socket_supports_tcp_user_timeout.store(-1);
381
381
  } else {
382
- gpr_log(GPR_INFO,
383
- "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be "
384
- "used thereafter");
382
+ GRPC_TRACE_LOG(tcp, INFO)
383
+ << "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be used "
384
+ "thereafter";
385
385
  g_socket_supports_tcp_user_timeout.store(1);
386
386
  }
387
387
  }
388
388
  if (g_socket_supports_tcp_user_timeout.load() > 0) {
389
- if (GRPC_TRACE_FLAG_ENABLED(tcp)) {
390
- gpr_log(GPR_INFO, "Enabling TCP_USER_TIMEOUT with a timeout of %d ms",
391
- timeout);
392
- }
389
+ GRPC_TRACE_LOG(tcp, INFO)
390
+ << "Enabling TCP_USER_TIMEOUT with a timeout of " << timeout
391
+ << " ms";
393
392
  if (0 != setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout,
394
393
  sizeof(timeout))) {
395
394
  gpr_log(GPR_ERROR, "setsockopt(TCP_USER_TIMEOUT) %s",
@@ -402,10 +401,9 @@ grpc_error_handle grpc_set_socket_tcp_user_timeout(
402
401
  return absl::OkStatus();
403
402
  }
404
403
  if (newval != timeout) {
405
- gpr_log(GPR_INFO,
406
- "Setting TCP_USER_TIMEOUT to value %d ms. Actual "
407
- "TCP_USER_TIMEOUT value is %d ms",
408
- timeout, newval);
404
+ GRPC_TRACE_LOG(tcp, INFO)
405
+ << "Setting TCP_USER_TIMEOUT to value " << timeout
406
+ << " ms. Actual TCP_USER_TIMEOUT value is " << newval << " ms";
409
407
  return absl::OkStatus();
410
408
  }
411
409
  }
@@ -442,7 +440,8 @@ static void probe_ipv6_once(void) {
442
440
  int fd = socket(AF_INET6, SOCK_STREAM, 0);
443
441
  g_ipv6_loopback_available = 0;
444
442
  if (fd < 0) {
445
- LOG(INFO) << "Disabling AF_INET6 sockets because socket() failed.";
443
+ GRPC_TRACE_LOG(tcp, INFO)
444
+ << "Disabling AF_INET6 sockets because socket() failed.";
446
445
  } else {
447
446
  grpc_sockaddr_in6 addr;
448
447
  memset(&addr, 0, sizeof(addr));
@@ -451,8 +450,8 @@ static void probe_ipv6_once(void) {
451
450
  if (bind(fd, reinterpret_cast<grpc_sockaddr*>(&addr), sizeof(addr)) == 0) {
452
451
  g_ipv6_loopback_available = 1;
453
452
  } else {
454
- gpr_log(GPR_INFO,
455
- "Disabling AF_INET6 sockets because ::1 is not available.");
453
+ GRPC_TRACE_LOG(tcp, INFO)
454
+ << "Disabling AF_INET6 sockets because ::1 is not available.";
456
455
  }
457
456
  close(fd);
458
457
  }
@@ -806,7 +806,6 @@ static void tcp_ref(grpc_tcp* tcp) { tcp->refcount.Ref(); }
806
806
  #endif
807
807
 
808
808
  static void tcp_destroy(grpc_endpoint* ep) {
809
- gpr_log(GPR_INFO, "IOMGR endpoint shutdown");
810
809
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
811
810
  ZerocopyDisableAndWaitForRemaining(tcp);
812
811
  grpc_fd_shutdown(tcp->em_fd, absl::UnavailableError("endpoint shutdown"));
@@ -397,8 +397,8 @@ void TlsChannelSecurityConnector::cancel_check_peer(
397
397
  if (it != pending_verifier_requests_.end()) {
398
398
  pending_verifier_request = it->second->request();
399
399
  } else {
400
- LOG(INFO) << "TlsChannelSecurityConnector::cancel_check_peer: no "
401
- "corresponding pending request found";
400
+ VLOG(2) << "TlsChannelSecurityConnector::cancel_check_peer: no "
401
+ "corresponding pending request found";
402
402
  }
403
403
  }
404
404
  if (pending_verifier_request != nullptr) {
@@ -976,7 +976,7 @@ grpc_error_handle Server::SetupTransport(
976
976
  }
977
977
  t->StartConnectivityWatch(MakeOrphanable<TransportConnectivityWatcher>(
978
978
  t->RefAsSubclass<ServerTransport>(), Ref()));
979
- LOG(INFO) << "Adding connection";
979
+ GRPC_TRACE_LOG(server_channel, INFO) << "Adding connection";
980
980
  connections_.emplace(std::move(t));
981
981
  ++connections_open_;
982
982
  } else {
data/src/core/util/log.cc CHANGED
@@ -132,15 +132,17 @@ void gpr_log_verbosity_init(void) {
132
132
  absl::string_view verbosity = grpc_core::ConfigVars::Get().Verbosity();
133
133
  DVLOG(2) << "Log verbosity: " << verbosity;
134
134
  if (absl::EqualsIgnoreCase(verbosity, "INFO")) {
135
- LOG(WARNING) << "Not suitable for production. Prefer WARNING or ERROR. "
136
- "However if you see this message in a debug environmenmt "
137
- "or test environmenmt it is safe to ignore this message.";
135
+ LOG_FIRST_N(WARNING, 1)
136
+ << "Log level INFO is not suitable for production. Prefer WARNING or "
137
+ "ERROR. However if you see this message in a debug environmenmt or "
138
+ "test environmenmt it is safe to ignore this message.";
138
139
  absl::SetVLogLevel("*grpc*/*", -1);
139
140
  absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo);
140
141
  } else if (absl::EqualsIgnoreCase(verbosity, "DEBUG")) {
141
- LOG(WARNING) << "Not suitable for production. Prefer WARNING or ERROR. "
142
- "However if you see this message in a debug environmenmt "
143
- "or test environmenmt it is safe to ignore this message.";
142
+ LOG_FIRST_N(WARNING, 1)
143
+ << "Log level DEBUG is not suitable for production. Prefer WARNING or "
144
+ "ERROR. However if you see this message in a debug environmenmt or "
145
+ "test environmenmt it is safe to ignore this message.";
144
146
  absl::SetVLogLevel("*grpc*/*", 2);
145
147
  absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo);
146
148
  } else if (absl::EqualsIgnoreCase(verbosity, "ERROR")) {
@@ -14,5 +14,5 @@
14
14
 
15
15
  # GRPC contains the General RPC module.
16
16
  module GRPC
17
- VERSION = '1.65.0.pre2'
17
+ VERSION = '1.65.1'
18
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.65.0.pre2
4
+ version: 1.65.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - gRPC Authors
8
8
  autorequire:
9
9
  bindir: src/ruby/bin
10
10
  cert_chain: []
11
- date: 2024-06-21 00:00:00.000000000 Z
11
+ date: 2024-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -3581,7 +3581,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
3581
3581
  - !ruby/object:Gem::Version
3582
3582
  version: '0'
3583
3583
  requirements: []
3584
- rubygems_version: 3.5.13
3584
+ rubygems_version: 3.5.15
3585
3585
  signing_key:
3586
3586
  specification_version: 4
3587
3587
  summary: GRPC system in Ruby