Merge branch 'master' into uv_core_transport

reviewable/pr8125/r7
murgatroid99 8 years ago
commit c0aa97d158
  1. 2
      README.md
  2. 41
      doc/interop-test-descriptions.md
  3. 4
      src/compiler/README.md
  4. 6
      src/core/README.md
  5. 18
      src/core/ext/lb_policy/grpclb/grpclb.c
  6. 192
      src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c
  7. 4
      src/core/lib/iomgr/tcp_server.h
  8. 27
      src/core/lib/iomgr/tcp_server_posix.c
  9. 14
      src/core/lib/iomgr/tcp_server_windows.c
  10. 11
      src/core/lib/security/credentials/composite/composite_credentials.c
  11. 4
      src/core/lib/security/credentials/composite/composite_credentials.h
  12. 12
      src/core/lib/security/credentials/credentials.c
  13. 10
      src/core/lib/security/credentials/credentials.h
  14. 2
      src/core/lib/security/credentials/fake/fake_credentials.c
  15. 2
      src/core/lib/security/credentials/ssl/ssl_credentials.c
  16. 4
      src/cpp/README.md
  17. 24
      src/csharp/Grpc.Tools.nuspec
  18. 20
      src/csharp/README.md
  19. 3
      src/node/README.md
  20. 4
      src/php/README.md
  21. 5
      src/proto/grpc/testing/test.proto
  22. 1
      src/python/grpcio/grpc/_server.py
  23. 5
      src/ruby/README.md
  24. 6
      templates/tools/dockerfile/test/cxx_wheezy_x64/Dockerfile.template
  25. 3
      test/core/iomgr/tcp_server_posix_test.c
  26. 10
      test/core/iomgr/udp_server_test.c
  27. 31
      test/core/security/credentials_test.c
  28. 4
      test/cpp/interop/client.cc
  29. 44
      test/cpp/interop/interop_client.cc
  30. 1
      test/cpp/interop/interop_client.h
  31. 12
      test/cpp/interop/interop_server.cc
  32. 7
      test/distrib/cpp/run_distrib_test.sh
  33. 6
      tools/dockerfile/grpc_check_generated_pb_files/check_pb_files.sh
  34. 6
      tools/dockerfile/interoptest/grpc_interop_csharp/build_interop.sh
  35. 6
      tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/build_interop.sh
  36. 6
      tools/dockerfile/interoptest/grpc_interop_cxx/build_interop.sh
  37. 6
      tools/dockerfile/interoptest/grpc_interop_http2/build_interop.sh
  38. 6
      tools/dockerfile/interoptest/grpc_interop_node/build_interop.sh
  39. 6
      tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh
  40. 6
      tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh
  41. 6
      tools/dockerfile/interoptest/grpc_interop_python/build_interop.sh
  42. 6
      tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh
  43. 6
      tools/dockerfile/stress_test/grpc_interop_stress_csharp/build_interop_stress.sh
  44. 6
      tools/dockerfile/stress_test/grpc_interop_stress_cxx/build_interop_stress.sh
  45. 6
      tools/dockerfile/stress_test/grpc_interop_stress_go/build_interop_stress.sh
  46. 6
      tools/dockerfile/stress_test/grpc_interop_stress_java/build_interop_stress.sh
  47. 6
      tools/dockerfile/stress_test/grpc_interop_stress_node/build_interop_stress.sh
  48. 6
      tools/dockerfile/stress_test/grpc_interop_stress_php/build_interop_stress.sh
  49. 7
      tools/dockerfile/stress_test/grpc_interop_stress_python/build_interop_stress.sh
  50. 6
      tools/dockerfile/stress_test/grpc_interop_stress_ruby/build_interop_stress.sh
  51. 5
      tools/dockerfile/test/cxx_wheezy_x64/Dockerfile
  52. 6
      tools/run_tests/dockerize/docker_run.sh
  53. 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 |
|-------------------------|-------------------------------------|---------| |-------------------------|-------------------------------------|---------|

