Merge github.com:grpc/grpc into direct-calls

reviewable/pr8008/r18
Craig Tiller 8 years ago
commit 9993c87168
  1. 2
      README.md
  2. 4
      src/compiler/README.md
  3. 6
      src/core/README.md
  4. 18
      src/core/ext/lb_policy/grpclb/grpclb.c
  5. 196
      src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c
  6. 4
      src/core/lib/iomgr/tcp_server.h
  7. 29
      src/core/lib/iomgr/tcp_server_posix.c
  8. 16
      src/core/lib/iomgr/tcp_server_windows.c
  9. 4
      src/cpp/README.md
  10. 20
      src/csharp/README.md
  11. 3
      src/node/README.md
  12. 4
      src/php/README.md
  13. 5
      src/ruby/README.md
  14. 6
      templates/tools/dockerfile/test/cxx_wheezy_x64/Dockerfile.template
  15. 3
      test/core/iomgr/tcp_server_posix_test.c
  16. 10
      test/core/iomgr/udp_server_test.c
  17. 7
      test/distrib/cpp/run_distrib_test.sh
  18. 6
      tools/dockerfile/grpc_check_generated_pb_files/check_pb_files.sh
  19. 6
      tools/dockerfile/interoptest/grpc_interop_csharp/build_interop.sh
  20. 6
      tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/build_interop.sh
  21. 6
      tools/dockerfile/interoptest/grpc_interop_cxx/build_interop.sh
  22. 6
      tools/dockerfile/interoptest/grpc_interop_http2/build_interop.sh
  23. 6
      tools/dockerfile/interoptest/grpc_interop_node/build_interop.sh
  24. 6
      tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh
  25. 6
      tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh
  26. 6
      tools/dockerfile/interoptest/grpc_interop_python/build_interop.sh
  27. 6
      tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh
  28. 6
      tools/dockerfile/stress_test/grpc_interop_stress_csharp/build_interop_stress.sh
  29. 6
      tools/dockerfile/stress_test/grpc_interop_stress_cxx/build_interop_stress.sh
  30. 6
      tools/dockerfile/stress_test/grpc_interop_stress_go/build_interop_stress.sh
  31. 6
      tools/dockerfile/stress_test/grpc_interop_stress_java/build_interop_stress.sh
  32. 6
      tools/dockerfile/stress_test/grpc_interop_stress_node/build_interop_stress.sh
  33. 6
      tools/dockerfile/stress_test/grpc_interop_stress_php/build_interop_stress.sh
  34. 7
      tools/dockerfile/stress_test/grpc_interop_stress_python/build_interop_stress.sh
  35. 6
      tools/dockerfile/stress_test/grpc_interop_stress_ruby/build_interop_stress.sh
  36. 5
      tools/dockerfile/test/cxx_wheezy_x64/Dockerfile
  37. 6
      tools/run_tests/dockerize/docker_run.sh
  38. 6
      tools/run_tests/dockerize/docker_run_tests.sh

@ -21,7 +21,7 @@ See [tools/run_tests](tools/run_tests) for more guidance on how to run various t
This repository contains source code for gRPC libraries for multiple languages written on top of shared C core library [src/core] (src/core). This repository contains source code for gRPC libraries for multiple languages written on top of shared C core library [src/core] (src/core).
Libraries in different languages are in different states of development. We are seeking contributions for all of these libraries. Libraries in different languages may be in different states of development. We are seeking contributions for all of these libraries.
| Language | Source | Status | | Language | Source | Status |
|-------------------------|-------------------------------------|---------| |-------------------------|-------------------------------------|---------|

@ -0,0 +1,4 @@
#Overview
This directory contains source code for gRPC protocol buffer compiler (*protoc*) plugins. Along with `protoc`,
these plugins are used to generate gRPC client and server stubs from `.proto` files.

@ -1,8 +1,4 @@
#Overview #Overview
This directory contains source code for shared C library. Libraries in other languages in this repository (C++, Ruby, This directory contains source code for C library (a.k.a the *gRPC C core*) that provides all gRPC's core functionality through a low level API. Libraries in other languages in this repository (C++, Ruby,
Python, PHP, NodeJS, Objective-C) are layered on top of this library. Python, PHP, NodeJS, Objective-C) are layered on top of this library.
#Status
Beta

