grpc 0.14.1-universal-darwin → 0.15.0-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/bin/math_services.rb +41 -2
- data/src/ruby/ext/grpc/rb_call.c +42 -40
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/ext/grpc/rb_completion_queue.c +59 -6
- data/src/ruby/ext/grpc/rb_completion_queue.h +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +1 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +21 -5
- data/src/ruby/ext/grpc/rb_loader.c +1 -1
- data/src/ruby/ext/grpc/rb_server.c +5 -3
- data/src/ruby/lib/grpc.rb +0 -3
- 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/errors.rb +3 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +32 -42
- data/src/ruby/lib/grpc/generic/bidi_call.rb +20 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +31 -54
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +4 -4
- data/src/ruby/lib/grpc/generic/rpc_server.rb +12 -23
- data/src/ruby/lib/grpc/generic/service.rb +8 -8
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_services.rb +30 -2
- data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services.rb +34 -4
- data/src/ruby/pb/grpc/testing/metrics_services.rb +39 -2
- data/src/ruby/pb/src/proto/grpc/testing/empty.rb +15 -0
- data/src/ruby/pb/src/proto/grpc/testing/messages.rb +84 -0
- data/src/ruby/pb/src/proto/grpc/testing/test.rb +14 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services.rb +110 -0
- data/src/ruby/pb/test/client.rb +5 -2
- data/src/ruby/spec/generic/active_call_spec.rb +3 -2
- data/src/ruby/spec/generic/client_stub_spec.rb +27 -24
- data/src/ruby/spec/generic/rpc_desc_spec.rb +11 -11
- data/src/ruby/spec/generic/rpc_server_spec.rb +42 -61
- data/src/ruby/spec/pb/health/checker_spec.rb +3 -5
- metadata +6 -5
- data/src/ruby/ext/grpc/rb_signal.c +0 -70
- data/src/ruby/ext/grpc/rb_signal.h +0 -39
- data/src/ruby/lib/grpc/signals.rb +0 -69
@@ -36,13 +36,14 @@
|
|
36
36
|
|
37
37
|
#include <grpc/support/port_platform.h>
|
38
38
|
|
39
|
-
#ifdef
|
39
|
+
#ifdef GPR_WINDOWS
|
40
40
|
|
41
41
|
#include <windows.h>
|
42
42
|
|
43
43
|
#include <grpc/census.h>
|
44
44
|
#include <grpc/compression.h>
|
45
45
|
#include <grpc/grpc.h>
|
46
|
+
#include <grpc/grpc_posix.h>
|
46
47
|
#include <grpc/grpc_security.h>
|
47
48
|
#include <grpc/impl/codegen/alloc.h>
|
48
49
|
#include <grpc/impl/codegen/byte_buffer.h>
|
@@ -56,7 +57,7 @@
|
|
56
57
|
#include <grpc/support/cpu.h>
|
57
58
|
#include <grpc/support/histogram.h>
|
58
59
|
#include <grpc/support/host_port.h>
|
59
|
-
#include <grpc/support/
|
60
|
+
#include <grpc/support/log_windows.h>
|
60
61
|
#include <grpc/support/string_util.h>
|
61
62
|
#include <grpc/support/subprocess.h>
|
62
63
|
#include <grpc/support/thd.h>
|
@@ -295,6 +296,9 @@ extern grpc_server_create_type grpc_server_create_import;
|
|
295
296
|
typedef void(*grpc_server_register_completion_queue_type)(grpc_server *server, grpc_completion_queue *cq, void *reserved);
|
296
297
|
extern grpc_server_register_completion_queue_type grpc_server_register_completion_queue_import;
|
297
298
|
#define grpc_server_register_completion_queue grpc_server_register_completion_queue_import
|
299
|
+
typedef void(*grpc_server_register_non_listening_completion_queue_type)(grpc_server *server, grpc_completion_queue *q, void *reserved);
|
300
|
+
extern grpc_server_register_non_listening_completion_queue_type grpc_server_register_non_listening_completion_queue_import;
|
301
|
+
#define grpc_server_register_non_listening_completion_queue grpc_server_register_non_listening_completion_queue_import
|
298
302
|
typedef int(*grpc_server_add_insecure_http2_port_type)(grpc_server *server, const char *addr);
|
299
303
|
extern grpc_server_add_insecure_http2_port_type grpc_server_add_insecure_http2_port_import;
|
300
304
|
#define grpc_server_add_insecure_http2_port grpc_server_add_insecure_http2_port_import
|
@@ -325,6 +329,12 @@ extern grpc_is_binary_header_type grpc_is_binary_header_import;
|
|
325
329
|
typedef const char *(*grpc_call_error_to_string_type)(grpc_call_error error);
|
326
330
|
extern grpc_call_error_to_string_type grpc_call_error_to_string_import;
|
327
331
|
#define grpc_call_error_to_string grpc_call_error_to_string_import
|
332
|
+
typedef grpc_channel *(*grpc_insecure_channel_create_from_fd_type)(const char *target, int fd, const grpc_channel_args *args);
|
333
|
+
extern grpc_insecure_channel_create_from_fd_type grpc_insecure_channel_create_from_fd_import;
|
334
|
+
#define grpc_insecure_channel_create_from_fd grpc_insecure_channel_create_from_fd_import
|
335
|
+
typedef void(*grpc_server_add_insecure_channel_from_fd_type)(grpc_server *server, grpc_completion_queue *cq, int fd);
|
336
|
+
extern grpc_server_add_insecure_channel_from_fd_type grpc_server_add_insecure_channel_from_fd_import;
|
337
|
+
#define grpc_server_add_insecure_channel_from_fd grpc_server_add_insecure_channel_from_fd_import
|
328
338
|
typedef const grpc_auth_property *(*grpc_auth_property_iterator_next_type)(grpc_auth_property_iterator *it);
|
329
339
|
extern grpc_auth_property_iterator_next_type grpc_auth_property_iterator_next_import;
|
330
340
|
#define grpc_auth_property_iterator_next grpc_auth_property_iterator_next_import
|
@@ -472,7 +482,7 @@ extern grpc_byte_buffer_reader_readall_type grpc_byte_buffer_reader_readall_impo
|
|
472
482
|
typedef grpc_byte_buffer *(*grpc_raw_byte_buffer_from_reader_type)(grpc_byte_buffer_reader *reader);
|
473
483
|
extern grpc_raw_byte_buffer_from_reader_type grpc_raw_byte_buffer_from_reader_import;
|
474
484
|
#define grpc_raw_byte_buffer_from_reader grpc_raw_byte_buffer_from_reader_import
|
475
|
-
typedef void(*gpr_log_type)(const char *file, int line, gpr_log_severity severity, const char *format, ...);
|
485
|
+
typedef void(*gpr_log_type)(const char *file, int line, gpr_log_severity severity, const char *format, ...) GPRC_PRINT_FORMAT_CHECK(4, 5);
|
476
486
|
extern gpr_log_type gpr_log_import;
|
477
487
|
#define gpr_log gpr_log_import
|
478
488
|
typedef void(*gpr_log_message_type)(const char *file, int line, gpr_log_severity severity, const char *message);
|
@@ -721,6 +731,12 @@ extern gpr_avl_remove_type gpr_avl_remove_import;
|
|
721
731
|
typedef void *(*gpr_avl_get_type)(gpr_avl avl, void *key);
|
722
732
|
extern gpr_avl_get_type gpr_avl_get_import;
|
723
733
|
#define gpr_avl_get gpr_avl_get_import
|
734
|
+
typedef int(*gpr_avl_maybe_get_type)(gpr_avl avl, void *key, void **value);
|
735
|
+
extern gpr_avl_maybe_get_type gpr_avl_maybe_get_import;
|
736
|
+
#define gpr_avl_maybe_get gpr_avl_maybe_get_import
|
737
|
+
typedef int(*gpr_avl_is_empty_type)(gpr_avl avl);
|
738
|
+
extern gpr_avl_is_empty_type gpr_avl_is_empty_import;
|
739
|
+
#define gpr_avl_is_empty gpr_avl_is_empty_import
|
724
740
|
typedef gpr_cmdline *(*gpr_cmdline_create_type)(const char *description);
|
725
741
|
extern gpr_cmdline_create_type gpr_cmdline_create_import;
|
726
742
|
#define gpr_cmdline_create gpr_cmdline_create_import
|
@@ -811,7 +827,7 @@ extern gpr_format_message_type gpr_format_message_import;
|
|
811
827
|
typedef char *(*gpr_strdup_type)(const char *src);
|
812
828
|
extern gpr_strdup_type gpr_strdup_import;
|
813
829
|
#define gpr_strdup gpr_strdup_import
|
814
|
-
typedef int(*gpr_asprintf_type)(char **strp, const char *format, ...);
|
830
|
+
typedef int(*gpr_asprintf_type)(char **strp, const char *format, ...) GPRC_PRINT_FORMAT_CHECK(2, 3);
|
815
831
|
extern gpr_asprintf_type gpr_asprintf_import;
|
816
832
|
#define gpr_asprintf gpr_asprintf_import
|
817
833
|
typedef const char *(*gpr_subprocess_binary_extension_type)();
|
@@ -856,6 +872,6 @@ extern gpr_thd_join_type gpr_thd_join_import;
|
|
856
872
|
|
857
873
|
void grpc_rb_load_imports(HMODULE library);
|
858
874
|
|
859
|
-
#endif /*
|
875
|
+
#endif /* GPR_WINDOWS */
|
860
876
|
|
861
877
|
#endif
|
@@ -60,6 +60,7 @@ typedef struct grpc_rb_server {
|
|
60
60
|
VALUE mark;
|
61
61
|
/* The actual server */
|
62
62
|
grpc_server *wrapped;
|
63
|
+
grpc_completion_queue *queue;
|
63
64
|
} grpc_rb_server;
|
64
65
|
|
65
66
|
/* Destroys server instances. */
|
@@ -145,6 +146,7 @@ static VALUE grpc_rb_server_init(VALUE self, VALUE cqueue, VALUE channel_args) {
|
|
145
146
|
}
|
146
147
|
grpc_server_register_completion_queue(srv, cq, NULL);
|
147
148
|
wrapper->wrapped = srv;
|
149
|
+
wrapper->queue = cq;
|
148
150
|
|
149
151
|
/* Add the cq as the server's mark object. This ensures the ruby cq can't be
|
150
152
|
GCed before the server */
|
@@ -232,7 +234,7 @@ static VALUE grpc_rb_server_request_call(VALUE self, VALUE cqueue,
|
|
232
234
|
err = grpc_server_request_call(
|
233
235
|
s->wrapped, &call, &st.details, &st.md_ary,
|
234
236
|
grpc_rb_get_wrapped_completion_queue(cqueue),
|
235
|
-
grpc_rb_get_wrapped_completion_queue(
|
237
|
+
grpc_rb_get_wrapped_completion_queue(s->mark),
|
236
238
|
ROBJECT(tag_new));
|
237
239
|
if (err != GRPC_CALL_OK) {
|
238
240
|
grpc_request_call_stack_cleanup(&st);
|
@@ -242,7 +244,7 @@ static VALUE grpc_rb_server_request_call(VALUE self, VALUE cqueue,
|
|
242
244
|
return Qnil;
|
243
245
|
}
|
244
246
|
|
245
|
-
ev = grpc_rb_completion_queue_pluck_event(
|
247
|
+
ev = grpc_rb_completion_queue_pluck_event(s->mark, tag_new, timeout);
|
246
248
|
if (ev.type == GRPC_QUEUE_TIMEOUT) {
|
247
249
|
grpc_request_call_stack_cleanup(&st);
|
248
250
|
return Qnil;
|
@@ -260,7 +262,7 @@ static VALUE grpc_rb_server_request_call(VALUE self, VALUE cqueue,
|
|
260
262
|
rb_str_new2(st.details.host),
|
261
263
|
rb_funcall(rb_cTime, id_at, 2, INT2NUM(deadline.tv_sec),
|
262
264
|
INT2NUM(deadline.tv_nsec)),
|
263
|
-
grpc_rb_md_ary_to_h(&st.md_ary), grpc_rb_wrap_call(call), NULL);
|
265
|
+
grpc_rb_md_ary_to_h(&st.md_ary), grpc_rb_wrap_call(call), cqueue, NULL);
|
264
266
|
grpc_request_call_stack_cleanup(&st);
|
265
267
|
return result;
|
266
268
|
}
|
data/src/ruby/lib/grpc.rb
CHANGED
@@ -33,7 +33,6 @@ require_relative 'grpc/errors'
|
|
33
33
|
require_relative 'grpc/grpc'
|
34
34
|
require_relative 'grpc/logconfig'
|
35
35
|
require_relative 'grpc/notifier'
|
36
|
-
require_relative 'grpc/signals'
|
37
36
|
require_relative 'grpc/version'
|
38
37
|
require_relative 'grpc/core/time_consts'
|
39
38
|
require_relative 'grpc/generic/active_call'
|
@@ -48,5 +47,3 @@ begin
|
|
48
47
|
ensure
|
49
48
|
file.close
|
50
49
|
end
|
51
|
-
|
52
|
-
GRPC::Signals.wait_for_signals
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/src/ruby/lib/grpc/errors.rb
CHANGED
@@ -40,11 +40,12 @@ module GRPC
|
|
40
40
|
|
41
41
|
# @param code [Numeric] the status code
|
42
42
|
# @param details [String] the details of the exception
|
43
|
-
|
43
|
+
# @param metadata [Hash] the error's metadata
|
44
|
+
def initialize(code, details = 'unknown cause', metadata = {})
|
44
45
|
super("#{code}:#{details}")
|
45
46
|
@code = code
|
46
47
|
@details = details
|
47
|
-
@metadata =
|
48
|
+
@metadata = metadata
|
48
49
|
end
|
49
50
|
|
50
51
|
# Converts the exception to a GRPC::Status for use in the networking
|
@@ -30,7 +30,6 @@
|
|
30
30
|
require 'forwardable'
|
31
31
|
require 'weakref'
|
32
32
|
require_relative 'bidi_call'
|
33
|
-
require_relative '../signals'
|
34
33
|
|
35
34
|
class Struct
|
36
35
|
# BatchResult is the struct returned by calls to call#start_batch.
|
@@ -45,7 +44,7 @@ class Struct
|
|
45
44
|
# raise BadStatus, propagating the metadata if present.
|
46
45
|
md = status.metadata
|
47
46
|
with_sym_keys = Hash[md.each_pair.collect { |x, y| [x.to_sym, y] }]
|
48
|
-
fail GRPC::BadStatus.new(status.code, status.details,
|
47
|
+
fail GRPC::BadStatus.new(status.code, status.details, with_sym_keys)
|
49
48
|
end
|
50
49
|
status
|
51
50
|
end
|
@@ -77,14 +76,15 @@ module GRPC
|
|
77
76
|
#
|
78
77
|
# @param call [Call] a call on which to start and invocation
|
79
78
|
# @param q [CompletionQueue] the completion queue
|
80
|
-
|
79
|
+
# @param metadata [Hash] the metadata
|
80
|
+
def self.client_invoke(call, q, metadata = {})
|
81
81
|
fail(TypeError, '!Core::Call') unless call.is_a? Core::Call
|
82
82
|
unless q.is_a? Core::CompletionQueue
|
83
83
|
fail(TypeError, '!Core::CompletionQueue')
|
84
84
|
end
|
85
85
|
metadata_tag = Object.new
|
86
86
|
call.run_batch(q, metadata_tag, INFINITE_FUTURE,
|
87
|
-
SEND_INITIAL_METADATA =>
|
87
|
+
SEND_INITIAL_METADATA => metadata)
|
88
88
|
metadata_tag
|
89
89
|
end
|
90
90
|
|
@@ -103,7 +103,7 @@ module GRPC
|
|
103
103
|
#
|
104
104
|
# @param call [Call] the call used by the ActiveCall
|
105
105
|
# @param q [CompletionQueue] the completion queue used to accept
|
106
|
-
# the call
|
106
|
+
# the call. This queue will be closed on call completion.
|
107
107
|
# @param marshal [Function] f(obj)->string that marshal requests
|
108
108
|
# @param unmarshal [Function] f(string)->obj that unmarshals responses
|
109
109
|
# @param deadline [Fixnum] the deadline for the call to complete
|
@@ -123,10 +123,6 @@ module GRPC
|
|
123
123
|
@unmarshal = unmarshal
|
124
124
|
@metadata_tag = metadata_tag
|
125
125
|
@op_notifier = nil
|
126
|
-
weak_self = WeakRef.new(self)
|
127
|
-
remove_handler = GRPC::Signals.register_handler(&weak_self
|
128
|
-
.method(:cancel))
|
129
|
-
ObjectSpace.define_finalizer(self, remove_handler)
|
130
126
|
end
|
131
127
|
|
132
128
|
# output_metadata are provides access to hash that can be used to
|
@@ -195,6 +191,8 @@ module GRPC
|
|
195
191
|
@call.status = batch_result.status
|
196
192
|
op_is_done
|
197
193
|
batch_result.check_status
|
194
|
+
@call.close
|
195
|
+
@cq.close
|
198
196
|
end
|
199
197
|
|
200
198
|
# remote_send sends a request to the remote endpoint.
|
@@ -216,13 +214,12 @@ module GRPC
|
|
216
214
|
# @param details [String] details
|
217
215
|
# @param assert_finished [true, false] when true(default), waits for
|
218
216
|
# FINISHED.
|
219
|
-
#
|
220
|
-
#
|
221
|
-
|
222
|
-
|
223
|
-
def send_status(code = OK, details = '', assert_finished = false, **kw)
|
217
|
+
# @param metadata [Hash] metadata to send to the server. If a value is a
|
218
|
+
# list, mulitple metadata for its key are sent
|
219
|
+
def send_status(code = OK, details = '', assert_finished = false,
|
220
|
+
metadata: {})
|
224
221
|
ops = {
|
225
|
-
SEND_STATUS_FROM_SERVER => Struct::Status.new(code, details,
|
222
|
+
SEND_STATUS_FROM_SERVER => Struct::Status.new(code, details, metadata)
|
226
223
|
}
|
227
224
|
ops[RECV_CLOSE_ON_SERVER] = nil if assert_finished
|
228
225
|
@call.run_batch(@cq, self, INFINITE_FUTURE, ops)
|
@@ -316,14 +313,12 @@ module GRPC
|
|
316
313
|
# request_response sends a request to a GRPC server, and returns the
|
317
314
|
# response.
|
318
315
|
#
|
319
|
-
# == Keyword Arguments ==
|
320
|
-
# any keyword arguments are treated as metadata to be sent to the server
|
321
|
-
# if a keyword value is a list, multiple metadata for it's key are sent
|
322
|
-
#
|
323
316
|
# @param req [Object] the request sent to the server
|
317
|
+
# @param metadata [Hash] metadata to be sent to the server. If a value is
|
318
|
+
# a list, multiple metadata for its key are sent
|
324
319
|
# @return [Object] the response received from the server
|
325
|
-
def request_response(req,
|
326
|
-
start_call(
|
320
|
+
def request_response(req, metadata: {})
|
321
|
+
start_call(metadata) unless @started
|
327
322
|
remote_send(req)
|
328
323
|
writes_done(false)
|
329
324
|
response = remote_read
|
@@ -342,14 +337,12 @@ module GRPC
|
|
342
337
|
# array of marshallable objects; in typical case it will be an Enumerable
|
343
338
|
# that allows dynamic construction of the marshallable objects.
|
344
339
|
#
|
345
|
-
# == Keyword Arguments ==
|
346
|
-
# any keyword arguments are treated as metadata to be sent to the server
|
347
|
-
# if a keyword value is a list, multiple metadata for it's key are sent
|
348
|
-
#
|
349
340
|
# @param requests [Object] an Enumerable of requests to send
|
341
|
+
# @param metadata [Hash] metadata to be sent to the server. If a value is
|
342
|
+
# a list, multiple metadata for its key are sent
|
350
343
|
# @return [Object] the response received from the server
|
351
|
-
def client_streamer(requests,
|
352
|
-
start_call(
|
344
|
+
def client_streamer(requests, metadata: {})
|
345
|
+
start_call(metadata) unless @started
|
353
346
|
requests.each { |r| remote_send(r) }
|
354
347
|
writes_done(false)
|
355
348
|
response = remote_read
|
@@ -370,15 +363,12 @@ module GRPC
|
|
370
363
|
# it is executed with each response as the argument and no result is
|
371
364
|
# returned.
|
372
365
|
#
|
373
|
-
# == Keyword Arguments ==
|
374
|
-
# any keyword arguments are treated as metadata to be sent to the server
|
375
|
-
# if a keyword value is a list, multiple metadata for it's key are sent
|
376
|
-
# any keyword arguments are treated as metadata to be sent to the server.
|
377
|
-
#
|
378
366
|
# @param req [Object] the request sent to the server
|
367
|
+
# @param metadata [Hash] metadata to be sent to the server. If a value is
|
368
|
+
# a list, multiple metadata for its key are sent
|
379
369
|
# @return [Enumerator|nil] a response Enumerator
|
380
|
-
def server_streamer(req,
|
381
|
-
start_call(
|
370
|
+
def server_streamer(req, metadata: {})
|
371
|
+
start_call(metadata) unless @started
|
382
372
|
remote_send(req)
|
383
373
|
writes_done(false)
|
384
374
|
replies = enum_for(:each_remote_read_then_finish)
|
@@ -412,14 +402,12 @@ module GRPC
|
|
412
402
|
# the_call#writes_done has been called, otherwise the block will loop
|
413
403
|
# forever.
|
414
404
|
#
|
415
|
-
# == Keyword Arguments ==
|
416
|
-
# any keyword arguments are treated as metadata to be sent to the server
|
417
|
-
# if a keyword value is a list, multiple metadata for it's key are sent
|
418
|
-
#
|
419
405
|
# @param requests [Object] an Enumerable of requests to send
|
406
|
+
# @param metadata [Hash] metadata to be sent to the server. If a value is
|
407
|
+
# a list, multiple metadata for its key are sent
|
420
408
|
# @return [Enumerator, nil] a response Enumerator
|
421
|
-
def bidi_streamer(requests,
|
422
|
-
start_call(
|
409
|
+
def bidi_streamer(requests, metadata: {}, &blk)
|
410
|
+
start_call(metadata) unless @started
|
423
411
|
bd = BidiCall.new(@call, @cq, @marshal, @unmarshal,
|
424
412
|
metadata_tag: @metadata_tag)
|
425
413
|
@metadata_tag = nil # run_on_client ensures metadata is read
|
@@ -458,9 +446,11 @@ module GRPC
|
|
458
446
|
private
|
459
447
|
|
460
448
|
# Starts the call if not already started
|
461
|
-
|
449
|
+
# @param metadata [Hash] metadata to be sent to the server. If a value is
|
450
|
+
# a list, multiple metadata for its key are sent
|
451
|
+
def start_call(metadata = {})
|
462
452
|
return if @started
|
463
|
-
@metadata_tag = ActiveCall.client_invoke(@call, @cq,
|
453
|
+
@metadata_tag = ActiveCall.client_invoke(@call, @cq, metadata)
|
464
454
|
@started = true
|
465
455
|
end
|
466
456
|
|
@@ -69,6 +69,10 @@ module GRPC
|
|
69
69
|
@readq = Queue.new
|
70
70
|
@unmarshal = unmarshal
|
71
71
|
@metadata_tag = metadata_tag
|
72
|
+
@reads_complete = false
|
73
|
+
@writes_complete = false
|
74
|
+
@complete = false
|
75
|
+
@done_mutex = Mutex.new
|
72
76
|
end
|
73
77
|
|
74
78
|
# Begins orchestration of the Bidi stream for a client sending requests.
|
@@ -115,6 +119,16 @@ module GRPC
|
|
115
119
|
@op_notifier.notify(self)
|
116
120
|
end
|
117
121
|
|
122
|
+
# signals that a bidi operation is complete (read + write)
|
123
|
+
def finished
|
124
|
+
@done_mutex.synchronize do
|
125
|
+
return unless @reads_complete && @writes_complete && !@complete
|
126
|
+
@call.close
|
127
|
+
@cq.close
|
128
|
+
@complete = true
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
118
132
|
# performs a read using @call.run_batch, ensures metadata is set up
|
119
133
|
def read_using_run_batch
|
120
134
|
ops = { RECV_MESSAGE => nil }
|
@@ -163,12 +177,16 @@ module GRPC
|
|
163
177
|
SEND_CLOSE_FROM_CLIENT => nil)
|
164
178
|
GRPC.logger.debug('bidi-write-loop: done')
|
165
179
|
notify_done
|
180
|
+
@writes_complete = true
|
181
|
+
finished
|
166
182
|
end
|
167
183
|
GRPC.logger.debug('bidi-write-loop: finished')
|
168
184
|
rescue StandardError => e
|
169
185
|
GRPC.logger.warn('bidi-write-loop: failed')
|
170
186
|
GRPC.logger.warn(e)
|
171
187
|
notify_done
|
188
|
+
@writes_complete = true
|
189
|
+
finished
|
172
190
|
raise e
|
173
191
|
end
|
174
192
|
|
@@ -212,6 +230,8 @@ module GRPC
|
|
212
230
|
@readq.push(e) # let each_queued_msg terminate with this error
|
213
231
|
end
|
214
232
|
GRPC.logger.debug('bidi-read-loop: finished')
|
233
|
+
@reads_complete = true
|
234
|
+
finished
|
215
235
|
end
|
216
236
|
end
|
217
237
|
end
|
@@ -44,21 +44,21 @@ module GRPC
|
|
44
44
|
|
45
45
|
# setup_channel is used by #initialize to constuct a channel from its
|
46
46
|
# arguments.
|
47
|
-
def self.setup_channel(alt_chan, host, creds,
|
47
|
+
def self.setup_channel(alt_chan, host, creds, channel_args = {})
|
48
48
|
unless alt_chan.nil?
|
49
49
|
fail(TypeError, '!Channel') unless alt_chan.is_a?(Core::Channel)
|
50
50
|
return alt_chan
|
51
51
|
end
|
52
|
-
if
|
53
|
-
|
52
|
+
if channel_args['grpc.primary_user_agent'].nil?
|
53
|
+
channel_args['grpc.primary_user_agent'] = ''
|
54
54
|
else
|
55
|
-
|
55
|
+
channel_args['grpc.primary_user_agent'] += ' '
|
56
56
|
end
|
57
|
-
|
57
|
+
channel_args['grpc.primary_user_agent'] += "grpc-ruby/#{VERSION}"
|
58
58
|
unless creds.is_a?(Core::ChannelCredentials) || creds.is_a?(Symbol)
|
59
59
|
fail(TypeError, '!ChannelCredentials or Symbol')
|
60
60
|
end
|
61
|
-
Core::Channel.new(host,
|
61
|
+
Core::Channel.new(host, channel_args, creds)
|
62
62
|
end
|
63
63
|
|
64
64
|
# Allows users of the stub to modify the propagate mask.
|
@@ -96,15 +96,16 @@ module GRPC
|
|
96
96
|
# :this_channel_is_insecure
|
97
97
|
# @param channel_override [Core::Channel] a pre-created channel
|
98
98
|
# @param timeout [Number] the default timeout to use in requests
|
99
|
-
# @param
|
99
|
+
# @param channel_args [Hash] the channel arguments
|
100
100
|
def initialize(host, q, creds,
|
101
101
|
channel_override: nil,
|
102
102
|
timeout: nil,
|
103
103
|
propagate_mask: nil,
|
104
|
-
|
104
|
+
channel_args: {})
|
105
105
|
fail(TypeError, '!CompletionQueue') unless q.is_a?(Core::CompletionQueue)
|
106
|
-
@ch = ClientStub.setup_channel(channel_override, host, creds,
|
107
|
-
|
106
|
+
@ch = ClientStub.setup_channel(channel_override, host, creds,
|
107
|
+
channel_args)
|
108
|
+
alt_host = channel_args[Core::Channel::SSL_TARGET]
|
108
109
|
@host = alt_host.nil? ? host : alt_host
|
109
110
|
@propagate_mask = propagate_mask
|
110
111
|
@timeout = timeout.nil? ? DEFAULT_TIMEOUT : timeout
|
@@ -135,42 +136,35 @@ module GRPC
|
|
135
136
|
# If return_op is true, the call returns an Operation, calling execute
|
136
137
|
# on the Operation returns the response.
|
137
138
|
#
|
138
|
-
# == Keyword Args ==
|
139
|
-
#
|
140
|
-
# Unspecified keyword arguments are treated as metadata to be sent to the
|
141
|
-
# server.
|
142
|
-
#
|
143
139
|
# @param method [String] the RPC method to call on the GRPC server
|
144
140
|
# @param req [Object] the request sent to the server
|
145
141
|
# @param marshal [Function] f(obj)->string that marshals requests
|
146
142
|
# @param unmarshal [Function] f(string)->obj that unmarshals responses
|
147
|
-
# @param timeout [Numeric] (optional) the max completion time in seconds
|
148
143
|
# @param deadline [Time] (optional) the time the request should complete
|
144
|
+
# @param return_op [true|false] return an Operation if true
|
149
145
|
# @param parent [Core::Call] a prior call whose reserved metadata
|
150
146
|
# will be propagated by this one.
|
151
147
|
# @param credentials [Core::CallCredentials] credentials to use when making
|
152
148
|
# the call
|
153
|
-
# @param
|
149
|
+
# @param metadata [Hash] metadata to be sent to the server
|
154
150
|
# @return [Object] the response received from the server
|
155
151
|
def request_response(method, req, marshal, unmarshal,
|
156
152
|
deadline: nil,
|
157
|
-
timeout: nil,
|
158
153
|
return_op: false,
|
159
154
|
parent: nil,
|
160
155
|
credentials: nil,
|
161
|
-
|
156
|
+
metadata: {})
|
162
157
|
c = new_active_call(method, marshal, unmarshal,
|
163
158
|
deadline: deadline,
|
164
|
-
timeout: timeout,
|
165
159
|
parent: parent,
|
166
160
|
credentials: credentials)
|
167
|
-
return c.request_response(req,
|
161
|
+
return c.request_response(req, metadata: metadata) unless return_op
|
168
162
|
|
169
163
|
# return the operation view of the active_call; define #execute as a
|
170
164
|
# new method for this instance that invokes #request_response.
|
171
165
|
op = c.operation
|
172
166
|
op.define_singleton_method(:execute) do
|
173
|
-
c.request_response(req,
|
167
|
+
c.request_response(req, metadata: metadata)
|
174
168
|
end
|
175
169
|
op
|
176
170
|
end
|
@@ -205,42 +199,35 @@ module GRPC
|
|
205
199
|
#
|
206
200
|
# If return_op is true, the call returns the response.
|
207
201
|
#
|
208
|
-
# == Keyword Args ==
|
209
|
-
#
|
210
|
-
# Unspecified keyword arguments are treated as metadata to be sent to the
|
211
|
-
# server.
|
212
|
-
#
|
213
202
|
# @param method [String] the RPC method to call on the GRPC server
|
214
203
|
# @param requests [Object] an Enumerable of requests to send
|
215
204
|
# @param marshal [Function] f(obj)->string that marshals requests
|
216
205
|
# @param unmarshal [Function] f(string)->obj that unmarshals responses
|
217
|
-
# @param timeout [Numeric] (optional) the max completion time in seconds
|
218
206
|
# @param deadline [Time] (optional) the time the request should complete
|
219
207
|
# @param return_op [true|false] return an Operation if true
|
220
208
|
# @param parent [Core::Call] a prior call whose reserved metadata
|
221
209
|
# will be propagated by this one.
|
222
210
|
# @param credentials [Core::CallCredentials] credentials to use when making
|
223
211
|
# the call
|
212
|
+
# @param metadata [Hash] metadata to be sent to the server
|
224
213
|
# @return [Object|Operation] the response received from the server
|
225
214
|
def client_streamer(method, requests, marshal, unmarshal,
|
226
215
|
deadline: nil,
|
227
|
-
timeout: nil,
|
228
216
|
return_op: false,
|
229
217
|
parent: nil,
|
230
218
|
credentials: nil,
|
231
|
-
|
219
|
+
metadata: {})
|
232
220
|
c = new_active_call(method, marshal, unmarshal,
|
233
221
|
deadline: deadline,
|
234
|
-
timeout: timeout,
|
235
222
|
parent: parent,
|
236
223
|
credentials: credentials)
|
237
|
-
return c.client_streamer(requests,
|
224
|
+
return c.client_streamer(requests, metadata: metadata) unless return_op
|
238
225
|
|
239
226
|
# return the operation view of the active_call; define #execute as a
|
240
227
|
# new method for this instance that invokes #client_streamer.
|
241
228
|
op = c.operation
|
242
229
|
op.define_singleton_method(:execute) do
|
243
|
-
c.client_streamer(requests,
|
230
|
+
c.client_streamer(requests, metadata: metadata)
|
244
231
|
end
|
245
232
|
op
|
246
233
|
end
|
@@ -292,35 +279,33 @@ module GRPC
|
|
292
279
|
# @param req [Object] the request sent to the server
|
293
280
|
# @param marshal [Function] f(obj)->string that marshals requests
|
294
281
|
# @param unmarshal [Function] f(string)->obj that unmarshals responses
|
295
|
-
# @param timeout [Numeric] (optional) the max completion time in seconds
|
296
282
|
# @param deadline [Time] (optional) the time the request should complete
|
297
283
|
# @param return_op [true|false]return an Operation if true
|
298
284
|
# @param parent [Core::Call] a prior call whose reserved metadata
|
299
285
|
# will be propagated by this one.
|
300
286
|
# @param credentials [Core::CallCredentials] credentials to use when making
|
301
287
|
# the call
|
288
|
+
# @param metadata [Hash] metadata to be sent to the server
|
302
289
|
# @param blk [Block] when provided, is executed for each response
|
303
290
|
# @return [Enumerator|Operation|nil] as discussed above
|
304
291
|
def server_streamer(method, req, marshal, unmarshal,
|
305
292
|
deadline: nil,
|
306
|
-
timeout: nil,
|
307
293
|
return_op: false,
|
308
294
|
parent: nil,
|
309
295
|
credentials: nil,
|
310
|
-
|
296
|
+
metadata: {},
|
311
297
|
&blk)
|
312
298
|
c = new_active_call(method, marshal, unmarshal,
|
313
299
|
deadline: deadline,
|
314
|
-
timeout: timeout,
|
315
300
|
parent: parent,
|
316
301
|
credentials: credentials)
|
317
|
-
return c.server_streamer(req,
|
302
|
+
return c.server_streamer(req, metadata: metadata, &blk) unless return_op
|
318
303
|
|
319
304
|
# return the operation view of the active_call; define #execute
|
320
305
|
# as a new method for this instance that invokes #server_streamer
|
321
306
|
op = c.operation
|
322
307
|
op.define_singleton_method(:execute) do
|
323
|
-
c.server_streamer(req,
|
308
|
+
c.server_streamer(req, metadata: metadata, &blk)
|
324
309
|
end
|
325
310
|
op
|
326
311
|
end
|
@@ -391,11 +376,6 @@ module GRPC
|
|
391
376
|
# * the deadline is exceeded
|
392
377
|
#
|
393
378
|
#
|
394
|
-
# == Keyword Args ==
|
395
|
-
#
|
396
|
-
# Unspecified keyword arguments are treated as metadata to be sent to the
|
397
|
-
# server.
|
398
|
-
#
|
399
379
|
# == Return Value ==
|
400
380
|
#
|
401
381
|
# if the return_op is false, the return value is an Enumerator of the
|
@@ -411,36 +391,35 @@ module GRPC
|
|
411
391
|
# @param requests [Object] an Enumerable of requests to send
|
412
392
|
# @param marshal [Function] f(obj)->string that marshals requests
|
413
393
|
# @param unmarshal [Function] f(string)->obj that unmarshals responses
|
414
|
-
# @param timeout [Numeric] (optional) the max completion time in seconds
|
415
394
|
# @param deadline [Time] (optional) the time the request should complete
|
416
395
|
# @param parent [Core::Call] a prior call whose reserved metadata
|
417
396
|
# will be propagated by this one.
|
418
397
|
# @param credentials [Core::CallCredentials] credentials to use when making
|
419
398
|
# the call
|
420
399
|
# @param return_op [true|false] return an Operation if true
|
400
|
+
# @param metadata [Hash] metadata to be sent to the server
|
421
401
|
# @param blk [Block] when provided, is executed for each response
|
422
402
|
# @return [Enumerator|nil|Operation] as discussed above
|
423
403
|
def bidi_streamer(method, requests, marshal, unmarshal,
|
424
404
|
deadline: nil,
|
425
|
-
timeout: nil,
|
426
405
|
return_op: false,
|
427
406
|
parent: nil,
|
428
407
|
credentials: nil,
|
429
|
-
|
408
|
+
metadata: {},
|
430
409
|
&blk)
|
431
410
|
c = new_active_call(method, marshal, unmarshal,
|
432
411
|
deadline: deadline,
|
433
|
-
timeout: timeout,
|
434
412
|
parent: parent,
|
435
413
|
credentials: credentials)
|
436
414
|
|
437
|
-
return c.bidi_streamer(requests,
|
415
|
+
return c.bidi_streamer(requests, metadata: metadata,
|
416
|
+
&blk) unless return_op
|
438
417
|
|
439
418
|
# return the operation view of the active_call; define #execute
|
440
419
|
# as a new method for this instance that invokes #bidi_streamer
|
441
420
|
op = c.operation
|
442
421
|
op.define_singleton_method(:execute) do
|
443
|
-
c.bidi_streamer(requests,
|
422
|
+
c.bidi_streamer(requests, metadata: metadata, &blk)
|
444
423
|
end
|
445
424
|
op
|
446
425
|
end
|
@@ -457,12 +436,10 @@ module GRPC
|
|
457
436
|
# @param timeout [TimeConst]
|
458
437
|
def new_active_call(method, marshal, unmarshal,
|
459
438
|
deadline: nil,
|
460
|
-
timeout: nil,
|
461
439
|
parent: nil,
|
462
440
|
credentials: nil)
|
463
|
-
|
464
|
-
|
465
|
-
end
|
441
|
+
|
442
|
+
deadline = from_relative_time(@timeout) if deadline.nil?
|
466
443
|
# Provide each new client call with its own completion queue
|
467
444
|
call_queue = Core::CompletionQueue.new
|
468
445
|
call = @ch.create_call(call_queue,
|