grpc 0.13.0-universal-darwin → 0.13.1.pre1-universal-darwin
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 +4 -4
- data/src/ruby/ext/grpc/extconf.rb +1 -0
- data/src/ruby/ext/grpc/rb_call.c +6 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +12 -14
- data/src/ruby/ext/grpc/rb_channel.c +8 -14
- data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -12
- data/src/ruby/ext/grpc/rb_grpc.c +19 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +8 -2
- data/src/ruby/lib/grpc/2.0/grpc_c.bundle +0 -0
- data/src/ruby/lib/grpc/2.1/grpc_c.bundle +0 -0
- data/src/ruby/lib/grpc/2.2/grpc_c.bundle +0 -0
- data/src/ruby/lib/grpc/2.3/grpc_c.bundle +0 -0
- data/src/ruby/lib/grpc/core/time_consts.rb +2 -2
- data/src/ruby/lib/grpc/errors.rb +2 -2
- data/src/ruby/lib/grpc/generic/rpc_server.rb +58 -39
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +2 -2
- data/src/ruby/pb/generate_proto_ruby.sh +2 -2
- data/src/ruby/pb/grpc/health/checker.rb +11 -11
- data/src/ruby/pb/grpc/health/v1/health.rb +28 -0
- data/src/ruby/pb/grpc/health/{v1alpha → v1}/health_services.rb +4 -4
- data/src/ruby/spec/client_server_spec.rb +2 -1
- data/src/ruby/spec/generic/rpc_server_spec.rb +3 -22
- data/src/ruby/spec/pb/health/checker_spec.rb +22 -36
- metadata +8 -8
- data/src/ruby/pb/grpc/health/v1alpha/health.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 649ab32cb53bdc13b6893be3935c35f7e29f032a
|
4
|
+
data.tar.gz: 44f070019c2af077f5b8bb3be18d2641b3020877
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6418f9e1bb8a56e2d8f7bd6de510ed0e5ebb5ac6b21d31558209c66d5a947610eefe8af1cd8f65539552d2271b67fdc02ebac1c006c909b078cc5fae2117aaa7
|
7
|
+
data.tar.gz: b8d20b8957d949ba7908ee683f757de0fa32714c5108722ad5a0257f5279a66bf5891f9bafe9f5d2a5b07a9e8e37d79acd630402a8c342392de0eab81c9568d2
|
@@ -79,6 +79,7 @@ unless File.exist?(File.join(grpc_lib_dir, 'libgrpc.a')) or windows
|
|
79
79
|
ENV['EMBED_ZLIB'] = 'true'
|
80
80
|
ENV['ARCH_FLAGS'] = RbConfig::CONFIG['ARCH_FLAG']
|
81
81
|
ENV['ARCH_FLAGS'] = '-arch i386 -arch x86_64' if RUBY_PLATFORM =~ /darwin/
|
82
|
+
ENV['CFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
|
82
83
|
|
83
84
|
output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
|
84
85
|
grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
|
data/src/ruby/ext/grpc/rb_call.c
CHANGED
@@ -72,6 +72,10 @@ static ID id_cq;
|
|
72
72
|
* the flags used to create metadata from a Hash */
|
73
73
|
static ID id_flags;
|
74
74
|
|
75
|
+
/* id_credentials is the name of the hidden ivar that preserves the value
|
76
|
+
* of the credentials added to the call */
|
77
|
+
static ID id_credentials;
|
78
|
+
|
75
79
|
/* id_input_md is the name of the hidden ivar that preserves the hash used to
|
76
80
|
* create metadata, so that references to the strings it contains last as long
|
77
81
|
* as the call the metadata is added to. */
|
@@ -299,6 +303,7 @@ static VALUE grpc_rb_call_set_credentials(VALUE self, VALUE credentials) {
|
|
299
303
|
"grpc_call_set_credentials failed with %s (code=%d)",
|
300
304
|
grpc_call_error_detail_of(err), err);
|
301
305
|
}
|
306
|
+
rb_ivar_set(self, id_credentials, credentials);
|
302
307
|
return Qnil;
|
303
308
|
}
|
304
309
|
|
@@ -859,6 +864,7 @@ void Init_grpc_call() {
|
|
859
864
|
id_cq = rb_intern("__cq");
|
860
865
|
id_flags = rb_intern("__flags");
|
861
866
|
id_input_md = rb_intern("__input_md");
|
867
|
+
id_credentials = rb_intern("__credentials");
|
862
868
|
|
863
869
|
/* Ids used in constructing the batch result. */
|
864
870
|
sym_send_message = ID2SYM(rb_intern("send_message"));
|
@@ -50,9 +50,9 @@
|
|
50
50
|
* grpc_call_credentials */
|
51
51
|
static VALUE grpc_rb_cCallCredentials = Qnil;
|
52
52
|
|
53
|
-
/* grpc_rb_call_credentials wraps a grpc_call_credentials. It provides a
|
54
|
-
*
|
55
|
-
*
|
53
|
+
/* grpc_rb_call_credentials wraps a grpc_call_credentials. It provides a mark
|
54
|
+
* object that is used to hold references to any objects used to create the
|
55
|
+
* credentials. */
|
56
56
|
typedef struct grpc_rb_call_credentials {
|
57
57
|
/* Holder of ruby objects involved in contructing the credentials */
|
58
58
|
VALUE mark;
|
@@ -146,13 +146,8 @@ static void grpc_rb_call_credentials_free(void *p) {
|
|
146
146
|
return;
|
147
147
|
}
|
148
148
|
wrapper = (grpc_rb_call_credentials *)p;
|
149
|
-
|
150
|
-
|
151
|
-
* no other object is the actual owner. */
|
152
|
-
if (wrapper->wrapped != NULL && wrapper->mark == Qnil) {
|
153
|
-
grpc_call_credentials_release(wrapper->wrapped);
|
154
|
-
wrapper->wrapped = NULL;
|
155
|
-
}
|
149
|
+
grpc_call_credentials_release(wrapper->wrapped);
|
150
|
+
wrapper->wrapped = NULL;
|
156
151
|
|
157
152
|
xfree(p);
|
158
153
|
}
|
@@ -164,8 +159,6 @@ static void grpc_rb_call_credentials_mark(void *p) {
|
|
164
159
|
return;
|
165
160
|
}
|
166
161
|
wrapper = (grpc_rb_call_credentials *)p;
|
167
|
-
|
168
|
-
/* If it's not already cleaned up, mark the mark object */
|
169
162
|
if (wrapper->mark != Qnil) {
|
170
163
|
rb_gc_mark(wrapper->mark);
|
171
164
|
}
|
@@ -194,7 +187,7 @@ static VALUE grpc_rb_call_credentials_alloc(VALUE cls) {
|
|
194
187
|
/* Creates a wrapping object for a given call credentials. This should only be
|
195
188
|
* called with grpc_call_credentials objects that are not already associated
|
196
189
|
* with any Ruby object */
|
197
|
-
VALUE grpc_rb_wrap_call_credentials(grpc_call_credentials *c) {
|
190
|
+
VALUE grpc_rb_wrap_call_credentials(grpc_call_credentials *c, VALUE mark) {
|
198
191
|
VALUE rb_wrapper;
|
199
192
|
grpc_rb_call_credentials *wrapper;
|
200
193
|
if (c == NULL) {
|
@@ -204,6 +197,7 @@ VALUE grpc_rb_wrap_call_credentials(grpc_call_credentials *c) {
|
|
204
197
|
TypedData_Get_Struct(rb_wrapper, grpc_rb_call_credentials,
|
205
198
|
&grpc_rb_call_credentials_data_type, wrapper);
|
206
199
|
wrapper->wrapped = c;
|
200
|
+
wrapper->mark = mark;
|
207
201
|
return rb_wrapper;
|
208
202
|
}
|
209
203
|
|
@@ -267,6 +261,7 @@ static VALUE grpc_rb_call_credentials_init(VALUE self, VALUE proc) {
|
|
267
261
|
return Qnil;
|
268
262
|
}
|
269
263
|
|
264
|
+
wrapper->mark = proc;
|
270
265
|
wrapper->wrapped = creds;
|
271
266
|
rb_ivar_set(self, id_callback, proc);
|
272
267
|
|
@@ -277,15 +272,18 @@ static VALUE grpc_rb_call_credentials_compose(int argc, VALUE *argv,
|
|
277
272
|
VALUE self) {
|
278
273
|
grpc_call_credentials *creds;
|
279
274
|
grpc_call_credentials *other;
|
275
|
+
VALUE mark;
|
280
276
|
if (argc == 0) {
|
281
277
|
return self;
|
282
278
|
}
|
279
|
+
mark = rb_ary_new();
|
283
280
|
creds = grpc_rb_get_wrapped_call_credentials(self);
|
284
281
|
for (int i = 0; i < argc; i++) {
|
282
|
+
rb_ary_push(mark, argv[i]);
|
285
283
|
other = grpc_rb_get_wrapped_call_credentials(argv[i]);
|
286
284
|
creds = grpc_composite_call_credentials_create(creds, other, NULL);
|
287
285
|
}
|
288
|
-
return grpc_rb_wrap_call_credentials(creds);
|
286
|
+
return grpc_rb_wrap_call_credentials(creds, mark);
|
289
287
|
}
|
290
288
|
|
291
289
|
void Init_grpc_call_credentials() {
|
@@ -70,11 +70,10 @@ static VALUE grpc_rb_cChannel = Qnil;
|
|
70
70
|
/* Used during the conversion of a hash to channel args during channel setup */
|
71
71
|
static VALUE grpc_rb_cChannelArgs;
|
72
72
|
|
73
|
-
/* grpc_rb_channel wraps a grpc_channel.
|
74
|
-
* 'mark' to minimize copying when a channel is created from ruby. */
|
73
|
+
/* grpc_rb_channel wraps a grpc_channel. */
|
75
74
|
typedef struct grpc_rb_channel {
|
76
|
-
|
77
|
-
|
75
|
+
VALUE credentials;
|
76
|
+
|
78
77
|
/* The actual channel */
|
79
78
|
grpc_channel *wrapped;
|
80
79
|
} grpc_rb_channel;
|
@@ -87,13 +86,8 @@ static void grpc_rb_channel_free(void *p) {
|
|
87
86
|
};
|
88
87
|
ch = (grpc_rb_channel *)p;
|
89
88
|
|
90
|
-
|
91
|
-
* that no other object is the actual owner. */
|
92
|
-
if (ch->wrapped != NULL && ch->mark == Qnil) {
|
89
|
+
if (ch->wrapped != NULL) {
|
93
90
|
grpc_channel_destroy(ch->wrapped);
|
94
|
-
rb_warning("channel gc: destroyed the c channel");
|
95
|
-
} else {
|
96
|
-
rb_warning("channel gc: did not destroy the c channel");
|
97
91
|
}
|
98
92
|
|
99
93
|
xfree(p);
|
@@ -106,8 +100,8 @@ static void grpc_rb_channel_mark(void *p) {
|
|
106
100
|
return;
|
107
101
|
}
|
108
102
|
channel = (grpc_rb_channel *)p;
|
109
|
-
if (channel->
|
110
|
-
rb_gc_mark(channel->
|
103
|
+
if (channel->credentials != Qnil) {
|
104
|
+
rb_gc_mark(channel->credentials);
|
111
105
|
}
|
112
106
|
}
|
113
107
|
|
@@ -125,7 +119,7 @@ static rb_data_type_t grpc_channel_data_type = {
|
|
125
119
|
static VALUE grpc_rb_channel_alloc(VALUE cls) {
|
126
120
|
grpc_rb_channel *wrapper = ALLOC(grpc_rb_channel);
|
127
121
|
wrapper->wrapped = NULL;
|
128
|
-
wrapper->
|
122
|
+
wrapper->credentials = Qnil;
|
129
123
|
return TypedData_Wrap_Struct(cls, &grpc_channel_data_type, wrapper);
|
130
124
|
}
|
131
125
|
|
@@ -162,6 +156,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) {
|
|
162
156
|
}
|
163
157
|
ch = grpc_insecure_channel_create(target_chars, &args, NULL);
|
164
158
|
} else {
|
159
|
+
wrapper->credentials = credentials;
|
165
160
|
creds = grpc_rb_get_wrapped_channel_credentials(credentials);
|
166
161
|
ch = grpc_secure_channel_create(creds, target_chars, &args, NULL);
|
167
162
|
}
|
@@ -330,7 +325,6 @@ static VALUE grpc_rb_channel_destroy(VALUE self) {
|
|
330
325
|
if (ch != NULL) {
|
331
326
|
grpc_channel_destroy(ch);
|
332
327
|
wrapper->wrapped = NULL;
|
333
|
-
wrapper->mark = Qnil;
|
334
328
|
}
|
335
329
|
|
336
330
|
return Qnil;
|
@@ -49,8 +49,8 @@
|
|
49
49
|
static VALUE grpc_rb_cChannelCredentials = Qnil;
|
50
50
|
|
51
51
|
/* grpc_rb_channel_credentials wraps a grpc_channel_credentials. It provides a
|
52
|
-
*
|
53
|
-
*
|
52
|
+
* mark object that is used to hold references to any objects used to create
|
53
|
+
* the credentials. */
|
54
54
|
typedef struct grpc_rb_channel_credentials {
|
55
55
|
/* Holder of ruby objects involved in constructing the credentials */
|
56
56
|
VALUE mark;
|
@@ -66,13 +66,8 @@ static void grpc_rb_channel_credentials_free(void *p) {
|
|
66
66
|
return;
|
67
67
|
};
|
68
68
|
wrapper = (grpc_rb_channel_credentials *)p;
|
69
|
-
|
70
|
-
|
71
|
-
* no other object is the actual owner. */
|
72
|
-
if (wrapper->wrapped != NULL && wrapper->mark == Qnil) {
|
73
|
-
grpc_channel_credentials_release(wrapper->wrapped);
|
74
|
-
wrapper->wrapped = NULL;
|
75
|
-
}
|
69
|
+
grpc_channel_credentials_release(wrapper->wrapped);
|
70
|
+
wrapper->wrapped = NULL;
|
76
71
|
|
77
72
|
xfree(p);
|
78
73
|
}
|
@@ -85,7 +80,6 @@ static void grpc_rb_channel_credentials_mark(void *p) {
|
|
85
80
|
}
|
86
81
|
wrapper = (grpc_rb_channel_credentials *)p;
|
87
82
|
|
88
|
-
/* If it's not already cleaned up, mark the mark object */
|
89
83
|
if (wrapper->mark != Qnil) {
|
90
84
|
rb_gc_mark(wrapper->mark);
|
91
85
|
}
|
@@ -114,7 +108,7 @@ static VALUE grpc_rb_channel_credentials_alloc(VALUE cls) {
|
|
114
108
|
/* Creates a wrapping object for a given channel credentials. This should only
|
115
109
|
* be called with grpc_channel_credentials objects that are not already
|
116
110
|
* associated with any Ruby object. */
|
117
|
-
VALUE grpc_rb_wrap_channel_credentials(grpc_channel_credentials *c) {
|
111
|
+
VALUE grpc_rb_wrap_channel_credentials(grpc_channel_credentials *c, VALUE mark) {
|
118
112
|
VALUE rb_wrapper;
|
119
113
|
grpc_rb_channel_credentials *wrapper;
|
120
114
|
if (c == NULL) {
|
@@ -124,6 +118,7 @@ VALUE grpc_rb_wrap_channel_credentials(grpc_channel_credentials *c) {
|
|
124
118
|
TypedData_Get_Struct(rb_wrapper, grpc_rb_channel_credentials,
|
125
119
|
&grpc_rb_channel_credentials_data_type, wrapper);
|
126
120
|
wrapper->wrapped = c;
|
121
|
+
wrapper->mark = mark;
|
127
122
|
return rb_wrapper;
|
128
123
|
}
|
129
124
|
|
@@ -222,11 +217,15 @@ static VALUE grpc_rb_channel_credentials_compose(int argc, VALUE *argv,
|
|
222
217
|
VALUE self) {
|
223
218
|
grpc_channel_credentials *creds;
|
224
219
|
grpc_call_credentials *other;
|
220
|
+
VALUE mark;
|
225
221
|
if (argc == 0) {
|
226
222
|
return self;
|
227
223
|
}
|
224
|
+
mark = rb_ary_new();
|
225
|
+
rb_ary_push(mark, self);
|
228
226
|
creds = grpc_rb_get_wrapped_channel_credentials(self);
|
229
227
|
for (int i = 0; i < argc; i++) {
|
228
|
+
rb_ary_push(mark, argv[i]);
|
230
229
|
other = grpc_rb_get_wrapped_call_credentials(argv[i]);
|
231
230
|
creds = grpc_composite_channel_credentials_create(creds, other, NULL);
|
232
231
|
if (creds == NULL) {
|
@@ -234,7 +233,7 @@ static VALUE grpc_rb_channel_credentials_compose(int argc, VALUE *argv,
|
|
234
233
|
"Failed to compose channel and call credentials");
|
235
234
|
}
|
236
235
|
}
|
237
|
-
return grpc_rb_wrap_channel_credentials(creds);
|
236
|
+
return grpc_rb_wrap_channel_credentials(creds, mark);
|
238
237
|
}
|
239
238
|
|
240
239
|
void Init_grpc_channel_credentials() {
|
data/src/ruby/ext/grpc/rb_grpc.c
CHANGED
@@ -269,20 +269,9 @@ static void Init_grpc_time_consts() {
|
|
269
269
|
id_tv_nsec = rb_intern("tv_nsec");
|
270
270
|
}
|
271
271
|
|
272
|
-
|
273
|
-
TODO: find an alternative to ruby_vm_at_exit that is ok in Ruby 2.0 where
|
274
|
-
RUBY_TYPED_FREE_IMMEDIATELY is not defined.
|
275
|
-
|
276
|
-
At the moment, registering a function using ruby_vm_at_exit segfaults in Ruby
|
277
|
-
2.0. This is not an issue with the gRPC handler. More likely, this was an
|
278
|
-
in issue with 2.0 that got resolved in 2.1 and has not been backported.
|
279
|
-
*/
|
280
|
-
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
281
|
-
static void grpc_rb_shutdown(ruby_vm_t *vm) {
|
282
|
-
(void)vm;
|
272
|
+
static void grpc_rb_shutdown(void) {
|
283
273
|
grpc_shutdown();
|
284
274
|
}
|
285
|
-
#endif
|
286
275
|
|
287
276
|
/* Initialize the GRPC module structs */
|
288
277
|
|
@@ -300,18 +289,30 @@ VALUE sym_code = Qundef;
|
|
300
289
|
VALUE sym_details = Qundef;
|
301
290
|
VALUE sym_metadata = Qundef;
|
302
291
|
|
292
|
+
static gpr_once g_once_init = GPR_ONCE_INIT;
|
293
|
+
|
294
|
+
static void grpc_ruby_once_init() {
|
295
|
+
grpc_init();
|
296
|
+
atexit(grpc_rb_shutdown);
|
297
|
+
}
|
298
|
+
|
303
299
|
void Init_grpc_c() {
|
304
300
|
if (!grpc_rb_load_core()) {
|
305
301
|
rb_raise(rb_eLoadError, "Couldn't find or load gRPC's dynamic C core");
|
306
302
|
return;
|
307
303
|
}
|
308
304
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
305
|
+
/* ruby_vm_at_exit doesn't seem to be working. It would crash once every
|
306
|
+
* blue moon, and some users are getting it repeatedly. See the discussions
|
307
|
+
* - https://github.com/grpc/grpc/pull/5337
|
308
|
+
* - https://bugs.ruby-lang.org/issues/12095
|
309
|
+
*
|
310
|
+
* In order to still be able to handle the (unlikely) situation where the
|
311
|
+
* extension is loaded by a first Ruby VM that is subsequently destroyed,
|
312
|
+
* then loaded again by another VM within the same process, we need to
|
313
|
+
* schedule our initialization and destruction only once.
|
314
|
+
*/
|
315
|
+
gpr_once_init(&g_once_init, grpc_ruby_once_init);
|
315
316
|
|
316
317
|
grpc_rb_mGRPC = rb_define_module("GRPC");
|
317
318
|
grpc_rb_mGrpcCore = rb_define_module_under(grpc_rb_mGRPC, "Core");
|
@@ -137,6 +137,7 @@ grpc_auth_context_add_cstring_property_type grpc_auth_context_add_cstring_proper
|
|
137
137
|
grpc_auth_context_set_peer_identity_property_name_type grpc_auth_context_set_peer_identity_property_name_import;
|
138
138
|
grpc_channel_credentials_release_type grpc_channel_credentials_release_import;
|
139
139
|
grpc_google_default_credentials_create_type grpc_google_default_credentials_create_import;
|
140
|
+
grpc_set_ssl_roots_override_callback_type grpc_set_ssl_roots_override_callback_import;
|
140
141
|
grpc_ssl_credentials_create_type grpc_ssl_credentials_create_import;
|
141
142
|
grpc_call_credentials_release_type grpc_call_credentials_release_import;
|
142
143
|
grpc_composite_channel_credentials_create_type grpc_composite_channel_credentials_create_import;
|
@@ -219,6 +220,7 @@ gpr_event_get_type gpr_event_get_import;
|
|
219
220
|
gpr_event_wait_type gpr_event_wait_import;
|
220
221
|
gpr_ref_init_type gpr_ref_init_import;
|
221
222
|
gpr_ref_type gpr_ref_import;
|
223
|
+
gpr_ref_non_zero_type gpr_ref_non_zero_import;
|
222
224
|
gpr_refn_type gpr_refn_import;
|
223
225
|
gpr_unref_type gpr_unref_import;
|
224
226
|
gpr_stats_init_type gpr_stats_init_import;
|
@@ -397,6 +399,7 @@ void grpc_rb_load_imports(HMODULE library) {
|
|
397
399
|
grpc_auth_context_set_peer_identity_property_name_import = (grpc_auth_context_set_peer_identity_property_name_type) GetProcAddress(library, "grpc_auth_context_set_peer_identity_property_name");
|
398
400
|
grpc_channel_credentials_release_import = (grpc_channel_credentials_release_type) GetProcAddress(library, "grpc_channel_credentials_release");
|
399
401
|
grpc_google_default_credentials_create_import = (grpc_google_default_credentials_create_type) GetProcAddress(library, "grpc_google_default_credentials_create");
|
402
|
+
grpc_set_ssl_roots_override_callback_import = (grpc_set_ssl_roots_override_callback_type) GetProcAddress(library, "grpc_set_ssl_roots_override_callback");
|
400
403
|
grpc_ssl_credentials_create_import = (grpc_ssl_credentials_create_type) GetProcAddress(library, "grpc_ssl_credentials_create");
|
401
404
|
grpc_call_credentials_release_import = (grpc_call_credentials_release_type) GetProcAddress(library, "grpc_call_credentials_release");
|
402
405
|
grpc_composite_channel_credentials_create_import = (grpc_composite_channel_credentials_create_type) GetProcAddress(library, "grpc_composite_channel_credentials_create");
|
@@ -479,6 +482,7 @@ void grpc_rb_load_imports(HMODULE library) {
|
|
479
482
|
gpr_event_wait_import = (gpr_event_wait_type) GetProcAddress(library, "gpr_event_wait");
|
480
483
|
gpr_ref_init_import = (gpr_ref_init_type) GetProcAddress(library, "gpr_ref_init");
|
481
484
|
gpr_ref_import = (gpr_ref_type) GetProcAddress(library, "gpr_ref");
|
485
|
+
gpr_ref_non_zero_import = (gpr_ref_non_zero_type) GetProcAddress(library, "gpr_ref_non_zero");
|
482
486
|
gpr_refn_import = (gpr_refn_type) GetProcAddress(library, "gpr_refn");
|
483
487
|
gpr_unref_import = (gpr_unref_type) GetProcAddress(library, "gpr_unref");
|
484
488
|
gpr_stats_init_import = (gpr_stats_init_type) GetProcAddress(library, "gpr_stats_init");
|
@@ -91,10 +91,10 @@ extern census_context_next_tag_type census_context_next_tag_import;
|
|
91
91
|
typedef int(*census_context_get_tag_type)(const census_context *context, const char *key, census_tag *tag);
|
92
92
|
extern census_context_get_tag_type census_context_get_tag_import;
|
93
93
|
#define census_context_get_tag census_context_get_tag_import
|
94
|
-
typedef
|
94
|
+
typedef size_t(*census_context_encode_type)(const census_context *context, char *buffer, size_t buf_size);
|
95
95
|
extern census_context_encode_type census_context_encode_import;
|
96
96
|
#define census_context_encode census_context_encode_import
|
97
|
-
typedef census_context *(*census_context_decode_type)(const char *buffer, size_t size
|
97
|
+
typedef census_context *(*census_context_decode_type)(const char *buffer, size_t size);
|
98
98
|
extern census_context_decode_type census_context_decode_import;
|
99
99
|
#define census_context_decode census_context_decode_import
|
100
100
|
typedef int(*census_trace_mask_type)(const census_context *context);
|
@@ -361,6 +361,9 @@ extern grpc_channel_credentials_release_type grpc_channel_credentials_release_im
|
|
361
361
|
typedef grpc_channel_credentials *(*grpc_google_default_credentials_create_type)(void);
|
362
362
|
extern grpc_google_default_credentials_create_type grpc_google_default_credentials_create_import;
|
363
363
|
#define grpc_google_default_credentials_create grpc_google_default_credentials_create_import
|
364
|
+
typedef void(*grpc_set_ssl_roots_override_callback_type)(grpc_ssl_roots_override_callback cb);
|
365
|
+
extern grpc_set_ssl_roots_override_callback_type grpc_set_ssl_roots_override_callback_import;
|
366
|
+
#define grpc_set_ssl_roots_override_callback grpc_set_ssl_roots_override_callback_import
|
364
367
|
typedef grpc_channel_credentials *(*grpc_ssl_credentials_create_type)(const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair, void *reserved);
|
365
368
|
extern grpc_ssl_credentials_create_type grpc_ssl_credentials_create_import;
|
366
369
|
#define grpc_ssl_credentials_create grpc_ssl_credentials_create_import
|
@@ -607,6 +610,9 @@ extern gpr_ref_init_type gpr_ref_init_import;
|
|
607
610
|
typedef void(*gpr_ref_type)(gpr_refcount *r);
|
608
611
|
extern gpr_ref_type gpr_ref_import;
|
609
612
|
#define gpr_ref gpr_ref_import
|
613
|
+
typedef void(*gpr_ref_non_zero_type)(gpr_refcount *r);
|
614
|
+
extern gpr_ref_non_zero_type gpr_ref_non_zero_import;
|
615
|
+
#define gpr_ref_non_zero gpr_ref_non_zero_import
|
610
616
|
typedef void(*gpr_refn_type)(gpr_refcount *r, int n);
|
611
617
|
extern gpr_refn_type gpr_refn_import;
|
612
618
|
#define gpr_refn gpr_refn_import
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -27,7 +27,7 @@
|
|
27
27
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
|
-
require 'grpc'
|
30
|
+
require 'grpc/grpc'
|
31
31
|
|
32
32
|
# GRPC contains the General RPC module.
|
33
33
|
module GRPC
|
data/src/ruby/lib/grpc/errors.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -27,7 +27,7 @@
|
|
27
27
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
|
-
require 'grpc'
|
30
|
+
require 'grpc/grpc'
|
31
31
|
|
32
32
|
# GRPC contains the General RPC module.
|
33
33
|
module GRPC
|
@@ -107,7 +107,9 @@ module GRPC
|
|
107
107
|
|
108
108
|
# Starts running the jobs in the thread pool.
|
109
109
|
def start
|
110
|
-
|
110
|
+
@stop_mutex.synchronize do
|
111
|
+
fail 'already stopped' if @stopped
|
112
|
+
end
|
111
113
|
until @workers.size == @size.to_i
|
112
114
|
next_thread = Thread.new do
|
113
115
|
catch(:exit) do # allows { throw :exit } to kill a thread
|
@@ -264,10 +266,10 @@ module GRPC
|
|
264
266
|
@pool = Pool.new(@pool_size)
|
265
267
|
@run_cond = ConditionVariable.new
|
266
268
|
@run_mutex = Mutex.new
|
267
|
-
|
269
|
+
# running_state can take 4 values: :not_started, :running, :stopping, and
|
270
|
+
# :stopped. State transitions can only proceed in that order.
|
271
|
+
@running_state = :not_started
|
268
272
|
@server = RpcServer.setup_srv(server_override, @cq, **kw)
|
269
|
-
@stopped = false
|
270
|
-
@stop_mutex = Mutex.new
|
271
273
|
end
|
272
274
|
|
273
275
|
# stops a running server
|
@@ -275,27 +277,42 @@ module GRPC
|
|
275
277
|
# the call has no impact if the server is already stopped, otherwise
|
276
278
|
# server's current call loop is it's last.
|
277
279
|
def stop
|
278
|
-
|
279
|
-
|
280
|
-
@
|
280
|
+
@run_mutex.synchronize do
|
281
|
+
fail 'Cannot stop before starting' if @running_state == :not_started
|
282
|
+
return if @running_state != :running
|
283
|
+
transition_running_state(:stopping)
|
281
284
|
end
|
282
285
|
deadline = from_relative_time(@poll_period)
|
283
|
-
return if @server.close(@cq, deadline)
|
284
|
-
deadline = from_relative_time(@poll_period)
|
285
286
|
@server.close(@cq, deadline)
|
286
287
|
@pool.stop
|
287
288
|
end
|
288
289
|
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
290
|
+
def running_state
|
291
|
+
@run_mutex.synchronize do
|
292
|
+
return @running_state
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
# Can only be called while holding @run_mutex
|
297
|
+
def transition_running_state(target_state)
|
298
|
+
state_transitions = {
|
299
|
+
not_started: :running,
|
300
|
+
running: :stopping,
|
301
|
+
stopping: :stopped
|
302
|
+
}
|
303
|
+
if state_transitions[@running_state] == target_state
|
304
|
+
@running_state = target_state
|
305
|
+
else
|
306
|
+
fail "Bad server state transition: #{@running_state}->#{target_state}"
|
293
307
|
end
|
294
308
|
end
|
295
309
|
|
296
|
-
# determines if the server is currently running
|
297
310
|
def running?
|
298
|
-
|
311
|
+
running_state == :running
|
312
|
+
end
|
313
|
+
|
314
|
+
def stopped?
|
315
|
+
running_state == :stopped
|
299
316
|
end
|
300
317
|
|
301
318
|
# Is called from other threads to wait for #run to start up the server.
|
@@ -304,13 +321,11 @@ module GRPC
|
|
304
321
|
#
|
305
322
|
# @param timeout [Numeric] number of seconds to wait
|
306
323
|
# @result [true, false] true if the server is running, false otherwise
|
307
|
-
def wait_till_running(timeout =
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
sleep(sleep_period)
|
324
|
+
def wait_till_running(timeout = nil)
|
325
|
+
@run_mutex.synchronize do
|
326
|
+
@run_cond.wait(@run_mutex, timeout) if @running_state == :not_started
|
327
|
+
return @running_state == :running
|
312
328
|
end
|
313
|
-
running?
|
314
329
|
end
|
315
330
|
|
316
331
|
# Runs the server in its own thread, then waits for signal INT or TERM on
|
@@ -360,11 +375,14 @@ module GRPC
|
|
360
375
|
# @param service [Object|Class] a service class or object as described
|
361
376
|
# above
|
362
377
|
def handle(service)
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
378
|
+
@run_mutex.synchronize do
|
379
|
+
unless @running_state == :not_started
|
380
|
+
fail 'cannot add services if the server has been started'
|
381
|
+
end
|
382
|
+
cls = service.is_a?(Class) ? service : service.class
|
383
|
+
assert_valid_service_class(cls)
|
384
|
+
add_rpc_descs_for(service)
|
385
|
+
end
|
368
386
|
end
|
369
387
|
|
370
388
|
# runs the server
|
@@ -375,16 +393,13 @@ module GRPC
|
|
375
393
|
# - #running? returns true after this is called, until #stop cause the
|
376
394
|
# the server to stop.
|
377
395
|
def run
|
378
|
-
if rpc_descs.size.zero?
|
379
|
-
GRPC.logger.warn('did not run as no services were present')
|
380
|
-
return
|
381
|
-
end
|
382
396
|
@run_mutex.synchronize do
|
383
|
-
|
384
|
-
@
|
397
|
+
fail 'cannot run without registering services' if rpc_descs.size.zero?
|
398
|
+
@pool.start
|
399
|
+
@server.start
|
400
|
+
transition_running_state(:running)
|
401
|
+
@run_cond.broadcast
|
385
402
|
end
|
386
|
-
@pool.start
|
387
|
-
@server.start
|
388
403
|
loop_handle_server_calls
|
389
404
|
end
|
390
405
|
|
@@ -413,9 +428,9 @@ module GRPC
|
|
413
428
|
|
414
429
|
# handles calls to the server
|
415
430
|
def loop_handle_server_calls
|
416
|
-
fail 'not
|
431
|
+
fail 'not started' if running_state == :not_started
|
417
432
|
loop_tag = Object.new
|
418
|
-
|
433
|
+
while running_state == :running
|
419
434
|
begin
|
420
435
|
an_rpc = @server.request_call(@cq, loop_tag, INFINITE_FUTURE)
|
421
436
|
break if (!an_rpc.nil?) && an_rpc.call.nil?
|
@@ -430,11 +445,14 @@ module GRPC
|
|
430
445
|
rescue Core::CallError, RuntimeError => e
|
431
446
|
# these might happen for various reasonse. The correct behaviour of
|
432
447
|
# the server is to log them and continue, if it's not shutting down.
|
433
|
-
|
448
|
+
if running_state == :running
|
449
|
+
GRPC.logger.warn("server call failed: #{e}")
|
450
|
+
end
|
434
451
|
next
|
435
452
|
end
|
436
453
|
end
|
437
|
-
@
|
454
|
+
# @running_state should be :stopping here
|
455
|
+
@run_mutex.synchronize { transition_running_state(:stopped) }
|
438
456
|
GRPC.logger.info("stopped: #{self}")
|
439
457
|
end
|
440
458
|
|
@@ -484,9 +502,10 @@ module GRPC
|
|
484
502
|
cls.assert_rpc_descs_have_methods
|
485
503
|
end
|
486
504
|
|
505
|
+
# This should be called while holding @run_mutex
|
487
506
|
def add_rpc_descs_for(service)
|
488
507
|
cls = service.is_a?(Class) ? service : service.class
|
489
|
-
specs, handlers = rpc_descs, rpc_handlers
|
508
|
+
specs, handlers = (@rpc_descs ||= {}), (@rpc_handlers ||= {})
|
490
509
|
cls.rpc_descs.each_pair do |name, spec|
|
491
510
|
route = "/#{cls.service_name}/#{name}".to_sym
|
492
511
|
fail "already registered: rpc #{route} from #{spec}" if specs.key? route
|
data/src/ruby/pb/README.md
CHANGED
@@ -11,7 +11,7 @@ The code is is generated using the protoc (> 3.0.0.alpha.1) and the
|
|
11
11
|
grpc_ruby_plugin. These must be installed to regenerate the IDL defined
|
12
12
|
classes, but that's not necessary just to use them.
|
13
13
|
|
14
|
-
health_check/
|
14
|
+
health_check/v1
|
15
15
|
--------------------
|
16
16
|
|
17
17
|
This package defines the surface of a simple health check service that gRPC
|
@@ -20,7 +20,7 @@ re-generate the surface.
|
|
20
20
|
|
21
21
|
```bash
|
22
22
|
$ # (from this directory)
|
23
|
-
$ protoc -I ../../proto ../../proto/grpc/health/
|
23
|
+
$ protoc -I ../../proto ../../proto/grpc/health/v1/health.proto \
|
24
24
|
--grpc_out=. \
|
25
25
|
--ruby_out=. \
|
26
26
|
--plugin=protoc-gen-grpc=`which grpc_ruby_plugin`
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/bin/sh
|
2
|
-
# Copyright 2015, Google Inc.
|
2
|
+
# Copyright 2015-2016, Google Inc.
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
@@ -35,7 +35,7 @@ cd $(dirname $0)/../../..
|
|
35
35
|
PROTOC=bins/opt/protobuf/protoc
|
36
36
|
PLUGIN=protoc-gen-grpc=bins/opt/grpc_ruby_plugin
|
37
37
|
|
38
|
-
$PROTOC -I src/proto src/proto/grpc/health/
|
38
|
+
$PROTOC -I src/proto src/proto/grpc/health/v1/health.proto \
|
39
39
|
--grpc_out=src/ruby/pb \
|
40
40
|
--ruby_out=src/ruby/pb \
|
41
41
|
--plugin=$PLUGIN
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -28,7 +28,7 @@
|
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
require 'grpc'
|
31
|
-
require 'grpc/health/
|
31
|
+
require 'grpc/health/v1/health_services'
|
32
32
|
require 'thread'
|
33
33
|
|
34
34
|
module Grpc
|
@@ -36,9 +36,9 @@ module Grpc
|
|
36
36
|
# service.
|
37
37
|
module Health
|
38
38
|
# Checker is implementation of the schema-specified health checking service.
|
39
|
-
class Checker <
|
39
|
+
class Checker < V1::Health::Service
|
40
40
|
StatusCodes = GRPC::Core::StatusCodes
|
41
|
-
HealthCheckResponse =
|
41
|
+
HealthCheckResponse = V1::HealthCheckResponse
|
42
42
|
|
43
43
|
# Initializes the statuses of participating services
|
44
44
|
def initialize
|
@@ -50,20 +50,20 @@ module Grpc
|
|
50
50
|
def check(req, _call)
|
51
51
|
status = nil
|
52
52
|
@status_mutex.synchronize do
|
53
|
-
status = @statuses["#{req.
|
53
|
+
status = @statuses["#{req.service}"]
|
54
54
|
end
|
55
55
|
fail GRPC::BadStatus, StatusCodes::NOT_FOUND if status.nil?
|
56
56
|
HealthCheckResponse.new(status: status)
|
57
57
|
end
|
58
58
|
|
59
|
-
# Adds the health status for a given
|
60
|
-
def add_status(
|
61
|
-
@status_mutex.synchronize { @statuses["#{
|
59
|
+
# Adds the health status for a given service.
|
60
|
+
def add_status(service, status)
|
61
|
+
@status_mutex.synchronize { @statuses["#{service}"] = status }
|
62
62
|
end
|
63
63
|
|
64
|
-
# Clears the status for the given
|
65
|
-
def clear_status(
|
66
|
-
@status_mutex.synchronize { @statuses.delete("#{
|
64
|
+
# Clears the status for the given service.
|
65
|
+
def clear_status(service)
|
66
|
+
@status_mutex.synchronize { @statuses.delete("#{service}") }
|
67
67
|
end
|
68
68
|
|
69
69
|
# Clears alls the statuses.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: grpc/health/v1/health.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
+
add_message "grpc.health.v1.HealthCheckRequest" do
|
8
|
+
optional :service, :string, 1
|
9
|
+
end
|
10
|
+
add_message "grpc.health.v1.HealthCheckResponse" do
|
11
|
+
optional :status, :enum, 1, "grpc.health.v1.HealthCheckResponse.ServingStatus"
|
12
|
+
end
|
13
|
+
add_enum "grpc.health.v1.HealthCheckResponse.ServingStatus" do
|
14
|
+
value :UNKNOWN, 0
|
15
|
+
value :SERVING, 1
|
16
|
+
value :NOT_SERVING, 2
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module Grpc
|
21
|
+
module Health
|
22
|
+
module V1
|
23
|
+
HealthCheckRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckRequest").msgclass
|
24
|
+
HealthCheckResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckResponse").msgclass
|
25
|
+
HealthCheckResponse::ServingStatus = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckResponse.ServingStatus").enummodule
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
-
# Source: grpc/health/
|
2
|
+
# Source: grpc/health/v1/health.proto for package 'grpc.health.v1'
|
3
3
|
|
4
4
|
require 'grpc'
|
5
|
-
require 'grpc/health/
|
5
|
+
require 'grpc/health/v1/health'
|
6
6
|
|
7
7
|
module Grpc
|
8
8
|
module Health
|
9
|
-
module
|
9
|
+
module V1
|
10
10
|
module Health
|
11
11
|
|
12
12
|
# TODO: add proto service documentation here
|
@@ -16,7 +16,7 @@ module Grpc
|
|
16
16
|
|
17
17
|
self.marshal_class_method = :encode
|
18
18
|
self.unmarshal_class_method = :decode
|
19
|
-
self.service_name = 'grpc.health.
|
19
|
+
self.service_name = 'grpc.health.v1.Health'
|
20
20
|
|
21
21
|
rpc :Check, HealthCheckRequest, HealthCheckResponse
|
22
22
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -198,6 +198,7 @@ shared_examples 'basic GRPC message delivery is OK' do
|
|
198
198
|
# confirm the client can receive the server response and status.
|
199
199
|
client_ops = {
|
200
200
|
CallOps::SEND_CLOSE_FROM_CLIENT => nil,
|
201
|
+
CallOps::RECV_INITIAL_METADATA => nil,
|
201
202
|
CallOps::RECV_MESSAGE => nil,
|
202
203
|
CallOps::RECV_STATUS_ON_CLIENT => nil
|
203
204
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -220,19 +220,10 @@ describe GRPC::RpcServer do
|
|
220
220
|
@srv = RpcServer.new(**opts)
|
221
221
|
end
|
222
222
|
|
223
|
-
after(:each) do
|
224
|
-
@srv.stop
|
225
|
-
end
|
226
|
-
|
227
223
|
it 'starts out false' do
|
228
224
|
expect(@srv.stopped?).to be(false)
|
229
225
|
end
|
230
226
|
|
231
|
-
it 'stays false after a #stop is called before #run' do
|
232
|
-
@srv.stop
|
233
|
-
expect(@srv.stopped?).to be(false)
|
234
|
-
end
|
235
|
-
|
236
227
|
it 'stays false after the server starts running', server: true do
|
237
228
|
@srv.handle(EchoService)
|
238
229
|
t = Thread.new { @srv.run }
|
@@ -247,8 +238,8 @@ describe GRPC::RpcServer do
|
|
247
238
|
t = Thread.new { @srv.run }
|
248
239
|
@srv.wait_till_running
|
249
240
|
@srv.stop
|
250
|
-
expect(@srv.stopped?).to be(true)
|
251
241
|
t.join
|
242
|
+
expect(@srv.stopped?).to be(true)
|
252
243
|
end
|
253
244
|
end
|
254
245
|
|
@@ -266,9 +257,7 @@ describe GRPC::RpcServer do
|
|
266
257
|
server_override: @server
|
267
258
|
}
|
268
259
|
r = RpcServer.new(**opts)
|
269
|
-
r.run
|
270
|
-
expect(r.running?).to be(false)
|
271
|
-
r.stop
|
260
|
+
expect { r.run }.to raise_error(RuntimeError)
|
272
261
|
end
|
273
262
|
|
274
263
|
it 'is true after run is called with a registered service' do
|
@@ -293,10 +282,6 @@ describe GRPC::RpcServer do
|
|
293
282
|
@srv = RpcServer.new(**@opts)
|
294
283
|
end
|
295
284
|
|
296
|
-
after(:each) do
|
297
|
-
@srv.stop
|
298
|
-
end
|
299
|
-
|
300
285
|
it 'raises if #run has already been called' do
|
301
286
|
@srv.handle(EchoService)
|
302
287
|
t = Thread.new { @srv.run }
|
@@ -528,10 +513,6 @@ describe GRPC::RpcServer do
|
|
528
513
|
@srv = RpcServer.new(**server_opts)
|
529
514
|
end
|
530
515
|
|
531
|
-
after(:each) do
|
532
|
-
@srv.stop
|
533
|
-
end
|
534
|
-
|
535
516
|
it 'should be added to BadStatus when requests fail', server: true do
|
536
517
|
service = FailingService.new
|
537
518
|
@srv.handle(service)
|
@@ -28,7 +28,7 @@
|
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
require 'grpc'
|
31
|
-
require 'grpc/health/
|
31
|
+
require 'grpc/health/v1/health'
|
32
32
|
require 'grpc/health/checker'
|
33
33
|
require 'open3'
|
34
34
|
require 'tmpdir'
|
@@ -43,7 +43,7 @@ describe 'Health protobuf code generation' do
|
|
43
43
|
skip 'protoc || grpc_ruby_plugin missing, cannot verify health code-gen'
|
44
44
|
else
|
45
45
|
it 'should already be loaded indirectly i.e, used by the other specs' do
|
46
|
-
expect(require('grpc/health/
|
46
|
+
expect(require('grpc/health/v1/health_services')).to be(false)
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'should have the same content as created by code generation' do
|
@@ -52,7 +52,7 @@ describe 'Health protobuf code generation' do
|
|
52
52
|
|
53
53
|
# Get the current content
|
54
54
|
service_path = File.join(root_dir, 'ruby', 'pb', 'grpc',
|
55
|
-
'health', '
|
55
|
+
'health', 'v1', 'health_services.rb')
|
56
56
|
want = nil
|
57
57
|
File.open(service_path) { |f| want = f.read }
|
58
58
|
|
@@ -61,12 +61,12 @@ describe 'Health protobuf code generation' do
|
|
61
61
|
plugin = plugin.strip
|
62
62
|
got = nil
|
63
63
|
Dir.mktmpdir do |tmp_dir|
|
64
|
-
gen_out = File.join(tmp_dir, 'grpc', 'health', '
|
64
|
+
gen_out = File.join(tmp_dir, 'grpc', 'health', 'v1',
|
65
65
|
'health_services.rb')
|
66
66
|
pid = spawn(
|
67
67
|
'protoc',
|
68
68
|
'-I.',
|
69
|
-
'grpc/health/
|
69
|
+
'grpc/health/v1/health.proto',
|
70
70
|
"--grpc_out=#{tmp_dir}",
|
71
71
|
"--plugin=protoc-gen-grpc=#{plugin}",
|
72
72
|
chdir: pb_dir)
|
@@ -81,27 +81,17 @@ end
|
|
81
81
|
|
82
82
|
describe Grpc::Health::Checker do
|
83
83
|
StatusCodes = GRPC::Core::StatusCodes
|
84
|
-
ServingStatus = Grpc::Health::
|
85
|
-
HCResp = Grpc::Health::
|
86
|
-
HCReq = Grpc::Health::
|
84
|
+
ServingStatus = Grpc::Health::V1::HealthCheckResponse::ServingStatus
|
85
|
+
HCResp = Grpc::Health::V1::HealthCheckResponse
|
86
|
+
HCReq = Grpc::Health::V1::HealthCheckRequest
|
87
87
|
success_tests =
|
88
88
|
[
|
89
89
|
{
|
90
|
-
desc: '
|
91
|
-
host: '',
|
90
|
+
desc: 'the service is not specified',
|
92
91
|
service: ''
|
93
92
|
}, {
|
94
|
-
desc: '
|
95
|
-
host: 'test-fake-host',
|
96
|
-
service: ''
|
97
|
-
}, {
|
98
|
-
desc: 'the host and service are specified',
|
99
|
-
host: 'test-fake-host',
|
93
|
+
desc: 'the service is specified',
|
100
94
|
service: 'fake-service-1'
|
101
|
-
}, {
|
102
|
-
desc: 'only the service is specified',
|
103
|
-
host: '',
|
104
|
-
service: 'fake-service-2'
|
105
95
|
}
|
106
96
|
]
|
107
97
|
|
@@ -114,9 +104,8 @@ describe Grpc::Health::Checker do
|
|
114
104
|
context 'method `add_status` and `check`' do
|
115
105
|
success_tests.each do |t|
|
116
106
|
it "should succeed when #{t[:desc]}" do
|
117
|
-
subject.add_status(t[:
|
118
|
-
got = subject.check(HCReq.new(
|
119
|
-
nil)
|
107
|
+
subject.add_status(t[:service], ServingStatus::NOT_SERVING)
|
108
|
+
got = subject.check(HCReq.new(service: t[:service]), nil)
|
120
109
|
want = HCResp.new(status: ServingStatus::NOT_SERVING)
|
121
110
|
expect(got).to eq(want)
|
122
111
|
end
|
@@ -127,7 +116,7 @@ describe Grpc::Health::Checker do
|
|
127
116
|
success_tests.each do |t|
|
128
117
|
it "should fail with NOT_FOUND when #{t[:desc]}" do
|
129
118
|
blk = proc do
|
130
|
-
subject.check(HCReq.new(
|
119
|
+
subject.check(HCReq.new(service: t[:service]), nil)
|
131
120
|
end
|
132
121
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
133
122
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
@@ -138,16 +127,14 @@ describe Grpc::Health::Checker do
|
|
138
127
|
context 'method `clear_status`' do
|
139
128
|
success_tests.each do |t|
|
140
129
|
it "should fail after clearing status when #{t[:desc]}" do
|
141
|
-
subject.add_status(t[:
|
142
|
-
got = subject.check(HCReq.new(
|
143
|
-
nil)
|
130
|
+
subject.add_status(t[:service], ServingStatus::NOT_SERVING)
|
131
|
+
got = subject.check(HCReq.new(service: t[:service]), nil)
|
144
132
|
want = HCResp.new(status: ServingStatus::NOT_SERVING)
|
145
133
|
expect(got).to eq(want)
|
146
134
|
|
147
|
-
subject.clear_status(t[:
|
135
|
+
subject.clear_status(t[:service])
|
148
136
|
blk = proc do
|
149
|
-
subject.check(HCReq.new(
|
150
|
-
nil)
|
137
|
+
subject.check(HCReq.new(service: t[:service]), nil)
|
151
138
|
end
|
152
139
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
153
140
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
@@ -158,9 +145,8 @@ describe Grpc::Health::Checker do
|
|
158
145
|
context 'method `clear_all`' do
|
159
146
|
it 'should return NOT_FOUND after being invoked' do
|
160
147
|
success_tests.each do |t|
|
161
|
-
subject.add_status(t[:
|
162
|
-
got = subject.check(HCReq.new(
|
163
|
-
nil)
|
148
|
+
subject.add_status(t[:service], ServingStatus::NOT_SERVING)
|
149
|
+
got = subject.check(HCReq.new(service: t[:service]), nil)
|
164
150
|
want = HCResp.new(status: ServingStatus::NOT_SERVING)
|
165
151
|
expect(got).to eq(want)
|
166
152
|
end
|
@@ -169,7 +155,7 @@ describe Grpc::Health::Checker do
|
|
169
155
|
|
170
156
|
success_tests.each do |t|
|
171
157
|
blk = proc do
|
172
|
-
subject.check(HCReq.new(
|
158
|
+
subject.check(HCReq.new(service: t[:service]), nil)
|
173
159
|
end
|
174
160
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
175
161
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
@@ -203,7 +189,7 @@ describe Grpc::Health::Checker do
|
|
203
189
|
|
204
190
|
it 'should receive the correct status', server: true do
|
205
191
|
@srv.handle(subject)
|
206
|
-
subject.add_status('',
|
192
|
+
subject.add_status('', ServingStatus::NOT_SERVING)
|
207
193
|
t = Thread.new { @srv.run }
|
208
194
|
@srv.wait_till_running
|
209
195
|
|
@@ -221,7 +207,7 @@ describe Grpc::Health::Checker do
|
|
221
207
|
@srv.wait_till_running
|
222
208
|
blk = proc do
|
223
209
|
stub = CheckerStub.new(@host, :this_channel_is_insecure, **@client_opts)
|
224
|
-
stub.check(HCReq.new(
|
210
|
+
stub.check(HCReq.new(service: 'unknown'))
|
225
211
|
end
|
226
212
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
227
213
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
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: 0.13.
|
4
|
+
version: 0.13.1.pre1
|
5
5
|
platform: universal-darwin
|
6
6
|
authors:
|
7
7
|
- gRPC Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: src/ruby/bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.0.0.alpha.5.0.
|
19
|
+
version: 3.0.0.alpha.5.0.3
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.0.0.alpha.5.0.
|
26
|
+
version: 3.0.0.alpha.5.0.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: googleauth
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -240,8 +240,8 @@ files:
|
|
240
240
|
- src/ruby/pb/README.md
|
241
241
|
- src/ruby/pb/generate_proto_ruby.sh
|
242
242
|
- src/ruby/pb/grpc/health/checker.rb
|
243
|
-
- src/ruby/pb/grpc/health/
|
244
|
-
- src/ruby/pb/grpc/health/
|
243
|
+
- src/ruby/pb/grpc/health/v1/health.rb
|
244
|
+
- src/ruby/pb/grpc/health/v1/health_services.rb
|
245
245
|
- src/ruby/pb/test/client.rb
|
246
246
|
- src/ruby/pb/test/proto/empty.rb
|
247
247
|
- src/ruby/pb/test/proto/messages.rb
|
@@ -286,9 +286,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
286
286
|
version: 2.0.0
|
287
287
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
288
288
|
requirements:
|
289
|
-
- - "
|
289
|
+
- - ">"
|
290
290
|
- !ruby/object:Gem::Version
|
291
|
-
version:
|
291
|
+
version: 1.3.1
|
292
292
|
requirements: []
|
293
293
|
rubyforge_project:
|
294
294
|
rubygems_version: 2.4.3
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
-
# source: grpc/health/v1alpha/health.proto
|
3
|
-
|
4
|
-
require 'google/protobuf'
|
5
|
-
|
6
|
-
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
-
add_message "grpc.health.v1alpha.HealthCheckRequest" do
|
8
|
-
optional :host, :string, 1
|
9
|
-
optional :service, :string, 2
|
10
|
-
end
|
11
|
-
add_message "grpc.health.v1alpha.HealthCheckResponse" do
|
12
|
-
optional :status, :enum, 1, "grpc.health.v1alpha.HealthCheckResponse.ServingStatus"
|
13
|
-
end
|
14
|
-
add_enum "grpc.health.v1alpha.HealthCheckResponse.ServingStatus" do
|
15
|
-
value :UNKNOWN, 0
|
16
|
-
value :SERVING, 1
|
17
|
-
value :NOT_SERVING, 2
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
module Grpc
|
22
|
-
module Health
|
23
|
-
module V1alpha
|
24
|
-
HealthCheckRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1alpha.HealthCheckRequest").msgclass
|
25
|
-
HealthCheckResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1alpha.HealthCheckResponse").msgclass
|
26
|
-
HealthCheckResponse::ServingStatus = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1alpha.HealthCheckResponse.ServingStatus").enummodule
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|