@ -329,8 +329,8 @@ static bool is_server_valid(const grpc_grpclb_server *server, size_t idx,
if (server->port >> 16 != 0) { if (server->port >> 16 != 0) {
if (log) { if (log) {
gpr_log(GPR_ERROR, gpr_log(GPR_ERROR,
"Invalid port '%d' at index %zu of serverlist. Ignoring.", "Invalid port '%d' at index %lu of serverlist. Ignoring.",
server->port, idx); server->port, (unsigned long)idx);
} }
return false; return false;
} }
@ -338,9 +338,9 @@ static bool is_server_valid(const grpc_grpclb_server *server, size_t idx,
if (ip->size != 4 && ip->size != 16) { if (ip->size != 4 && ip->size != 16) {
if (log) { if (log) {
gpr_log(GPR_ERROR, gpr_log(GPR_ERROR,
"Expected IP to be 4 or 16 bytes, got %d at index %zu of " "Expected IP to be 4 or 16 bytes, got %d at index %lu of "
"serverlist. Ignoring", "serverlist. Ignoring",
ip->size, idx); ip->size, (unsigned long)idx);
} }
return false; return false;
} }
@ -1070,8 +1070,8 @@ static void res_recv_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
if (serverlist != NULL) { if (serverlist != NULL) {
gpr_slice_unref(response_slice); gpr_slice_unref(response_slice);
if (grpc_lb_glb_trace) { if (grpc_lb_glb_trace) {
gpr_log(GPR_INFO, "Serverlist with %zu servers received", gpr_log(GPR_INFO, "Serverlist with %lu servers received",
serverlist->num_servers); (unsigned long)serverlist->num_servers);
} }
/* update serverlist */ /* update serverlist */
@ -1155,10 +1155,10 @@ static void srv_status_rcvd_cb(grpc_exec_ctx *exec_ctx, void *arg,
if (grpc_lb_glb_trace) { if (grpc_lb_glb_trace) {
gpr_log(GPR_INFO, gpr_log(GPR_INFO,
"status from lb server received. Status = %d, Details = '%s', " "status from lb server received. Status = %d, Details = '%s', "
"Capaticy " "Capacity "
"= %zu", "= %lu",
lb_client->status, lb_client->status_details, lb_client->status, lb_client->status_details,
lb_client->status_details_capacity); (unsigned long)lb_client->status_details_capacity);
} }
/* TODO(dgq): deal with stream termination properly (fire up another one? /* TODO(dgq): deal with stream termination properly (fire up another one?
* fail the original call?) */ * fail the original call?) */

@ -61,13 +61,12 @@ typedef struct server_secure_state {
grpc_server_credentials *creds; grpc_server_credentials *creds;
bool is_shutdown; bool is_shutdown;
gpr_mu mu; gpr_mu mu;
gpr_refcount refcount; grpc_closure tcp_server_shutdown_complete;
grpc_closure destroy_closure; grpc_closure *server_destroy_listener_done;
grpc_closure *destroy_callback;
} server_secure_state; } server_secure_state;
typedef struct server_secure_connect { typedef struct server_secure_connect {
server_secure_state *state; server_secure_state *server_state;
grpc_pollset *accepting_pollset; grpc_pollset *accepting_pollset;
grpc_tcp_server_acceptor *acceptor; grpc_tcp_server_acceptor *acceptor;
grpc_handshake_manager *handshake_mgr; grpc_handshake_manager *handshake_mgr;
@ -77,39 +76,28 @@ typedef struct server_secure_connect {
grpc_channel_args *args; grpc_channel_args *args;
} server_secure_connect; } server_secure_connect;
static void state_ref(server_secure_state *state) { gpr_ref(&state->refcount); }
static void state_unref(server_secure_state *state) {
if (gpr_unref(&state->refcount)) {
/* ensure all threads have unlocked */
gpr_mu_lock(&state->mu);
gpr_mu_unlock(&state->mu);
/* clean up */
GRPC_SECURITY_CONNECTOR_UNREF(&state->sc->base, "server");
grpc_server_credentials_unref(state->creds);
gpr_free(state);
}
}
static void on_secure_handshake_done(grpc_exec_ctx *exec_ctx, void *statep, static void on_secure_handshake_done(grpc_exec_ctx *exec_ctx, void *statep,
grpc_security_status status, grpc_security_status status,
grpc_endpoint *secure_endpoint, grpc_endpoint *secure_endpoint,
grpc_auth_context *auth_context) { grpc_auth_context *auth_context) {
server_secure_connect *state = statep; server_secure_connect *connection_state = statep;
if (status == GRPC_SECURITY_OK) { if (status == GRPC_SECURITY_OK) {
if (secure_endpoint) { if (secure_endpoint) {
gpr_mu_lock(&state->state->mu); gpr_mu_lock(&connection_state->server_state->mu);
if (!state->state->is_shutdown) { if (!connection_state->server_state->is_shutdown) {
grpc_transport *transport = grpc_create_chttp2_transport( grpc_transport *transport = grpc_create_chttp2_transport(
exec_ctx, grpc_server_get_channel_args(state->state->server), exec_ctx, grpc_server_get_channel_args(
connection_state->server_state->server),
secure_endpoint, 0); secure_endpoint, 0);
grpc_arg args_to_add[2]; grpc_arg args_to_add[2];
args_to_add[0] = grpc_server_credentials_to_arg(state->state->creds); args_to_add[0] = grpc_server_credentials_to_arg(
connection_state->server_state->creds);
args_to_add[1] = grpc_auth_context_to_arg(auth_context); args_to_add[1] = grpc_auth_context_to_arg(auth_context);
grpc_channel_args *args_copy = grpc_channel_args_copy_and_add( grpc_channel_args *args_copy = grpc_channel_args_copy_and_add(
state->args, args_to_add, GPR_ARRAY_SIZE(args_to_add)); connection_state->args, args_to_add, GPR_ARRAY_SIZE(args_to_add));
grpc_server_setup_transport(exec_ctx, state->state->server, transport, grpc_server_setup_transport(
state->accepting_pollset, args_copy); exec_ctx, connection_state->server_state->server, transport,
connection_state->accepting_pollset, args_copy);
grpc_channel_args_destroy(args_copy); grpc_channel_args_destroy(args_copy);
grpc_chttp2_transport_start_reading(exec_ctx, transport, NULL); grpc_chttp2_transport_start_reading(exec_ctx, transport, NULL);
} else { } else {
@ -117,21 +105,21 @@ static void on_secure_handshake_done(grpc_exec_ctx *exec_ctx, void *statep,
* gone away. */ * gone away. */
grpc_endpoint_destroy(exec_ctx, secure_endpoint); grpc_endpoint_destroy(exec_ctx, secure_endpoint);
} }
gpr_mu_unlock(&state->state->mu); gpr_mu_unlock(&connection_state->server_state->mu);
} }
} else { } else {
gpr_log(GPR_ERROR, "Secure transport failed with error %d", status); gpr_log(GPR_ERROR, "Secure transport failed with error %d", status);
} }
grpc_channel_args_destroy(state->args); grpc_channel_args_destroy(connection_state->args);
state_unref(state->state); grpc_tcp_server_unref(exec_ctx, connection_state->server_state->tcp);
gpr_free(state); gpr_free(connection_state);
} }
static void on_handshake_done(grpc_exec_ctx *exec_ctx, grpc_endpoint *endpoint, static void on_handshake_done(grpc_exec_ctx *exec_ctx, grpc_endpoint *endpoint,
grpc_channel_args *args, grpc_channel_args *args,
gpr_slice_buffer *read_buffer, void *user_data, gpr_slice_buffer *read_buffer, void *user_data,
grpc_error *error) { grpc_error *error) {
server_secure_connect *state = user_data; server_secure_connect *connection_state = user_data;
if (error != GRPC_ERROR_NONE) { if (error != GRPC_ERROR_NONE) {
const char *error_str = grpc_error_string(error); const char *error_str = grpc_error_string(error);
gpr_log(GPR_ERROR, "Handshaking failed: %s", error_str); gpr_log(GPR_ERROR, "Handshaking failed: %s", error_str);
@ -139,81 +127,107 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, grpc_endpoint *endpoint,
GRPC_ERROR_UNREF(error); GRPC_ERROR_UNREF(error);
grpc_channel_args_destroy(args); grpc_channel_args_destroy(args);
gpr_free(read_buffer); gpr_free(read_buffer);
grpc_handshake_manager_shutdown(exec_ctx, state->handshake_mgr); grpc_handshake_manager_shutdown(exec_ctx, connection_state->handshake_mgr);
grpc_handshake_manager_destroy(exec_ctx, state->handshake_mgr); grpc_handshake_manager_destroy(exec_ctx, connection_state->handshake_mgr);
state_unref(state->state); grpc_tcp_server_unref(exec_ctx, connection_state->server_state->tcp);
gpr_free(state); gpr_free(connection_state);
return; return;
} }
grpc_handshake_manager_destroy(exec_ctx, state->handshake_mgr); grpc_handshake_manager_destroy(exec_ctx, connection_state->handshake_mgr);
state->handshake_mgr = NULL; connection_state->handshake_mgr = NULL;
// TODO(roth, jboeuf): Convert security connector handshaking to use new // TODO(roth, jboeuf): Convert security connector handshaking to use new
// handshake API, and then move the code from on_secure_handshake_done() // handshake API, and then move the code from on_secure_handshake_done()
// into this function. // into this function.
state->args = args; connection_state->args = args;
grpc_server_security_connector_do_handshake( grpc_server_security_connector_do_handshake(
exec_ctx, state->state->sc, state->acceptor, endpoint, read_buffer, exec_ctx, connection_state->server_state->sc, connection_state->acceptor,
state->deadline, on_secure_handshake_done, state); endpoint, read_buffer, connection_state->deadline,
on_secure_handshake_done, connection_state);
} }
static void on_accept(grpc_exec_ctx *exec_ctx, void *statep, grpc_endpoint *tcp, static void on_accept(grpc_exec_ctx *exec_ctx, void *statep, grpc_endpoint *tcp,
grpc_pollset *accepting_pollset, grpc_pollset *accepting_pollset,
grpc_tcp_server_acceptor *acceptor) { grpc_tcp_server_acceptor *acceptor) {
server_secure_connect *state = gpr_malloc(sizeof(*state)); server_secure_state *server_state = statep;
state->state = statep; server_secure_connect *connection_state = NULL;
state_ref(state->state); gpr_mu_lock(&server_state->mu);
state->accepting_pollset = accepting_pollset; if (server_state->is_shutdown) {
state->acceptor = acceptor; gpr_mu_unlock(&server_state->mu);
state->handshake_mgr = grpc_handshake_manager_create(); grpc_endpoint_destroy(exec_ctx, tcp);
return;
}
gpr_mu_unlock(&server_state->mu);
grpc_tcp_server_ref(server_state->tcp);
connection_state = gpr_malloc(sizeof(*connection_state));
connection_state->server_state = server_state;
connection_state->accepting_pollset = accepting_pollset;
connection_state->acceptor = acceptor;
connection_state->handshake_mgr = grpc_handshake_manager_create();
// TODO(roth): We should really get this timeout value from channel // TODO(roth): We should really get this timeout value from channel
// args instead of hard-coding it. // args instead of hard-coding it.
state->deadline = gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), connection_state->deadline = gpr_time_add(
gpr_time_from_seconds(120, GPR_TIMESPAN)); gpr_now(GPR_CLOCK_MONOTONIC), gpr_time_from_seconds(120, GPR_TIMESPAN));
grpc_handshake_manager_do_handshake( grpc_handshake_manager_do_handshake(
exec_ctx, state->handshake_mgr, tcp, exec_ctx, connection_state->handshake_mgr, tcp,
grpc_server_get_channel_args(state->state->server), state->deadline, grpc_server_get_channel_args(connection_state->server_state->server),
acceptor, on_handshake_done, state); connection_state->deadline, acceptor, on_handshake_done,
connection_state);
} }
/* Server callback: start listening on our ports */ /* Server callback: start listening on our ports */
static void start(grpc_exec_ctx *exec_ctx, grpc_server *server, void *statep, static void server_start_listener(grpc_exec_ctx *exec_ctx, grpc_server *server,
grpc_pollset **pollsets, size_t pollset_count) { void *statep, grpc_pollset **pollsets,
server_secure_state *state = statep; size_t pollset_count) {
grpc_tcp_server_start(exec_ctx, state->tcp, pollsets, pollset_count, server_secure_state *server_state = statep;
on_accept, state); gpr_mu_lock(&server_state->mu);
server_state->is_shutdown = false;
gpr_mu_unlock(&server_state->mu);
grpc_tcp_server_start(exec_ctx, server_state->tcp, pollsets, pollset_count,
on_accept, server_state);
} }
static void destroy_done(grpc_exec_ctx *exec_ctx, void *statep, static void tcp_server_shutdown_complete(grpc_exec_ctx *exec_ctx, void *statep,
grpc_error *error) { grpc_error *error) {
server_secure_state *state = statep; server_secure_state *server_state = statep;
if (state->destroy_callback != NULL) { /* ensure all threads have unlocked */
state->destroy_callback->cb(exec_ctx, state->destroy_callback->cb_arg, gpr_mu_lock(&server_state->mu);
GRPC_ERROR_REF(error)); grpc_closure *destroy_done = server_state->server_destroy_listener_done;
GPR_ASSERT(server_state->is_shutdown);
gpr_mu_unlock(&server_state->mu);
/* clean up */
grpc_server_security_connector_shutdown(exec_ctx, server_state->sc);
/* Flush queued work before a synchronous unref. */
grpc_exec_ctx_flush(exec_ctx);
GRPC_SECURITY_CONNECTOR_UNREF(&server_state->sc->base, "server");
grpc_server_credentials_unref(server_state->creds);
if (destroy_done != NULL) {
destroy_done->cb(exec_ctx, destroy_done->cb_arg, GRPC_ERROR_REF(error));
grpc_exec_ctx_flush(exec_ctx);
} }
grpc_server_security_connector_shutdown(exec_ctx, state->sc); gpr_free(server_state);
state_unref(state);
} }
/* Server callback: destroy the tcp listener (so we don't generate further static void server_destroy_listener(grpc_exec_ctx *exec_ctx,
callbacks) */ grpc_server *server, void *statep,
static void destroy(grpc_exec_ctx *exec_ctx, grpc_server *server, void *statep, grpc_closure *callback) {
grpc_closure *callback) { server_secure_state *server_state = statep;
server_secure_state *state = statep;
grpc_tcp_server *tcp; grpc_tcp_server *tcp;
gpr_mu_lock(&state->mu); gpr_mu_lock(&server_state->mu);
state->is_shutdown = true; server_state->is_shutdown = true;
state->destroy_callback = callback; server_state->server_destroy_listener_done = callback;
tcp = state->tcp; tcp = server_state->tcp;
gpr_mu_unlock(&state->mu); gpr_mu_unlock(&server_state->mu);
grpc_tcp_server_shutdown_listeners(exec_ctx, tcp); grpc_tcp_server_shutdown_listeners(exec_ctx, tcp);
grpc_tcp_server_unref(exec_ctx, tcp); grpc_tcp_server_unref(exec_ctx, server_state->tcp);
} }
int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr, int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr,
grpc_server_credentials *creds) { grpc_server_credentials *creds) {
grpc_resolved_addresses *resolved = NULL; grpc_resolved_addresses *resolved = NULL;
grpc_tcp_server *tcp = NULL; grpc_tcp_server *tcp = NULL;
server_secure_state *state = NULL; server_secure_state *server_state = NULL;
size_t i; size_t i;
size_t count = 0; size_t count = 0;
int port_num = -1; int port_num = -1;
@ -253,22 +267,22 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr,
if (err != GRPC_ERROR_NONE) { if (err != GRPC_ERROR_NONE) {
goto error; goto error;
} }
state = gpr_malloc(sizeof(*state)); server_state = gpr_malloc(sizeof(*server_state));
memset(state, 0, sizeof(*state)); memset(server_state, 0, sizeof(*server_state));
grpc_closure_init(&state->destroy_closure, destroy_done, state); grpc_closure_init(&server_state->tcp_server_shutdown_complete,
err = grpc_tcp_server_create(&state->destroy_closure, tcp_server_shutdown_complete, server_state);
err = grpc_tcp_server_create(&server_state->tcp_server_shutdown_complete,
grpc_server_get_channel_args(server), &tcp); grpc_server_get_channel_args(server), &tcp);
if (err != GRPC_ERROR_NONE) { if (err != GRPC_ERROR_NONE) {
goto error; goto error;
} }
state->server = server; server_state->server = server;
state->tcp = tcp; server_state->tcp = tcp;
state->sc = sc; server_state->sc = sc;
state->creds = grpc_server_credentials_ref(creds); server_state->creds = grpc_server_credentials_ref(creds);
state->is_shutdown = false; server_state->is_shutdown = true;
gpr_mu_init(&state->mu); gpr_mu_init(&server_state->mu);
gpr_ref_init(&state->refcount, 1);
errors = gpr_malloc(sizeof(*errors) * resolved->naddrs); errors = gpr_malloc(sizeof(*errors) * resolved->naddrs);
for (i = 0; i < resolved->naddrs; i++) { for (i = 0; i < resolved->naddrs; i++) {
@ -313,7 +327,8 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr,
grpc_resolved_addresses_destroy(resolved); grpc_resolved_addresses_destroy(resolved);
/* Register with the server only upon success */ /* Register with the server only upon success */
grpc_server_add_listener(&exec_ctx, server, state, start, destroy); grpc_server_add_listener(&exec_ctx, server, server_state,
server_start_listener, server_destroy_listener);
grpc_exec_ctx_finish(&exec_ctx); grpc_exec_ctx_finish(&exec_ctx);
return port_num; return port_num;
@ -334,10 +349,11 @@ error:
grpc_tcp_server_unref(&exec_ctx, tcp); grpc_tcp_server_unref(&exec_ctx, tcp);
} else { } else {
if (sc) { if (sc) {
grpc_exec_ctx_flush(&exec_ctx);
GRPC_SECURITY_CONNECTOR_UNREF(&sc->base, "server"); GRPC_SECURITY_CONNECTOR_UNREF(&sc->base, "server");
} }
if (state) { if (server_state) {
gpr_free(state); gpr_free(server_state);
} }
} }
grpc_exec_ctx_finish(&exec_ctx); grpc_exec_ctx_finish(&exec_ctx);

@ -101,8 +101,8 @@ grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s);
void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s, void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s,
grpc_closure *shutdown_starting); grpc_closure *shutdown_starting);
/* If the refcount drops to zero, delete s, and call (exec_ctx==NULL) or enqueue /* If the refcount drops to zero, enqueue calls on exec_ctx to
a call (exec_ctx!=NULL) to shutdown_complete. */ shutdown_listeners and delete s. */
void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s); void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s);
/* Shutdown the fds of listeners. */ /* Shutdown the fds of listeners. */

