grpc 1.40.0.pre1 → 1.40.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf4977eb9d4631eb3f57dd3a14819a47b396e4b168d4c8bd71940ae67e702a07
4
- data.tar.gz: 1556459d6ed1ef4b6e6109be093f81122d90cc4dc49e4b0a07b607d9f152cdf6
3
+ metadata.gz: 18e1fa5db1d34b00db88443732e9ab881337cd91a8f57063562a41ee26e7e57b
4
+ data.tar.gz: ff23dac20d0aa6708db1b5d6cb7b8416b93e83d8e8a919154b885f4b7bebceb2
5
5
  SHA512:
6
- metadata.gz: e5ae2edd3bd04dc52f9c865999fa2e26e22f9af1df05852235ff01fbbf25ee6a9ab4a2efd69a2ce87f221b8e41d97ff966b554c1a3ad3bc597e1494140517701
7
- data.tar.gz: 4d15ba612d2a2ecb754eab736a7dd99b93d1821e572c7ff697b5d6d397d54c1220e3f0091550377ddc5af2eb3694ff2fb4495ac8fd05c7679bbb3e57bd31d6a4
6
+ metadata.gz: 8dc580b40de3574c01c9d1c3e5e863c75c2a4e58959ae069b586f013c2cdcc1021a087c54a9df01fc714c8c6091bd47972e0f446394ae1e7abd2a47b157b83d0
7
+ data.tar.gz: 9ce91a5beccbfeb22a89f5a9d4c22047f718e8a0b800de36121b459340f343b30a0799672ce8ac7c9c14d15d4403e2056c35edd1b46739b276155a4e7fc15f59
data/Makefile CHANGED
@@ -455,8 +455,8 @@ Q = @
455
455
  endif
456
456
 
457
457
  CORE_VERSION = 18.0.0
458
- CPP_VERSION = 1.40.0-pre1
459
- CSHARP_VERSION = 2.40.0-pre1
458
+ CPP_VERSION = 1.40.0
459
+ CSHARP_VERSION = 2.40.0
460
460
 
461
461
  CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
462
462
  CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
@@ -88,9 +88,7 @@
88
88
 
89
89
  // TODO(roth): In subsequent PRs:
90
90
  // - add support for transparent retries (including initial metadata)
91
- // - figure out how to record stats in census for retries
92
- // (census filter is on top of this one)
93
- // - add census stats for retries
91
+ // - implement hedging
94
92
 
95
93
  // By default, we buffer 256 KiB per RPC for retries.
96
94
  // TODO(roth): Do we have any data to suggest a better value?
@@ -539,6 +537,8 @@ class RetryFilter::CallData {
539
537
  CallCombiner* call_combiner_;
540
538
  grpc_call_context_element* call_context_;
541
539
 
540
+ grpc_error_handle cancelled_from_surface_ = GRPC_ERROR_NONE;
541
+
542
542
  RefCountedPtr<CallStackDestructionBarrier> call_stack_destruction_barrier_;
543
543
 
544
544
  // TODO(roth): As part of implementing hedging, we will need to maintain a
@@ -2141,6 +2141,7 @@ RetryFilter::CallData::~CallData() {
2141
2141
  for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
2142
2142
  GPR_ASSERT(pending_batches_[i].batch == nullptr);
2143
2143
  }
2144
+ GRPC_ERROR_UNREF(cancelled_from_surface_);
2144
2145
  }
2145
2146
 
2146
2147
  void RetryFilter::CallData::StartTransportStreamOpBatch(
@@ -2173,6 +2174,9 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
2173
2174
  call_attempt_->CancelFromSurface(batch);
2174
2175
  return;
2175
2176
  }
2177
+ // Save cancel_error in case subsequent batches are started.
2178
+ GRPC_ERROR_UNREF(cancelled_from_surface_);
2179
+ cancelled_from_surface_ = GRPC_ERROR_REF(cancel_error);
2176
2180
  // Cancel retry timer.
2177
2181
  if (retry_timer_pending_) {
2178
2182
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
@@ -2201,6 +2205,15 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
2201
2205
  }
2202
2206
  // If we do not yet have a call attempt, create one.
