Merge pull request #2629 from ctiller/always-with-the-mono

Make the server report monotonic times for deadlines
pull/2646/head
Yang Gao 10 years ago
commit b5bbf66779
  1. 3
      src/core/surface/call.c
  2. 6
      src/core/surface/server.c
  3. 2
      src/core/transport/chttp2/parsing.c
  4. 3
      src/cpp/util/time.cc
  5. 1
      src/node/ext/timeval.cc
  6. 1
      src/python/src/grpc/_adapter/_c/utility.c
  7. 6
      src/ruby/ext/grpc/rb_grpc.c
  8. 13
      src/ruby/ext/grpc/rb_server.c

@ -1373,7 +1373,8 @@ static void recv_metadata(grpc_call *call, grpc_metadata_batch *md) {
l->md = 0; l->md = 0;
} }
} }
if (gpr_time_cmp(md->deadline, gpr_inf_future(GPR_CLOCK_REALTIME)) != 0) { if (gpr_time_cmp(md->deadline, gpr_inf_future(md->deadline.clock_type)) !=
0) {
set_deadline_alarm(call, md->deadline); set_deadline_alarm(call, md->deadline);
} }
if (!is_trailing) { if (!is_trailing) {

@ -530,6 +530,7 @@ static grpc_mdelem *server_filter(void *user_data, grpc_mdelem *md) {
static void server_on_recv(void *ptr, int success) { static void server_on_recv(void *ptr, int success) {
grpc_call_element *elem = ptr; grpc_call_element *elem = ptr;
call_data *calld = elem->call_data; call_data *calld = elem->call_data;
gpr_timespec op_deadline;
if (success && !calld->got_initial_metadata) { if (success && !calld->got_initial_metadata) {
size_t i; size_t i;
@ -539,8 +540,9 @@ static void server_on_recv(void *ptr, int success) {
grpc_stream_op *op = &ops[i]; grpc_stream_op *op = &ops[i];
if (op->type != GRPC_OP_METADATA) continue; if (op->type != GRPC_OP_METADATA) continue;
grpc_metadata_batch_filter(&op->data.metadata, server_filter, elem); grpc_metadata_batch_filter(&op->data.metadata, server_filter, elem);
if (0 != gpr_time_cmp(op->data.metadata.deadline, op_deadline = op->data.metadata.deadline;
gpr_inf_future(GPR_CLOCK_REALTIME))) { if (0 !=
gpr_time_cmp(op_deadline, gpr_inf_future(op_deadline.clock_type))) {
calld->deadline = op->data.metadata.deadline; calld->deadline = op->data.metadata.deadline;
} }
calld->got_initial_metadata = 1; calld->got_initial_metadata = 1;

@ -607,7 +607,7 @@ static void on_header(void *tp, grpc_mdelem *md) {
} }
grpc_chttp2_incoming_metadata_buffer_set_deadline( grpc_chttp2_incoming_metadata_buffer_set_deadline(
&stream_parsing->incoming_metadata, &stream_parsing->incoming_metadata,
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), *cached_timeout)); gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), *cached_timeout));
GRPC_MDELEM_UNREF(md); GRPC_MDELEM_UNREF(md);
} else { } else {
grpc_chttp2_incoming_metadata_buffer_add(&stream_parsing->incoming_metadata, grpc_chttp2_incoming_metadata_buffer_add(&stream_parsing->incoming_metadata,

@ -79,9 +79,10 @@ void TimepointHR2Timespec(const high_resolution_clock::time_point& from,
} }
system_clock::time_point Timespec2Timepoint(gpr_timespec t) { system_clock::time_point Timespec2Timepoint(gpr_timespec t) {
if (gpr_time_cmp(t, gpr_inf_future(GPR_CLOCK_REALTIME)) == 0) { if (gpr_time_cmp(t, gpr_inf_future(t.clock_type)) == 0) {
return system_clock::time_point::max(); return system_clock::time_point::max();
} }
t = gpr_convert_clock_type(t, GPR_CLOCK_REALTIME);
system_clock::time_point tp; system_clock::time_point tp;
tp += duration_cast<system_clock::time_point::duration>(seconds(t.tv_sec)); tp += duration_cast<system_clock::time_point::duration>(seconds(t.tv_sec));
tp += tp +=

@ -52,6 +52,7 @@ gpr_timespec MillisecondsToTimespec(double millis) {
} }
double TimespecToMilliseconds(gpr_timespec timespec) { double TimespecToMilliseconds(gpr_timespec timespec) {
timespec = gpr_convert_clock_type(timespec, GPR_CLOCK_REALTIME);
if (gpr_time_cmp(timespec, gpr_inf_future(GPR_CLOCK_REALTIME)) == 0) { if (gpr_time_cmp(timespec, gpr_inf_future(GPR_CLOCK_REALTIME)) == 0) {
return std::numeric_limits<double>::infinity(); return std::numeric_limits<double>::infinity();
} else if (gpr_time_cmp(timespec, gpr_inf_past(GPR_CLOCK_REALTIME)) == 0) { } else if (gpr_time_cmp(timespec, gpr_inf_past(GPR_CLOCK_REALTIME)) == 0) {

@ -374,6 +374,7 @@ PyObject *pygrpc_consume_ops(grpc_op *op, size_t nops) {
} }
double pygrpc_cast_gpr_timespec_to_double(gpr_timespec timespec) { double pygrpc_cast_gpr_timespec_to_double(gpr_timespec timespec) {
timespec = gpr_convert_clock_type(timespec, GPR_CLOCK_REALTIME);
return timespec.tv_sec + 1e-9*timespec.tv_nsec; return timespec.tv_sec + 1e-9*timespec.tv_nsec;
} }

@ -209,10 +209,12 @@ static ID id_to_s;
/* Converts a wrapped time constant to a standard time. */ /* Converts a wrapped time constant to a standard time. */
static VALUE grpc_rb_time_val_to_time(VALUE self) { static VALUE grpc_rb_time_val_to_time(VALUE self) {
gpr_timespec *time_const = NULL; gpr_timespec *time_const = NULL;
gpr_timespec real_time;
TypedData_Get_Struct(self, gpr_timespec, &grpc_rb_timespec_data_type, TypedData_Get_Struct(self, gpr_timespec, &grpc_rb_timespec_data_type,
time_const); time_const);
return rb_funcall(rb_cTime, id_at, 2, INT2NUM(time_const->tv_sec), real_time = gpr_convert_clock_type(*time_const, GPR_CLOCK_REALTIME);
INT2NUM(time_const->tv_nsec)); return rb_funcall(rb_cTime, id_at, 2, INT2NUM(real_time.tv_sec),
INT2NUM(real_time.tv_nsec));
} }
/* Invokes inspect on the ctime version of the time val. */ /* Invokes inspect on the ctime version of the time val. */

@ -213,6 +213,7 @@ static VALUE grpc_rb_server_request_call(VALUE self, VALUE cqueue,
grpc_call_error err; grpc_call_error err;
request_call_stack st; request_call_stack st;
VALUE result; VALUE result;
gpr_timespec deadline;
TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type, s); TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type, s);
if (s->wrapped == NULL) { if (s->wrapped == NULL) {
rb_raise(rb_eRuntimeError, "destroyed!"); rb_raise(rb_eRuntimeError, "destroyed!");
@ -245,15 +246,13 @@ static VALUE grpc_rb_server_request_call(VALUE self, VALUE cqueue,
} }
/* build the NewServerRpc struct result */ /* build the NewServerRpc struct result */
deadline = gpr_convert_clock_type(st.details.deadline, GPR_CLOCK_REALTIME);
result = rb_struct_new( result = rb_struct_new(
grpc_rb_sNewServerRpc, grpc_rb_sNewServerRpc, rb_str_new2(st.details.method),
rb_str_new2(st.details.method),
rb_str_new2(st.details.host), rb_str_new2(st.details.host),
rb_funcall(rb_cTime, id_at, 2, INT2NUM(st.details.deadline.tv_sec), rb_funcall(rb_cTime, id_at, 2, INT2NUM(deadline.tv_sec),
INT2NUM(st.details.deadline.tv_nsec)), INT2NUM(deadline.tv_nsec)),
grpc_rb_md_ary_to_h(&st.md_ary), grpc_rb_md_ary_to_h(&st.md_ary), grpc_rb_wrap_call(call), NULL);
grpc_rb_wrap_call(call),
NULL);
grpc_request_call_stack_cleanup(&st); grpc_request_call_stack_cleanup(&st);
return result; return result;
} }

Loading…
Cancel
Save