@ -191,6 +191,9 @@ grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete,
} }
static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
gpr_mu_lock(&s->mu);
GPR_ASSERT(s->shutdown);
gpr_mu_unlock(&s->mu);
if (s->shutdown_complete != NULL) { if (s->shutdown_complete != NULL) {
grpc_exec_ctx_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE, NULL); grpc_exec_ctx_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE, NULL);
} }
@ -652,6 +655,7 @@ unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server *s,
unsigned port_index) { unsigned port_index) {
unsigned num_fds = 0; unsigned num_fds = 0;
grpc_tcp_listener *sp; grpc_tcp_listener *sp;
gpr_mu_lock(&s->mu);
for (sp = s->head; sp && port_index != 0; sp = sp->next) { for (sp = s->head; sp && port_index != 0; sp = sp->next) {
if (!sp->is_sibling) { if (!sp->is_sibling) {
--port_index; --port_index;
@ -659,12 +663,15 @@ unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server *s,
} }
for (; sp; sp = sp->sibling, ++num_fds) for (; sp; sp = sp->sibling, ++num_fds)
; ;
gpr_mu_unlock(&s->mu);
return num_fds; return num_fds;
} }
int grpc_tcp_server_port_fd(grpc_tcp_server *s, unsigned port_index, int grpc_tcp_server_port_fd(grpc_tcp_server *s, unsigned port_index,
unsigned fd_index) { unsigned fd_index) {
grpc_tcp_listener *sp; grpc_tcp_listener *sp;
int fd;
gpr_mu_lock(&s->mu);
for (sp = s->head; sp && port_index != 0; sp = sp->next) { for (sp = s->head; sp && port_index != 0; sp = sp->next) {
if (!sp->is_sibling) { if (!sp->is_sibling) {
--port_index; --port_index;
@ -673,10 +680,12 @@ int grpc_tcp_server_port_fd(grpc_tcp_server *s, unsigned port_index,
for (; sp && fd_index != 0; sp = sp->sibling, --fd_index) for (; sp && fd_index != 0; sp = sp->sibling, --fd_index)
; ;
if (sp) { if (sp) {
return sp->fd; fd = sp->fd;
} else { } else {
return -1; fd = -1;
} }
gpr_mu_unlock(&s->mu);
return fd;
} }
void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s,
@ -722,7 +731,7 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s,
} }
grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) { grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) {
gpr_ref(&s->refs); gpr_ref_non_zero(&s->refs);
return s; return s;
} }
@ -736,19 +745,11 @@ void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s,
void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
if (gpr_unref(&s->refs)) { if (gpr_unref(&s->refs)) {
/* Complete shutdown_starting work before destroying. */ grpc_tcp_server_shutdown_listeners(exec_ctx, s);
grpc_exec_ctx local_exec_ctx = GRPC_EXEC_CTX_INIT;
gpr_mu_lock(&s->mu); gpr_mu_lock(&s->mu);
grpc_exec_ctx_enqueue_list(&local_exec_ctx, &s->shutdown_starting, NULL); grpc_exec_ctx_enqueue_list(exec_ctx, &s->shutdown_starting, NULL);
gpr_mu_unlock(&s->mu); gpr_mu_unlock(&s->mu);
if (exec_ctx == NULL) { tcp_server_destroy(exec_ctx, s);
grpc_exec_ctx_flush(&local_exec_ctx);
tcp_server_destroy(&local_exec_ctx, s);
grpc_exec_ctx_finish(&local_exec_ctx);
} else {
grpc_exec_ctx_finish(&local_exec_ctx);
tcp_server_destroy(exec_ctx, s);
}
} }
} }