2203
2207
  if (call_attempt_ == nullptr) {
2208
+ // If we were previously cancelled from the surface, cancel this
2209
+ // batch instead of creating a call attempt.
2210
+ if (cancelled_from_surface_ != GRPC_ERROR_NONE) {
2211
+ PendingBatchClear(pending);
2212
+ // Note: This will release the call combiner.
2213
+ grpc_transport_stream_op_batch_finish_with_failure(
2214
+ batch, GRPC_ERROR_REF(cancelled_from_surface_), call_combiner_);
2215
+ return;
2216
+ }
2204
2217
  // If there is no retry policy, then commit retries immediately.
2205
2218
  // This ensures that the code below will always jump to the fast path.
2206
2219
  // TODO(roth): Remove this special case when we implement
@@ -115,17 +115,6 @@ bool XdsAggregateAndLogicalDnsClusterEnabled() {
115
115
  return parse_succeeded && parsed_value;
116
116
  }
117
117
 
118
- // TODO(donnadionne): Check to see if ring hash policy is enabled, this will be
119
- // removed once ring hash policy is fully integration-tested and enabled by
120
- // default.
121
- bool XdsRingHashEnabled() {
122
- char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
123
- bool parsed_value;
124
- bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
125
- gpr_free(value);
126
- return parse_succeeded && parsed_value;
127
- }
128
-
129
118
  // TODO(yashykt): Check to see if xDS security is enabled. This will be
130
119
  // removed once this feature is fully integration-tested and enabled by
131
120
  // default.
@@ -1751,81 +1740,78 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1751
1740
  }
1752
1741
  }
1753
1742
  // Get HashPolicy from RouteAction
1754
- if (XdsRingHashEnabled()) {
1755
- size_t size = 0;
1756
- const envoy_config_route_v3_RouteAction_HashPolicy* const* hash_policies =
1757
- envoy_config_route_v3_RouteAction_hash_policy(route_action, &size);
1758
- for (size_t i = 0; i < size; ++i) {
1759
- const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
1760
- hash_policies[i];
1761
- XdsApi::Route::HashPolicy policy;
1762
- policy.terminal =
1763
- envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
1764
- const envoy_config_route_v3_RouteAction_HashPolicy_Header* header;
1765
- const envoy_config_route_v3_RouteAction_HashPolicy_FilterState*
1766
- filter_state;
1767
- if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
1768
- hash_policy)) != nullptr) {
1769
- policy.type = XdsApi::Route::HashPolicy::Type::HEADER;
1770
- policy.header_name = UpbStringToStdString(
1771
- envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
1772
- header));
1773
- const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*
1774
- regex_rewrite =
1775
- envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
1776
- header);
1777
- if (regex_rewrite != nullptr) {
1778
- const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1779
- envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
1780
- regex_rewrite);
1781
- if (regex_matcher == nullptr) {
1782
- gpr_log(
1783
- GPR_DEBUG,
1784
- "RouteAction HashPolicy contains policy specifier Header with "
1785
- "RegexMatchAndSubstitution but RegexMatcher pattern is "
1786
- "missing");
1787
- continue;
1788
- }
1789
- RE2::Options options;
1790
- policy.regex = absl::make_unique<RE2>(
1791
- UpbStringToStdString(
1792
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
1793
- options);
1794
- if (!policy.regex->ok()) {
1795
- gpr_log(
1796
- GPR_DEBUG,
1797
- "RouteAction HashPolicy contains policy specifier Header with "
1798
- "RegexMatchAndSubstitution but RegexMatcher pattern does not "
1799
- "compile");
1800
- continue;
1801
- }
1802
- policy.regex_substitution = UpbStringToStdString(
1803
- envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
1804
- regex_rewrite));
1743
+ size_t size = 0;
1744
+ const envoy_config_route_v3_RouteAction_HashPolicy* const* hash_policies =
1745
+ envoy_config_route_v3_RouteAction_hash_policy(route_action, &size);
1746
+ for (size_t i = 0; i < size; ++i) {
1747
+ const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
1748
+ hash_policies[i];
1749
+ XdsApi::Route::HashPolicy policy;
1750
+ policy.terminal =
1751
+ envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
1752
+ const envoy_config_route_v3_RouteAction_HashPolicy_Header* header;
1753
+ const envoy_config_route_v3_RouteAction_HashPolicy_FilterState*
1754
+ filter_state;
1755
+ if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
1756
+ hash_policy)) != nullptr) {
1757
+ policy.type = XdsApi::Route::HashPolicy::Type::HEADER;
1758
+ policy.header_name = UpbStringToStdString(
1759
+ envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
1760
+ header));
1761
+ const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*
1762
+ regex_rewrite =
1763
+ envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
1764
+ header);
1765
+ if (regex_rewrite != nullptr) {
1766
+ const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1767
+ envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
1768
+ regex_rewrite);
1769
+ if (regex_matcher == nullptr) {
1770
+ gpr_log(
1771
+ GPR_DEBUG,
1772
+ "RouteAction HashPolicy contains policy specifier Header with "
1773
+ "RegexMatchAndSubstitution but RegexMatcher pattern is "
1774
+ "missing");
1775
+ continue;
1805
1776
  }