@ -60,6 +60,35 @@ Client asserts:
*It may be possible to use UnaryCall instead of EmptyCall, but it is harder to *It may be possible to use UnaryCall instead of EmptyCall, but it is harder to
ensure that the proto serialized to zero bytes.* ensure that the proto serialized to zero bytes.*
### cacheable_unary
This test verifies that gRPC requests marked as cacheable use GET verb instead
of POST, and that server sets appropriate cache control headers for the response
to be cached by a proxy. This test requires that the server is behind
a caching proxy. Use of current timestamp in the request prevents accidental
cache matches left over from previous tests.
Server features:
* [CacheableUnaryCall][]
Procedure:
1. Client calls CacheableUnaryCall with `SimpleRequest` request with payload
set to current timestamp. Timestamp format is irrelevant, and resolution is
in nanoseconds.
Client adds a `x-user-ip` header with value `1.2.3.4` to the request.
This is done since some proxys such as GFE will not cache requests from
localhost.
Client marks the request as cacheable by setting the cacheable flag in the
request context. Longer term this should be driven by the method option
specified in the proto file itself.
2. Client calls CacheableUnaryCall with `SimpleRequest` request again
immediately with the same payload as the previous request. Cacheable flag is
also set for this request's context.
Client asserts:
* Both calls were successful
* The payload body of both responses is the same.
### large_unary ### large_unary
This test verifies unary calls succeed in sending messages, and touches on flow This test verifies unary calls succeed in sending messages, and touches on flow
@ -941,6 +970,18 @@ payload body of size `SimpleRequest.response_size` bytes and type as appropriate
for the `SimpleRequest.response_type`. If the server does not support the for the `SimpleRequest.response_type`. If the server does not support the
`response_type`, then it should fail the RPC with `INVALID_ARGUMENT`. `response_type`, then it should fail the RPC with `INVALID_ARGUMENT`.
### CacheableUnaryCall
Server gets the default SimpleRequest proto as the request. The content of the
request is ignored. It returns the SimpleResponse proto with the payload set
to current timestamp. The timestamp is an integer representing current time
with nanosecond resolution. This integer is formated as ASCII decimal in the
response. The format is not really important as long as the response payload
is different for each request. In addition it adds
1. cache control headers such that the response can be cached by proxies in
the response path. Server should be behind a caching proxy for this test
to pass. Currently we set the max-age to 60 seconds.
### CompressedResponse ### CompressedResponse
[CompressedResponse]: #compressedresponse [CompressedResponse]: #compressedresponse

@ -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

@ -330,8 +330,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;
} }
@ -339,9 +339,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;
} }
@ -1068,8 +1068,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 */
@ -1153,10 +1153,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 *state = statep; server_secure_state *server_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++) {
@ -311,7 +325,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;
@ -332,10 +347,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);

@ -103,8 +103,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. */

@ -195,6 +195,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);
} }
@ -646,6 +649,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;
@ -653,12 +657,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;
@ -667,10 +674,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,
@ -716,7 +725,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;
} }
@ -730,20 +739,12 @@ 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) {
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); tcp_server_destroy(exec_ctx, s);
} }
}
} }
void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx, void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx,

@ -141,7 +141,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;
} }
@ -176,20 +176,12 @@ 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) {
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); tcp_server_destroy(exec_ctx, s);
} }
}
} }
/* Prepare (bind) a recently-created socket for listening. */ /* Prepare (bind) a recently-created socket for listening. */