@ -139,7 +139,7 @@ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
} }
grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) { grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) {
gpr_ref(&s->refs); gpr_ref_non_zero(&s->refs);
return s; return s;
} }
@ -174,19 +174,11 @@ static void tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
if (gpr_unref(&s->refs)) { if (gpr_unref(&s->refs)) {
/* Complete shutdown_starting work before destroying. */ grpc_tcp_server_shutdown_listeners(exec_ctx, s);
grpc_exec_ctx local_exec_ctx = GRPC_EXEC_CTX_INIT;
gpr_mu_lock(&s->mu); gpr_mu_lock(&s->mu);
grpc_exec_ctx_enqueue_list(&local_exec_ctx, &s->shutdown_starting, NULL); grpc_exec_ctx_enqueue_list(exec_ctx, &s->shutdown_starting, NULL);
gpr_mu_unlock(&s->mu); gpr_mu_unlock(&s->mu);
if (exec_ctx == NULL) { tcp_server_destroy(exec_ctx, s);
grpc_exec_ctx_flush(&local_exec_ctx);
tcp_server_destroy(&local_exec_ctx, s);
grpc_exec_ctx_finish(&local_exec_ctx);
} else {
grpc_exec_ctx_finish(&local_exec_ctx);
tcp_server_destroy(exec_ctx, s);
}
} }
} }