1806
- } else if ((filter_state =
1807
- envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
1808
- hash_policy)) != nullptr) {
1809
- std::string key = UpbStringToStdString(
1810
- envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
1811
- filter_state));
1812
- if (key == "io.grpc.channel_id") {
1813
- policy.type = XdsApi::Route::HashPolicy::Type::CHANNEL_ID;
1814
- } else {
1815
- gpr_log(GPR_DEBUG,
1816
- "RouteAction HashPolicy contains policy specifier "
1817
- "FilterState but "
1818
- "key is not io.grpc.channel_id.");
1777
+ RE2::Options options;
1778
+ policy.regex = absl::make_unique<RE2>(
1779
+ UpbStringToStdString(
1780
+ envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
1781
+ options);
1782
+ if (!policy.regex->ok()) {
1783
+ gpr_log(
1784
+ GPR_DEBUG,
1785
+ "RouteAction HashPolicy contains policy specifier Header with "
1786
+ "RegexMatchAndSubstitution but RegexMatcher pattern does not "
1787
+ "compile");
1819
1788
  continue;
1820
1789
  }
1790
+ policy.regex_substitution = UpbStringToStdString(
1791
+ envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
1792
+ regex_rewrite));
1793
+ }
1794
+ } else if ((filter_state =
1795
+ envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
1796
+ hash_policy)) != nullptr) {
1797
+ std::string key = UpbStringToStdString(
1798
+ envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
1799
+ filter_state));
1800
+ if (key == "io.grpc.channel_id") {
1801
+ policy.type = XdsApi::Route::HashPolicy::Type::CHANNEL_ID;
1821
1802
  } else {
1822
- gpr_log(
1823
- GPR_DEBUG,
1824
- "RouteAction HashPolicy contains unsupported policy specifier.");
1803
+ gpr_log(GPR_DEBUG,
1804
+ "RouteAction HashPolicy contains policy specifier "
1805
+ "FilterState but "
1806
+ "key is not io.grpc.channel_id.");
1825
1807
  continue;
1826
1808
  }
1827
- route->hash_policies.emplace_back(std::move(policy));
1809
+ } else {
1810
+ gpr_log(GPR_DEBUG,
1811
+ "RouteAction HashPolicy contains unsupported policy specifier.");
1812
+ continue;
1828
1813
  }
1814
+ route->hash_policies.emplace_back(std::move(policy));
1829
1815
  }
1830
1816
  // Get retry policy
1831
1817
  const envoy_config_route_v3_RetryPolicy* retry_policy =
@@ -3174,9 +3160,8 @@ grpc_error_handle CdsResponseParse(
3174
3160
  if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
3175
3161
  envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
3176
3162
  cds_update.lb_policy = "ROUND_ROBIN";
3177
- } else if (XdsRingHashEnabled() &&
3178
- envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
3179
- envoy_config_cluster_v3_Cluster_RING_HASH) {
3163
+ } else if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
3164
+ envoy_config_cluster_v3_Cluster_RING_HASH) {
3180
3165
  cds_update.lb_policy = "RING_HASH";
3181
3166
  // Record ring hash lb config
3182
3167
  auto* ring_hash_config =
@@ -223,11 +223,21 @@ grpc_core::UnmanagedMemorySlice::UnmanagedMemorySlice(const char* source)
223
223
  strlen(source)) {}
224
224
 
225
225
  grpc_slice grpc_slice_from_copied_buffer(const char* source, size_t length) {
226
- return grpc_core::UnmanagedMemorySlice(source, length);
226
+ grpc_slice slice;
227
+ if (length <= sizeof(slice.data.inlined.bytes)) {
228
+ slice.refcount = nullptr;
229
+ slice.data.inlined.length = length;
230
+ } else {
231
+ // Create a ref-counted slice.
232
+ slice = grpc_core::UnmanagedMemorySlice(
233
+ length, grpc_core::UnmanagedMemorySlice::ForceHeapAllocation());
234
+ }
235
+ memcpy(GRPC_SLICE_START_PTR(slice), source, length);
236
+ return slice;
227
237
  }