@ -242,8 +242,17 @@ static grpc_security_status composite_channel_create_security_connector(
return status; return status;
} }
static grpc_channel_credentials *
composite_channel_duplicate_without_call_credentials(
grpc_channel_credentials *creds) {
grpc_composite_channel_credentials *c =
(grpc_composite_channel_credentials *)creds;
return grpc_channel_credentials_ref(c->inner_creds);
}
static grpc_channel_credentials_vtable composite_channel_credentials_vtable = { static grpc_channel_credentials_vtable composite_channel_credentials_vtable = {
composite_channel_destruct, composite_channel_create_security_connector}; composite_channel_destruct, composite_channel_create_security_connector,
composite_channel_duplicate_without_call_credentials};
grpc_channel_credentials *grpc_composite_channel_credentials_create( grpc_channel_credentials *grpc_composite_channel_credentials_create(
grpc_channel_credentials *channel_creds, grpc_call_credentials *call_creds, grpc_channel_credentials *channel_creds, grpc_call_credentials *call_creds,

@ -53,7 +53,7 @@ grpc_call_credentials *grpc_credentials_contains_type(
grpc_call_credentials *creds, const char *type, grpc_call_credentials *creds, const char *type,
grpc_call_credentials **composite_creds); grpc_call_credentials **composite_creds);
/* -- Channel composite credentials. -- */ /* -- Composite channel credentials. -- */
typedef struct { typedef struct {
grpc_channel_credentials base; grpc_channel_credentials base;
@ -61,7 +61,7 @@ typedef struct {
grpc_call_credentials *call_creds; grpc_call_credentials *call_creds;
} grpc_composite_channel_credentials; } grpc_composite_channel_credentials;
/* -- Composite credentials. -- */ /* -- Composite call credentials. -- */
typedef struct { typedef struct {
grpc_call_credentials base; grpc_call_credentials base;

@ -138,6 +138,18 @@ grpc_security_status grpc_channel_credentials_create_security_connector(
channel_creds, NULL, target, args, sc, new_args); channel_creds, NULL, target, args, sc, new_args);
} }
grpc_channel_credentials *
grpc_channel_credentials_duplicate_without_call_credentials(
grpc_channel_credentials *channel_creds) {
if (channel_creds != NULL && channel_creds->vtable != NULL &&
channel_creds->vtable->duplicate_without_call_credentials != NULL) {
return channel_creds->vtable->duplicate_without_call_credentials(
channel_creds);
} else {
return grpc_channel_credentials_ref(channel_creds);
}
}
grpc_server_credentials *grpc_server_credentials_ref( grpc_server_credentials *grpc_server_credentials_ref(
grpc_server_credentials *creds) { grpc_server_credentials *creds) {
if (creds == NULL) return NULL; if (creds == NULL) return NULL;

@ -107,6 +107,9 @@ typedef struct {
grpc_channel_credentials *c, grpc_call_credentials *call_creds, grpc_channel_credentials *c, grpc_call_credentials *call_creds,
const char *target, const grpc_channel_args *args, const char *target, const grpc_channel_args *args,
grpc_channel_security_connector **sc, grpc_channel_args **new_args); grpc_channel_security_connector **sc, grpc_channel_args **new_args);
grpc_channel_credentials *(*duplicate_without_call_credentials)(
grpc_channel_credentials *c);
} grpc_channel_credentials_vtable; } grpc_channel_credentials_vtable;
struct grpc_channel_credentials { struct grpc_channel_credentials {
@ -128,6 +131,13 @@ grpc_security_status grpc_channel_credentials_create_security_connector(
const grpc_channel_args *args, grpc_channel_security_connector **sc, const grpc_channel_args *args, grpc_channel_security_connector **sc,
grpc_channel_args **new_args); grpc_channel_args **new_args);
/* Creates a version of the channel credentials without any attached call
credentials. This can be used in order to open a channel to a non-trusted
gRPC load balancer. */
grpc_channel_credentials *
grpc_channel_credentials_duplicate_without_call_credentials(
grpc_channel_credentials *creds);
/* --- grpc_credentials_md. --- */ /* --- grpc_credentials_md. --- */
typedef struct { typedef struct {

@ -61,7 +61,7 @@ fake_transport_security_server_create_security_connector(
static grpc_channel_credentials_vtable static grpc_channel_credentials_vtable
fake_transport_security_credentials_vtable = { fake_transport_security_credentials_vtable = {
NULL, fake_transport_security_create_security_connector}; NULL, fake_transport_security_create_security_connector, NULL};
static grpc_server_credentials_vtable static grpc_server_credentials_vtable
fake_transport_security_server_credentials_vtable = { fake_transport_security_server_credentials_vtable = {

@ -95,7 +95,7 @@ static grpc_security_status ssl_create_security_connector(
} }
static grpc_channel_credentials_vtable ssl_vtable = { static grpc_channel_credentials_vtable ssl_vtable = {
ssl_destruct, ssl_create_security_connector}; ssl_destruct, ssl_create_security_connector, NULL};
static void ssl_build_config(const char *pem_root_certs, static void ssl_build_config(const char *pem_root_certs,
grpc_ssl_pem_key_cert_pair *pem_key_cert_pair, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair,

@ -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

@ -17,17 +17,17 @@
</metadata> </metadata>
<files> <files>
<!-- forward slashes in src path enable building on Linux --> <!-- forward slashes in src path enable building on Linux -->
<file src="protoc_plugins/windows_x86/protoc.exe" target="tools\windows_x86\protoc.exe" /> <file src="protoc_plugins/windows_x86/protoc.exe" target="tools/windows_x86/protoc.exe" />
<file src="protoc_plugins/windows_x86/grpc_csharp_plugin.exe" target="tools\windows_x86\grpc_csharp_plugin.exe" /> <file src="protoc_plugins/windows_x86/grpc_csharp_plugin.exe" target="tools/windows_x86/grpc_csharp_plugin.exe" />
<file src="protoc_plugins/windows_x64/protoc.exe" target="tools\windows_x64\protoc.exe" /> <file src="protoc_plugins/windows_x64/protoc.exe" target="tools/windows_x64/protoc.exe" />
<file src="protoc_plugins/windows_x64/grpc_csharp_plugin.exe" target="tools\windows_x64\grpc_csharp_plugin.exe" /> <file src="protoc_plugins/windows_x64/grpc_csharp_plugin.exe" target="tools/windows_x64/grpc_csharp_plugin.exe" />
<file src="protoc_plugins/linux_x86/protoc" target="tools\linux_x86\protoc" /> <file src="protoc_plugins/linux_x86/protoc" target="tools/linux_x86/protoc" />
<file src="protoc_plugins/linux_x86/grpc_csharp_plugin" target="tools\linux_x86\grpc_csharp_plugin" /> <file src="protoc_plugins/linux_x86/grpc_csharp_plugin" target="tools/linux_x86/grpc_csharp_plugin" />
<file src="protoc_plugins/linux_x64/protoc" target="tools\linux_x64\protoc" /> <file src="protoc_plugins/linux_x64/protoc" target="tools/linux_x64/protoc" />
<file src="protoc_plugins/linux_x64/grpc_csharp_plugin" target="tools\linux_x64\grpc_csharp_plugin" /> <file src="protoc_plugins/linux_x64/grpc_csharp_plugin" target="tools/linux_x64/grpc_csharp_plugin" />
<file src="protoc_plugins/macosx_x86/protoc" target="tools\macosx_x86\protoc" /> <file src="protoc_plugins/macosx_x86/protoc" target="tools/macosx_x86/protoc" />
<file src="protoc_plugins/macosx_x86/grpc_csharp_plugin" target="tools\macosx_x86\grpc_csharp_plugin" /> <file src="protoc_plugins/macosx_x86/grpc_csharp_plugin" target="tools/macosx_x86/grpc_csharp_plugin" />
<file src="protoc_plugins/macosx_x64/protoc" target="tools\macosx_x64\protoc" /> <file src="protoc_plugins/macosx_x64/protoc" target="tools/macosx_x64/protoc" />
<file src="protoc_plugins/macosx_x64/grpc_csharp_plugin" target="tools\macosx_x64\grpc_csharp_plugin" /> <file src="protoc_plugins/macosx_x64/grpc_csharp_plugin" target="tools/macosx_x64/grpc_csharp_plugin" />
</files> </files>
</package> </package>

@ -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:**

@ -47,6 +47,11 @@ service TestService {
// One request followed by one response. // One request followed by one response.
rpc UnaryCall(SimpleRequest) returns (SimpleResponse); rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
// One request followed by one response. Response has cache control
// headers set such that a caching HTTP proxy (such as GFE) can
// satisfy subsequent requests.
rpc CacheableUnaryCall(SimpleRequest) returns (SimpleResponse);
// One request followed by a sequence of responses (streamed download). // One request followed by a sequence of responses (streamed download).
// The server returns the payload with client desired type and sizes. // The server returns the payload with client desired type and sizes.
rpc StreamingOutputCall(StreamingOutputCallRequest) rpc StreamingOutputCall(StreamingOutputCallRequest)

@ -462,7 +462,6 @@ def _unary_response_in_pool(
rpc_event, state, response, response_serializer) rpc_event, state, response, response_serializer)
if serialized_response is not None: if serialized_response is not None:
_status(rpc_event, state, serialized_response) _status(rpc_event, state, serialized_response)
return
def _stream_response_in_pool( def _stream_response_in_pool(

@ -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

@ -331,11 +331,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,

@ -140,8 +140,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) {
@ -208,8 +209,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,

@ -46,6 +46,7 @@
#include "src/core/lib/http/httpcli.h" #include "src/core/lib/http/httpcli.h"
#include "src/core/lib/security/credentials/composite/composite_credentials.h" #include "src/core/lib/security/credentials/composite/composite_credentials.h"
#include "src/core/lib/security/credentials/fake/fake_credentials.h"
#include "src/core/lib/security/credentials/google_default/google_default_credentials.h" #include "src/core/lib/security/credentials/google_default/google_default_credentials.h"
#include "src/core/lib/security/credentials/jwt/jwt_credentials.h" #include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
#include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h" #include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h"
@ -411,7 +412,7 @@ static grpc_security_status check_channel_oauth2_create_security_connector(
static void test_channel_oauth2_composite_creds(void) { static void test_channel_oauth2_composite_creds(void) {
grpc_channel_args *new_args; grpc_channel_args *new_args;
grpc_channel_credentials_vtable vtable = { grpc_channel_credentials_vtable vtable = {
NULL, check_channel_oauth2_create_security_connector}; NULL, check_channel_oauth2_create_security_connector, NULL};
grpc_channel_credentials *channel_creds = grpc_channel_credentials *channel_creds =
grpc_mock_channel_credentials_create(&vtable); grpc_mock_channel_credentials_create(&vtable);
grpc_call_credentials *oauth2_creds = grpc_call_credentials *oauth2_creds =
@ -495,7 +496,7 @@ check_channel_oauth2_google_iam_create_security_connector(
static void test_channel_oauth2_google_iam_composite_creds(void) { static void test_channel_oauth2_google_iam_composite_creds(void) {
grpc_channel_args *new_args; grpc_channel_args *new_args;
grpc_channel_credentials_vtable vtable = { grpc_channel_credentials_vtable vtable = {
NULL, check_channel_oauth2_google_iam_create_security_connector}; NULL, check_channel_oauth2_google_iam_create_security_connector, NULL};
grpc_channel_credentials *channel_creds = grpc_channel_credentials *channel_creds =
grpc_mock_channel_credentials_create(&vtable); grpc_mock_channel_credentials_create(&vtable);
grpc_call_credentials *oauth2_creds = grpc_call_credentials *oauth2_creds =
@ -1139,6 +1140,31 @@ static void test_get_well_known_google_credentials_file_path(void) {
gpr_free(home); gpr_free(home);
} }
static void test_channel_creds_duplicate_without_call_creds(void) {
grpc_channel_credentials *channel_creds =
grpc_fake_transport_security_credentials_create();
grpc_channel_credentials *dup =
grpc_channel_credentials_duplicate_without_call_credentials(
channel_creds);
GPR_ASSERT(dup == channel_creds);
grpc_channel_credentials_unref(dup);
grpc_call_credentials *call_creds =
grpc_access_token_credentials_create("blah", NULL);
grpc_channel_credentials *composite_creds =
grpc_composite_channel_credentials_create(channel_creds, call_creds,
NULL);
grpc_call_credentials_unref(call_creds);
dup = grpc_channel_credentials_duplicate_without_call_credentials(
composite_creds);
GPR_ASSERT(dup == channel_creds);
grpc_channel_credentials_unref(dup);
grpc_channel_credentials_unref(channel_creds);
grpc_channel_credentials_unref(composite_creds);
}
int main(int argc, char **argv) { int main(int argc, char **argv) {
grpc_test_init(argc, argv); grpc_test_init(argc, argv);
grpc_init(); grpc_init();
@ -1173,6 +1199,7 @@ int main(int argc, char **argv) {
test_metadata_plugin_success(); test_metadata_plugin_success();
test_metadata_plugin_failure(); test_metadata_plugin_failure();
test_get_well_known_google_credentials_file_path(); test_get_well_known_google_credentials_file_path();
test_channel_creds_duplicate_without_call_creds();
grpc_shutdown(); grpc_shutdown();
return 0; return 0;
} }

@ -149,6 +149,8 @@ int main(int argc, char** argv) {
client.DoStatusWithMessage(); client.DoStatusWithMessage();
} else if (FLAGS_test_case == "custom_metadata") { } else if (FLAGS_test_case == "custom_metadata") {
client.DoCustomMetadata(); client.DoCustomMetadata();
} else if (FLAGS_test_case == "cacheable_unary") {
client.DoCacheableUnary();
} else if (FLAGS_test_case == "all") { } else if (FLAGS_test_case == "all") {
client.DoEmpty(); client.DoEmpty();
client.DoLargeUnary(); client.DoLargeUnary();
@ -166,6 +168,7 @@ int main(int argc, char** argv) {
client.DoEmptyStream(); client.DoEmptyStream();
client.DoStatusWithMessage(); client.DoStatusWithMessage();
client.DoCustomMetadata(); client.DoCustomMetadata();
client.DoCacheableUnary();
// service_account_creds and jwt_token_creds can only run with ssl. // service_account_creds and jwt_token_creds can only run with ssl.
if (FLAGS_use_tls) { if (FLAGS_use_tls) {
grpc::string json_key = GetServiceAccountJsonKey(); grpc::string json_key = GetServiceAccountJsonKey();
@ -177,6 +180,7 @@ int main(int argc, char** argv) {
// compute_engine_creds only runs in GCE. // compute_engine_creds only runs in GCE.
} else { } else {
const char* testcases[] = {"all", const char* testcases[] = {"all",
"cacheable_unary",
"cancel_after_begin", "cancel_after_begin",
"cancel_after_first_response", "cancel_after_first_response",
"client_compressed_streaming", "client_compressed_streaming",

@ -846,6 +846,50 @@ bool InteropClient::DoStatusWithMessage() {
return true; return true;
} }
bool InteropClient::DoCacheableUnary() {
gpr_log(GPR_DEBUG, "Sending RPC with cacheable response");
// Create request with current timestamp
gpr_timespec ts = gpr_now(GPR_CLOCK_PRECISE);
std::string timestamp = std::to_string((long long unsigned)ts.tv_nsec);
SimpleRequest request;
request.mutable_payload()->set_body(timestamp.c_str(), timestamp.size());
// Request 1
ClientContext context1;
SimpleResponse response1;
context1.set_cacheable(true);
// Add fake user IP since some proxy's (GFE) won't cache requests from
// localhost.
context1.AddMetadata("x-user-ip", "1.2.3.4");
Status s1 =
serviceStub_.Get()->CacheableUnaryCall(&context1, request, &response1);
if (!AssertStatusOk(s1)) {
return false;
}
gpr_log(GPR_DEBUG, "response 1 payload: %s",
response1.payload().body().c_str());
// Request 2
ClientContext context2;
SimpleResponse response2;
context2.set_cacheable(true);
context2.AddMetadata("x-user-ip", "1.2.3.4");
Status s2 =
serviceStub_.Get()->CacheableUnaryCall(&context2, request, &response2);
if (!AssertStatusOk(s2)) {
return false;
}
gpr_log(GPR_DEBUG, "response 2 payload: %s",
response2.payload().body().c_str());
// Check that the body is same for both requests. It will be the same if the
// second response is a cached copy of the first response
GPR_ASSERT(response2.payload().body() == response1.payload().body());
return true;
}
bool InteropClient::DoCustomMetadata() { bool InteropClient::DoCustomMetadata() {
const grpc::string kEchoInitialMetadataKey("x-grpc-test-echo-initial"); const grpc::string kEchoInitialMetadataKey("x-grpc-test-echo-initial");
const grpc::string kInitialMetadataValue("test_initial_metadata_value"); const grpc::string kInitialMetadataValue("test_initial_metadata_value");

@ -79,6 +79,7 @@ class InteropClient {
bool DoEmptyStream(); bool DoEmptyStream();
bool DoStatusWithMessage(); bool DoStatusWithMessage();
bool DoCustomMetadata(); bool DoCustomMetadata();
bool DoCacheableUnary();
// Auth tests. // Auth tests.
// username is a string containing the user email // username is a string containing the user email
bool DoJwtTokenCreds(const grpc::string& username); bool DoJwtTokenCreds(const grpc::string& username);

@ -47,6 +47,7 @@
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/useful.h> #include <grpc/support/useful.h>
#include "src/core/lib/support/string.h"
#include "src/core/lib/transport/byte_stream.h" #include "src/core/lib/transport/byte_stream.h"
#include "src/proto/grpc/testing/empty.grpc.pb.h" #include "src/proto/grpc/testing/empty.grpc.pb.h"
#include "src/proto/grpc/testing/messages.grpc.pb.h" #include "src/proto/grpc/testing/messages.grpc.pb.h"
@ -153,6 +154,17 @@ class TestServiceImpl : public TestService::Service {
return Status::OK; return Status::OK;
} }
// Response contains current timestamp. We ignore everything in the request.
Status CacheableUnaryCall(ServerContext* context,
const SimpleRequest* request,
SimpleResponse* response) {
gpr_timespec ts = gpr_now(GPR_CLOCK_PRECISE);
std::string timestamp = std::to_string((long long unsigned)ts.tv_nsec);
response->mutable_payload()->set_body(timestamp.c_str(), timestamp.size());
context->AddInitialMetadata("cache-control", "max-age=60, public");
return Status::OK;
}
Status UnaryCall(ServerContext* context, const SimpleRequest* request, Status UnaryCall(ServerContext* context, const SimpleRequest* request,
SimpleResponse* response) { SimpleResponse* response) {
MaybeEchoMetadata(context); MaybeEchoMetadata(context);

@ -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