@ -3,10 +3,6 @@
This directory contains source code for C++ implementation of gRPC. This directory contains source code for C++ implementation of gRPC.
#Status
Beta
#Pre-requisites #Pre-requisites
##Linux ##Linux

@ -4,10 +4,13 @@ gRPC C#
A C# implementation of gRPC. A C# implementation of gRPC.
Status SUPPORTED PLATFORMS
------ ------------------
- .NET Framework 4.5+ (Windows)
- [.NET Core](https://dotnet.github.io/) on Linux, Windows and Mac OS X (starting from version 1.0.1)
- Mono 4+ on Linux, Windows and Mac OS X
Beta
PREREQUISITES PREREQUISITES
-------------- --------------
@ -16,6 +19,7 @@ PREREQUISITES
- Linux: Mono 4+, MonoDevelop 5.9+ (with NuGet add-in installed) - Linux: Mono 4+, MonoDevelop 5.9+ (with NuGet add-in installed)
- Mac OS X: Xamarin Studio 5.9+ - Mac OS X: Xamarin Studio 5.9+
HOW TO USE HOW TO USE
-------------- --------------
@ -69,12 +73,6 @@ different languages.
tools/run_tests/run_tests.py -l csharp tools/run_tests/run_tests.py -l csharp
``` ```
ON .NET CORE SUPPORT
------------------
We are committed to providing full support for [.NET Core](https://dotnet.github.io/) in near future,
but currently, the support is for .NET Core is experimental/work-in-progress.
DOCUMENTATION DOCUMENTATION
------------- -------------
- [API Reference][] - [API Reference][]
@ -102,9 +100,7 @@ CONTENTS
THE NATIVE DEPENDENCY THE NATIVE DEPENDENCY
--------------- ---------------
Internally, gRPC C# uses a native library written in C (gRPC C core) and invokes its functionality via P/Invoke. `grpc_csharp_ext` library is a native extension library that facilitates this by wrapping some C core API into a form that's more digestible for P/Invoke. Internally, gRPC C# uses a native library written in C (gRPC C core) and invokes its functionality via P/Invoke. The fact that a native library is used should be fully transparent to the users and just installing the `Grpc.Core` NuGet package is the only step needed to use gRPC C# on all supported platforms.
Prior to version 0.13, installing `grpc_csharp_ext` was required to make gRPC work on Linux and MacOS. Starting with version 0.13, we have improved the packaging story significantly and precompiled versions of the native library for all supported platforms are now shipped with the NuGet package. Just installing the `Grpc` NuGet package should be the only step needed to use gRPC C#, regardless of your platform (Windows, Linux or Mac) and the bitness (32 or 64bit).
[API Reference]: http://www.grpc.io/grpc/csharp/ [API Reference]: http://www.grpc.io/grpc/csharp/
[Helloworld Example]: ../../examples/csharp/helloworld [Helloworld Example]: ../../examples/csharp/helloworld

@ -1,9 +1,6 @@
[![npm](https://img.shields.io/npm/v/grpc.svg)](https://www.npmjs.com/package/grpc) [![npm](https://img.shields.io/npm/v/grpc.svg)](https://www.npmjs.com/package/grpc)
# Node.js gRPC Library # Node.js gRPC Library
## Status
Beta
## PREREQUISITES ## PREREQUISITES
- `node`: This requires `node` to be installed, version `0.12` or above. If you instead have the `nodejs` executable on Debian, you should install the [`nodejs-legacy`](https://packages.debian.org/sid/nodejs-legacy) package. - `node`: This requires `node` to be installed, version `0.12` or above. If you instead have the `nodejs` executable on Debian, you should install the [`nodejs-legacy`](https://packages.debian.org/sid/nodejs-legacy) package.

@ -4,10 +4,6 @@
This directory contains source code for PHP implementation of gRPC layered on This directory contains source code for PHP implementation of gRPC layered on
shared C library. shared C library.
#Status
GA
## Environment ## Environment
**Prerequisite:** **Prerequisite:**

@ -4,11 +4,6 @@ gRPC Ruby
A Ruby implementation of gRPC. A Ruby implementation of gRPC.
Status
------
Beta
PREREQUISITES PREREQUISITES
------------- -------------

@ -41,6 +41,12 @@
g++-4.4 ${'\\'} g++-4.4 ${'\\'}
g++-4.4-multilib g++-4.4-multilib
# set up backport to allow installation of Git version > 1.7
RUN echo "deb http://http.debian.net/debian wheezy-backports main" \
>/etc/apt/sources.list.d/wheezy-backports.list
RUN apt-get update -qq
RUN apt-get -t wheezy-backports install -qq git
RUN wget ${openssl_fallback.base_uri + openssl_fallback.tarball} RUN wget ${openssl_fallback.base_uri + openssl_fallback.tarball}
ENV POST_GIT_STEP tools/dockerfile/test/cxx_wheezy_x64/post-git-setup.sh ENV POST_GIT_STEP tools/dockerfile/test/cxx_wheezy_x64/post-git-setup.sh

@ -314,11 +314,10 @@ static void test_connect(unsigned n) {
GPR_ASSERT(grpc_tcp_server_port_fd(s, 0, 0) >= 0); GPR_ASSERT(grpc_tcp_server_port_fd(s, 0, 0) >= 0);
grpc_tcp_server_unref(&exec_ctx, s); grpc_tcp_server_unref(&exec_ctx, s);
grpc_exec_ctx_finish(&exec_ctx);
/* Weak ref lost. */ /* Weak ref lost. */
GPR_ASSERT(weak_ref.server == NULL); GPR_ASSERT(weak_ref.server == NULL);
grpc_exec_ctx_finish(&exec_ctx);
} }
static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p, static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,

@ -131,8 +131,9 @@ static void test_no_op_with_port_and_start(void) {
grpc_udp_server_destroy(&exec_ctx, s, NULL); grpc_udp_server_destroy(&exec_ctx, s, NULL);
grpc_exec_ctx_finish(&exec_ctx); grpc_exec_ctx_finish(&exec_ctx);
/* The server had a single FD, which should have been orphaned. */ /* The server had a single FD, which is orphaned once in *
GPR_ASSERT(g_number_of_orphan_calls == 1); * deactivated_all_ports, and once in grpc_udp_server_destroy. */
GPR_ASSERT(g_number_of_orphan_calls == 2);
} }
static void test_receive(int number_of_clients) { static void test_receive(int number_of_clients) {
@ -196,8 +197,9 @@ static void test_receive(int number_of_clients) {
grpc_udp_server_destroy(&exec_ctx, s, NULL); grpc_udp_server_destroy(&exec_ctx, s, NULL);
grpc_exec_ctx_finish(&exec_ctx); grpc_exec_ctx_finish(&exec_ctx);
/* The server had a single FD, which should have been orphaned. */ /* The server had a single FD, which is orphaned once in *
GPR_ASSERT(g_number_of_orphan_calls == 1); * deactivated_all_ports, and once in grpc_udp_server_destroy. */
GPR_ASSERT(g_number_of_orphan_calls == 2);
} }
static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p, static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,

@ -30,7 +30,12 @@
set -ex set -ex
git clone --recursive $EXTERNAL_GIT_ROOT git clone $EXTERNAL_GIT_ROOT
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd ${EXTERNAL_GIT_ROOT} && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference ${EXTERNAL_GIT_ROOT}/${name} \
${name}')
cd grpc cd grpc
cd third_party/protobuf && ./autogen.sh && \ cd third_party/protobuf && ./autogen.sh && \

@ -31,7 +31,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
cd /var/local/git/grpc cd /var/local/git/grpc

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -ex set -ex
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -ex set -ex
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# Copy service account keys if available # Copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -38,7 +38,11 @@ git clone --recursive /var/local/jenkins/grpc-go src/google.golang.org/grpc
# Clone the 'grpc' repo. We just need this for the wrapper scripts under # Clone the 'grpc' repo. We just need this for the wrapper scripts under
# grpc/tools/gcp/stress_tests # grpc/tools/gcp/stress_tests
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -36,7 +36,11 @@ mkdir -p /var/local/git
git clone --recursive --depth 1 /var/local/jenkins/grpc-java /var/local/git/grpc-java git clone --recursive --depth 1 /var/local/jenkins/grpc-java /var/local/git/grpc-java
# grpc repo (for metrics client and for the stress test wrapper scripts) # grpc repo (for metrics client and for the stress test wrapper scripts)
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# Copy service account keys if available # Copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,7 +32,11 @@
set -ex set -ex
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -32,13 +32,16 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# copy service account keys if available # copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true
cd /var/local/git/grpc cd /var/local/git/grpc
tools/run_tests/run_tests.py -l python -c opt --build_only tools/run_tests/run_tests.py -l python -c opt --build_only
# Build c++ interop client # Build c++ interop client

@ -32,7 +32,11 @@
set -e set -e
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
# Copy service account keys if available # Copy service account keys if available
cp -r /var/local/jenkins/service_account $HOME || true cp -r /var/local/jenkins/service_account $HOME || true

@ -89,6 +89,11 @@ RUN apt-get update && apt-get install -y \
g++-4.4 \ g++-4.4 \
g++-4.4-multilib g++-4.4-multilib
# set up backport to allow installation of Git version > 1.7
RUN echo "deb http://http.debian.net/debian wheezy-backports main" >/etc/apt/sources.list.d/wheezy-backports.list
RUN apt-get update -qq
RUN apt-get -t wheezy-backports install -qq git
RUN wget https://openssl.org/source/old/1.0.2/openssl-1.0.2f.tar.gz RUN wget https://openssl.org/source/old/1.0.2/openssl-1.0.2f.tar.gz
ENV POST_GIT_STEP tools/dockerfile/test/cxx_wheezy_x64/post-git-setup.sh ENV POST_GIT_STEP tools/dockerfile/test/cxx_wheezy_x64/post-git-setup.sh

@ -36,7 +36,11 @@ set -ex
if [ "$RELATIVE_COPY_PATH" == "" ] if [ "$RELATIVE_COPY_PATH" == "" ]
then then
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive "$EXTERNAL_GIT_ROOT" /var/local/git/grpc git clone $EXTERNAL_GIT_ROOT /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd ${EXTERNAL_GIT_ROOT} && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference ${EXTERNAL_GIT_ROOT}/${name} \
${name}')
else else
mkdir -p "/var/local/git/grpc/$RELATIVE_COPY_PATH" mkdir -p "/var/local/git/grpc/$RELATIVE_COPY_PATH"
cp -r "$EXTERNAL_GIT_ROOT/$RELATIVE_COPY_PATH"/* "/var/local/git/grpc/$RELATIVE_COPY_PATH" cp -r "$EXTERNAL_GIT_ROOT/$RELATIVE_COPY_PATH"/* "/var/local/git/grpc/$RELATIVE_COPY_PATH"

@ -42,7 +42,11 @@ export PATH=$PATH:/usr/bin/llvm-symbolizer
chown $(whoami) $XDG_CACHE_HOME chown $(whoami) $XDG_CACHE_HOME
mkdir -p /var/local/git mkdir -p /var/local/git
git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc git clone /var/local/jenkins/grpc /var/local/git/grpc
# clone gRPC submodules, use data from locally cloned submodules where possible
(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
${name}')
mkdir -p reports mkdir -p reports

Loading…
Cancel
Save