grpc 1.65.0.pre2 → 1.65.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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