228
238
 
229
239
  grpc_slice grpc_slice_from_copied_string(const char* source) {
230
- return grpc_core::UnmanagedMemorySlice(source, strlen(source));
240
+ return grpc_slice_from_copied_buffer(source, strlen(source));
231
241
  }
232
242
 
233
243
  grpc_slice grpc_slice_from_moved_buffer(grpc_core::UniquePtr<char> p,
@@ -401,9 +401,20 @@ void grpc_metadata_batch_copy(grpc_metadata_batch* src,
401
401
  size_t i = 0;
402
402
  for (grpc_linked_mdelem* elem = src->list.head; elem != nullptr;
403
403
  elem = elem->next) {
404
+ // If the mdelem is not external, take a ref.
405
+ // Otherwise, create a new copy, holding its own refs to the
406
+ // underlying slices.
407
+ grpc_mdelem md;
408
+ if (GRPC_MDELEM_STORAGE(elem->md) != GRPC_MDELEM_STORAGE_EXTERNAL) {
409
+ md = GRPC_MDELEM_REF(elem->md);
410
+ } else {
411
+ md = grpc_mdelem_from_slices(
412
+ grpc_slice_ref_internal(GRPC_MDKEY(elem->md)),
413
+ grpc_slice_ref_internal(GRPC_MDVALUE(elem->md)));
414
+ }
404
415
  // Error unused in non-debug builds.
405
- grpc_error_handle GRPC_UNUSED error = grpc_metadata_batch_add_tail(
406
- dst, &storage[i++], GRPC_MDELEM_REF(elem->md));
416
+ grpc_error_handle GRPC_UNUSED error =
417
+ grpc_metadata_batch_add_tail(dst, &storage[i++], md);
407
418
  // The only way that grpc_metadata_batch_add_tail() can fail is if
408
419
  // there's a duplicate entry for a callout. However, that can't be
409
420
  // the case here, because we would not have been allowed to create
@@ -196,6 +196,13 @@ void grpc_metadata_batch_assert_ok(grpc_metadata_batch* batch);
196
196
 
197
197
  /// Copies \a src to \a dst. \a storage must point to an array of
198
198
  /// \a grpc_linked_mdelem structs of at least the same size as \a src.
199
+ ///
200
+ /// For each mdelem in \a src, if the mdelem is of storage types
201
+ /// GRPC_MDELEM_STORAGE_INTERNED or GRPC_MDELEM_STORAGE_ALLOCATED,
202
+ /// refs the original mdelem for the copy. Otherwise, makes a new
203
+ /// mdelem that will hold its own refs to the key and value slices.
204
+ ///
205
+ /// Currently used only in the retry code.
199
206
  void grpc_metadata_batch_copy(grpc_metadata_batch* src,
200
207
  grpc_metadata_batch* dst,
201
208
  grpc_linked_mdelem* storage);
@@ -57,7 +57,7 @@ end
57
57
 
58
58
  ENV['CPPFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
59
59
  ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="\"RUBY\"" '
60
- ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.40.0.pre1\"" '
60
+ ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.40.0\"" '
61
61
 
62
62
  output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
63
63
  grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
@@ -14,5 +14,5 @@
14
14
 
15
15
  # GRPC contains the General RPC module.
16
16
  module GRPC
17
- VERSION = '1.40.0.pre1'
17
+ VERSION = '1.40.0'
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.40.0.pre1
4
+ version: 1.40.0
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: 2021-08-21 00:00:00.000000000 Z
11
+ date: 2021-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -2490,55 +2490,55 @@ required_ruby_version: !ruby/object:Gem::Requirement
2490
2490
  version: 2.4.0
2491
2491
  required_rubygems_version: !ruby/object:Gem::Requirement
2492
2492
  requirements:
2493
- - - ">"
2493
+ - - ">="
2494
2494
  - !ruby/object:Gem::Version
2495
- version: 1.3.1
2495
+ version: '0'
2496
2496
  requirements: []
2497
- rubygems_version: 3.2.26
2497
+ rubygems_version: 3.2.27
2498
2498
  signing_key:
2499
2499
  specification_version: 4
2500
2500
  summary: GRPC system in Ruby
2501
2501
  test_files:
2502
- - src/ruby/spec/server_credentials_spec.rb
2503
- - src/ruby/spec/debug_message_spec.rb
2504
- - src/ruby/spec/channel_connection_spec.rb
2505
- - src/ruby/spec/testdata/client.key
2506
- - src/ruby/spec/testdata/server1.pem
2507
- - src/ruby/spec/testdata/client.pem
2508
- - src/ruby/spec/testdata/server1.key
2509
- - src/ruby/spec/testdata/ca.pem
2510
- - src/ruby/spec/testdata/README
2511
- - src/ruby/spec/pb/codegen/package_option_spec.rb
2502
+ - src/ruby/spec/google_rpc_status_utils_spec.rb
2512
2503
  - src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto
2513
- - src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto
2514
2504
  - src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto
2515
- - src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto
2505
+ - src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto
2516
2506
  - src/ruby/spec/pb/codegen/grpc/testing/package_options.proto
2517
2507
  - src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto
2508
+ - src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto
2509
+ - src/ruby/spec/pb/codegen/package_option_spec.rb
2518
2510
  - src/ruby/spec/pb/duplicate/codegen_spec.rb
2519
2511
  - src/ruby/spec/pb/health/checker_spec.rb
2520
- - src/ruby/spec/time_consts_spec.rb
2512
+ - src/ruby/spec/errors_spec.rb
2513
+ - src/ruby/spec/support/helpers.rb
2514
+ - src/ruby/spec/support/services.rb
2521
2515
  - src/ruby/spec/client_server_spec.rb
2516
+ - src/ruby/spec/testdata/client.key
2517
+ - src/ruby/spec/testdata/README
2518
+ - src/ruby/spec/testdata/client.pem
2519
+ - src/ruby/spec/testdata/ca.pem
2520
+ - src/ruby/spec/testdata/server1.pem
2521
+ - src/ruby/spec/testdata/server1.key
2522
2522
  - src/ruby/spec/server_spec.rb
2523
- - src/ruby/spec/call_spec.rb
2524
2523
  - src/ruby/spec/client_auth_spec.rb
2525
- - src/ruby/spec/channel_credentials_spec.rb
2526
2524
  - src/ruby/spec/user_agent_spec.rb
2527
- - src/ruby/spec/errors_spec.rb
2528
- - src/ruby/spec/google_rpc_status_utils_spec.rb
2529
- - src/ruby/spec/spec_helper.rb
2530
- - src/ruby/spec/support/helpers.rb
2531
- - src/ruby/spec/support/services.rb
2532
2525
  - src/ruby/spec/channel_spec.rb
2533
- - src/ruby/spec/call_credentials_spec.rb
2534
- - src/ruby/spec/compression_options_spec.rb
2535
- - src/ruby/spec/generic/active_call_spec.rb
2526
+ - src/ruby/spec/generic/service_spec.rb
2527
+ - src/ruby/spec/generic/rpc_server_spec.rb
2536
2528
  - src/ruby/spec/generic/server_interceptors_spec.rb
2537
- - src/ruby/spec/generic/client_stub_spec.rb
2538
2529
  - src/ruby/spec/generic/interceptor_registry_spec.rb
2539
- - src/ruby/spec/generic/rpc_server_spec.rb
2530
+ - src/ruby/spec/generic/client_stub_spec.rb
2540
2531
  - src/ruby/spec/generic/rpc_desc_spec.rb
2541
- - src/ruby/spec/generic/client_interceptors_spec.rb
2542
- - src/ruby/spec/generic/service_spec.rb
2543
2532
  - src/ruby/spec/generic/rpc_server_pool_spec.rb
2533
+ - src/ruby/spec/generic/active_call_spec.rb
2534
+ - src/ruby/spec/generic/client_interceptors_spec.rb
2535
+ - src/ruby/spec/compression_options_spec.rb
2536
+ - src/ruby/spec/spec_helper.rb
2537
+ - src/ruby/spec/call_credentials_spec.rb
2544
2538
  - src/ruby/spec/error_sanity_spec.rb
2539
+ - src/ruby/spec/time_consts_spec.rb
2540
+ - src/ruby/spec/call_spec.rb
2541
+ - src/ruby/spec/channel_connection_spec.rb
2542
+ - src/ruby/spec/channel_credentials_spec.rb
2543
+ - src/ruby/spec/server_credentials_spec.rb
2544
+ - src/ruby/spec/debug_message_spec.rb