Merge branch 'master' of https://github.com/Vizerai/grpc into intrusive_hash_map
This commit is contained in:
commit
0d1825d4cc
12
BUILD
12
BUILD
|
|
@ -1405,18 +1405,6 @@ grpc_cc_library(
|
|||
],
|
||||
)
|
||||
|
||||
grpc_cc_library(
|
||||
name = "thrift_util",
|
||||
language = "c++",
|
||||
public_hdrs = [
|
||||
"include/grpc++/impl/codegen/thrift_serializer.h",
|
||||
"include/grpc++/impl/codegen/thrift_utils.h",
|
||||
],
|
||||
deps = [
|
||||
"grpc++_codegen_base",
|
||||
],
|
||||
)
|
||||
|
||||
grpc_cc_library(
|
||||
name = "grpc++_reflection",
|
||||
srcs = [
|
||||
|
|
|
|||
|
|
@ -677,6 +677,7 @@ add_dependencies(buildtests_cxx golden_file_test)
|
|||
add_dependencies(buildtests_cxx grpc_cli)
|
||||
add_dependencies(buildtests_cxx grpc_tool_test)
|
||||
add_dependencies(buildtests_cxx grpclb_api_test)
|
||||
add_dependencies(buildtests_cxx grpclb_end2end_test)
|
||||
add_dependencies(buildtests_cxx grpclb_test)
|
||||
add_dependencies(buildtests_cxx health_service_end2end_test)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
|
@ -3280,8 +3281,6 @@ foreach(_hdr
|
|||
include/grpc/impl/codegen/sync_windows.h
|
||||
include/grpc++/impl/codegen/proto_utils.h
|
||||
include/grpc++/impl/codegen/config_protobuf.h
|
||||
include/grpc++/impl/codegen/thrift_serializer.h
|
||||
include/grpc++/impl/codegen/thrift_utils.h
|
||||
)
|
||||
string(REPLACE "include/" "" _path ${_hdr})
|
||||
get_filename_component(_path ${_path} PATH)
|
||||
|
|
@ -10783,6 +10782,55 @@ target_link_libraries(grpclb_api_test
|
|||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_executable(grpclb_end2end_test
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.cc
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.h
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.h
|
||||
test/cpp/end2end/grpclb_end2end_test.cc
|
||||
third_party/googletest/googletest/src/gtest-all.cc
|
||||
third_party/googletest/googlemock/src/gmock-all.cc
|
||||
)
|
||||
|
||||
protobuf_generate_grpc_cpp(
|
||||
src/proto/grpc/lb/v1/load_balancer.proto
|
||||
)
|
||||
|
||||
target_include_directories(grpclb_end2end_test
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
PRIVATE ${BORINGSSL_ROOT_DIR}/include
|
||||
PRIVATE ${PROTOBUF_ROOT_DIR}/src
|
||||
PRIVATE ${BENCHMARK_ROOT_DIR}/include
|
||||
PRIVATE ${ZLIB_ROOT_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
|
||||
PRIVATE ${CARES_BUILD_INCLUDE_DIR}
|
||||
PRIVATE ${CARES_INCLUDE_DIR}
|
||||
PRIVATE ${CARES_PLATFORM_INCLUDE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/cares/cares
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
|
||||
PRIVATE third_party/googletest/googletest/include
|
||||
PRIVATE third_party/googletest/googletest
|
||||
PRIVATE third_party/googletest/googlemock/include
|
||||
PRIVATE third_party/googletest/googlemock
|
||||
PRIVATE ${_gRPC_PROTO_GENS_DIR}
|
||||
)
|
||||
|
||||
target_link_libraries(grpclb_end2end_test
|
||||
${_gRPC_PROTOBUF_LIBRARIES}
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
grpc++_test_util
|
||||
grpc_test_util
|
||||
grpc++
|
||||
grpc
|
||||
gpr_test_util
|
||||
gpr
|
||||
${_gRPC_GFLAGS_LIBRARIES}
|
||||
)
|
||||
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_executable(grpclb_test
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.cc
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc
|
||||
|
|
|
|||
54
Makefile
54
Makefile
|
|
@ -1155,6 +1155,7 @@ grpc_python_plugin: $(BINDIR)/$(CONFIG)/grpc_python_plugin
|
|||
grpc_ruby_plugin: $(BINDIR)/$(CONFIG)/grpc_ruby_plugin
|
||||
grpc_tool_test: $(BINDIR)/$(CONFIG)/grpc_tool_test
|
||||
grpclb_api_test: $(BINDIR)/$(CONFIG)/grpclb_api_test
|
||||
grpclb_end2end_test: $(BINDIR)/$(CONFIG)/grpclb_end2end_test
|
||||
grpclb_test: $(BINDIR)/$(CONFIG)/grpclb_test
|
||||
health_service_end2end_test: $(BINDIR)/$(CONFIG)/health_service_end2end_test
|
||||
http2_client: $(BINDIR)/$(CONFIG)/http2_client
|
||||
|
|
@ -1580,6 +1581,7 @@ buildtests_cxx: privatelibs_cxx \
|
|||
$(BINDIR)/$(CONFIG)/grpc_cli \
|
||||
$(BINDIR)/$(CONFIG)/grpc_tool_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_api_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_test \
|
||||
$(BINDIR)/$(CONFIG)/health_service_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/http2_client \
|
||||
|
|
@ -1701,6 +1703,7 @@ buildtests_cxx: privatelibs_cxx \
|
|||
$(BINDIR)/$(CONFIG)/grpc_cli \
|
||||
$(BINDIR)/$(CONFIG)/grpc_tool_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_api_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_test \
|
||||
$(BINDIR)/$(CONFIG)/health_service_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/http2_client \
|
||||
|
|
@ -2085,6 +2088,8 @@ test_cxx: buildtests_cxx
|
|||
$(Q) $(BINDIR)/$(CONFIG)/grpc_tool_test || ( echo test grpc_tool_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing grpclb_api_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/grpclb_api_test || ( echo test grpclb_api_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing grpclb_end2end_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/grpclb_end2end_test || ( echo test grpclb_end2end_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing grpclb_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/grpclb_test || ( echo test grpclb_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing health_service_end2end_test"
|
||||
|
|
@ -5164,8 +5169,6 @@ PUBLIC_HEADERS_CXX += \
|
|||
include/grpc/impl/codegen/sync_windows.h \
|
||||
include/grpc++/impl/codegen/proto_utils.h \
|
||||
include/grpc++/impl/codegen/config_protobuf.h \
|
||||
include/grpc++/impl/codegen/thrift_serializer.h \
|
||||
include/grpc++/impl/codegen/thrift_utils.h \
|
||||
|
||||
LIBGRPC++_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_TEST_UTIL_SRC))))
|
||||
|
||||
|
|
@ -15133,6 +15136,53 @@ endif
|
|||
$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc
|
||||
|
||||
|
||||
GRPCLB_END2END_TEST_SRC = \
|
||||
$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc \
|
||||
test/cpp/end2end/grpclb_end2end_test.cc \
|
||||
|
||||
GRPCLB_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPCLB_END2END_TEST_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/grpclb_end2end_test: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
|
||||
ifeq ($(NO_PROTOBUF),true)
|
||||
|
||||
# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/grpclb_end2end_test: protobuf_dep_error
|
||||
|
||||
else
|
||||
|
||||
$(BINDIR)/$(CONFIG)/grpclb_end2end_test: $(PROTOBUF_DEP) $(GRPCLB_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
$(E) "[LD] Linking $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(LDXX) $(LDFLAGS) $(GRPCLB_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpclb_end2end_test
|
||||
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v1/load_balancer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/end2end/grpclb_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_grpclb_end2end_test: $(GRPCLB_END2END_TEST_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(GRPCLB_END2END_TEST_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/end2end/grpclb_end2end_test.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc
|
||||
|
||||
|
||||
GRPCLB_TEST_SRC = \
|
||||
$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc \
|
||||
test/cpp/grpclb/grpclb_test.cc \
|
||||
|
|
|
|||
|
|
@ -9,18 +9,18 @@ def generate_cc_impl(ctx):
|
|||
protos = [f for src in ctx.attr.srcs for f in src.proto.direct_sources]
|
||||
includes = [f for src in ctx.attr.srcs for f in src.proto.transitive_imports]
|
||||
outs = []
|
||||
# label_len is length of the path from WORKSPACE root to the location of this build file
|
||||
label_len = len(ctx.label.package) + 1
|
||||
if ctx.executable.plugin:
|
||||
outs += [proto.basename[:-len(".proto")] + ".grpc.pb.h" for proto in protos]
|
||||
outs += [proto.basename[:-len(".proto")] + ".grpc.pb.cc" for proto in protos]
|
||||
outs += [proto.path[label_len:-len(".proto")] + ".grpc.pb.h" for proto in protos]
|
||||
outs += [proto.path[label_len:-len(".proto")] + ".grpc.pb.cc" for proto in protos]
|
||||
if ctx.attr.generate_mock:
|
||||
outs += [proto.basename[:-len(".proto")] + "_mock.grpc.pb.h" for proto in protos]
|
||||
outs += [proto.path[label_len:-len(".proto")] + "_mock.grpc.pb.h" for proto in protos]
|
||||
else:
|
||||
outs += [proto.basename[:-len(".proto")] + ".pb.h" for proto in protos]
|
||||
outs += [proto.basename[:-len(".proto")] + ".pb.cc" for proto in protos]
|
||||
outs += [proto.path[label_len:-len(".proto")] + ".pb.h" for proto in protos]
|
||||
outs += [proto.path[label_len:-len(".proto")] + ".pb.cc" for proto in protos]
|
||||
out_files = [ctx.new_file(out) for out in outs]
|
||||
# The following should be replaced with ctx.configuration.buildout
|
||||
# whenever this is added to Skylark.
|
||||
dir_out = out_files[0].dirname[:-len(protos[0].dirname)]
|
||||
dir_out = str(ctx.genfiles_dir.path)
|
||||
|
||||
arguments = []
|
||||
if ctx.executable.plugin:
|
||||
|
|
|
|||
22
build.yaml
22
build.yaml
|
|
@ -981,13 +981,6 @@ filegroups:
|
|||
- include/grpc++/test/server_context_test_spouse.h
|
||||
deps:
|
||||
- grpc++
|
||||
- name: thrift_util
|
||||
language: c++
|
||||
public_headers:
|
||||
- include/grpc++/impl/codegen/thrift_serializer.h
|
||||
- include/grpc++/impl/codegen/thrift_utils.h
|
||||
uses:
|
||||
- grpc++_codegen_base
|
||||
libs:
|
||||
- name: gpr
|
||||
build: all
|
||||
|
|
@ -1285,7 +1278,6 @@ libs:
|
|||
- grpc++_codegen_base_src
|
||||
- grpc++_codegen_proto
|
||||
- grpc++_config_proto
|
||||
- thrift_util
|
||||
- name: grpc++_unsecure
|
||||
build: all
|
||||
language: c++
|
||||
|
|
@ -3824,6 +3816,20 @@ targets:
|
|||
- grpc_test_util
|
||||
- grpc++
|
||||
- grpc
|
||||
- name: grpclb_end2end_test
|
||||
gtest: true
|
||||
build: test
|
||||
language: c++
|
||||
src:
|
||||
- src/proto/grpc/lb/v1/load_balancer.proto
|
||||
- test/cpp/end2end/grpclb_end2end_test.cc
|
||||
deps:
|
||||
- grpc++_test_util
|
||||
- grpc_test_util
|
||||
- grpc++
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: grpclb_test
|
||||
gtest: false
|
||||
build: test
|
||||
|
|
|
|||
|
|
@ -27,16 +27,40 @@
|
|||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load("//bazel:grpc_build_system.bzl", "grpc_proto_library")
|
||||
|
||||
grpc_proto_library(
|
||||
name = "auth_sample",
|
||||
srcs = ["protos/auth_sample.proto"],
|
||||
)
|
||||
|
||||
grpc_proto_library(
|
||||
name = "hellostreamingworld",
|
||||
srcs = ["protos/hellostreamingworld.proto"],
|
||||
)
|
||||
|
||||
grpc_proto_library(
|
||||
name = "helloworld",
|
||||
srcs = ["protos/helloworld.proto"],
|
||||
)
|
||||
|
||||
grpc_proto_library(
|
||||
name = "route_guide",
|
||||
srcs = ["protos/route_guide.proto"],
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "greeter_client",
|
||||
srcs = ["greeter_client.cc"],
|
||||
deps = ["//examples/protos:helloworld"],
|
||||
srcs = ["cpp/helloworld/greeter_client.cc"],
|
||||
deps = ["helloworld"],
|
||||
defines = ["BAZEL_BUILD"],
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "greeter_server",
|
||||
srcs = ["greeter_server.cc"],
|
||||
deps = ["//examples/protos:helloworld"],
|
||||
srcs = ["cpp/helloworld/greeter_server.cc"],
|
||||
deps = ["helloworld"],
|
||||
defines = ["BAZEL_BUILD"],
|
||||
)
|
||||
|
|
@ -364,28 +364,6 @@ class CallOpRecvMessage {
|
|||
bool allow_not_getting_message_;
|
||||
};
|
||||
|
||||
namespace CallOpGenericRecvMessageHelper {
|
||||
class DeserializeFunc {
|
||||
public:
|
||||
virtual Status Deserialize(grpc_byte_buffer* buf) = 0;
|
||||
virtual ~DeserializeFunc() {}
|
||||
};
|
||||
|
||||
template <class R>
|
||||
class DeserializeFuncType final : public DeserializeFunc {
|
||||
public:
|
||||
DeserializeFuncType(R* message) : message_(message) {}
|
||||
Status Deserialize(grpc_byte_buffer* buf) override {
|
||||
return SerializationTraits<R>::Deserialize(buf, message_);
|
||||
}
|
||||
|
||||
~DeserializeFuncType() override {}
|
||||
|
||||
private:
|
||||
R* message_; // Not a managed pointer because management is external to this
|
||||
};
|
||||
} // namespace CallOpGenericRecvMessageHelper
|
||||
|
||||
class CallOpGenericRecvMessage {
|
||||
public:
|
||||
CallOpGenericRecvMessage()
|
||||
|
|
@ -393,11 +371,9 @@ class CallOpGenericRecvMessage {
|
|||
|
||||
template <class R>
|
||||
void RecvMessage(R* message) {
|
||||
// Use an explicit base class pointer to avoid resolution error in the
|
||||
// following unique_ptr::reset for some old implementations.
|
||||
CallOpGenericRecvMessageHelper::DeserializeFunc* func =
|
||||
new CallOpGenericRecvMessageHelper::DeserializeFuncType<R>(message);
|
||||
deserialize_.reset(func);
|
||||
deserialize_ = [message](grpc_byte_buffer* buf) -> Status {
|
||||
return SerializationTraits<R>::Deserialize(buf, message);
|
||||
};
|
||||
}
|
||||
|
||||
// Do not change status if no message is received.
|
||||
|
|
@ -420,7 +396,7 @@ class CallOpGenericRecvMessage {
|
|||
if (recv_buf_) {
|
||||
if (*status) {
|
||||
got_message = true;
|
||||
*status = deserialize_->Deserialize(recv_buf_).ok();
|
||||
*status = deserialize_(recv_buf_).ok();
|
||||
} else {
|
||||
got_message = false;
|
||||
g_core_codegen_interface->grpc_byte_buffer_destroy(recv_buf_);
|
||||
|
|
@ -431,11 +407,12 @@ class CallOpGenericRecvMessage {
|
|||
*status = false;
|
||||
}
|
||||
}
|
||||
deserialize_.reset();
|
||||
deserialize_ = DeserializeFunc();
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<CallOpGenericRecvMessageHelper::DeserializeFunc> deserialize_;
|
||||
typedef std::function<Status(grpc_byte_buffer*)> DeserializeFunc;
|
||||
DeserializeFunc deserialize_;
|
||||
grpc_byte_buffer* recv_buf_;
|
||||
bool allow_not_getting_message_;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -622,9 +622,17 @@ bool PrivateGenerator::PrintPreamble(grpc_generator::Printer* out) {
|
|||
|
||||
for (StringPairSet::iterator it = imports_set.begin();
|
||||
it != imports_set.end(); ++it) {
|
||||
var["ModuleName"] = std::get<0>(*it);
|
||||
auto module_name = std::get<0>(*it);
|
||||
var["ModuleAlias"] = std::get<1>(*it);
|
||||
out->Print(var, "import $ModuleName$ as $ModuleAlias$\n");
|
||||
const size_t last_dot_pos = module_name.rfind('.');
|
||||
if (last_dot_pos == grpc::string::npos) {
|
||||
var["ImportStatement"] = "import " + module_name;
|
||||
} else {
|
||||
var["ImportStatement"] = "from " + module_name.substr(0, last_dot_pos) +
|
||||
" import " +
|
||||
module_name.substr(last_dot_pos + 1);
|
||||
}
|
||||
out->Print(var, "$ImportStatement$ as $ModuleAlias$\n");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -1284,7 +1284,7 @@ static void lb_on_response_received_locked(grpc_exec_ctx *exec_ctx, void *arg,
|
|||
"Received empty server list. Picks will stay pending until a "
|
||||
"response with > 0 servers is received");
|
||||
}
|
||||
grpc_grpclb_destroy_serverlist(glb_policy->serverlist);
|
||||
grpc_grpclb_destroy_serverlist(serverlist);
|
||||
}
|
||||
} else { /* serverlist == NULL */
|
||||
gpr_log(GPR_ERROR, "Invalid LB response received: '%s'. Ignoring.",
|
||||
|
|
|
|||
|
|
@ -27,26 +27,13 @@
|
|||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load("//bazel:grpc_build_system.bzl", "grpc_proto_library")
|
||||
|
||||
grpc_proto_library(
|
||||
name = "auth_sample",
|
||||
srcs = ["auth_sample.proto"],
|
||||
)
|
||||
|
||||
grpc_proto_library(
|
||||
name = "hellostreamingworld",
|
||||
srcs = ["hellostreamingworld.proto"],
|
||||
)
|
||||
|
||||
grpc_proto_library(
|
||||
name = "helloworld",
|
||||
srcs = ["helloworld.proto"],
|
||||
)
|
||||
|
||||
grpc_proto_library(
|
||||
name = "route_guide",
|
||||
srcs = ["route_guide.proto"],
|
||||
name = "load_balancer_proto",
|
||||
srcs = ["load_balancer.proto"],
|
||||
)
|
||||
|
|
@ -29,7 +29,6 @@
|
|||
"""Setup module for the GRPC Python package's optional health checking."""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import setuptools
|
||||
|
||||
|
|
|
|||
|
|
@ -56,9 +56,6 @@
|
|||
|
||||
#include "test/core/end2end/fake_resolver.h"
|
||||
|
||||
#define GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR \
|
||||
"grpc.fake_resolver.response_generator"
|
||||
|
||||
//
|
||||
// fake_resolver
|
||||
//
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@
|
|||
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
#define GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR \
|
||||
"grpc.fake_resolver.response_generator"
|
||||
|
||||
void grpc_fake_resolver_init();
|
||||
|
||||
// Instances of \a grpc_fake_resolver_response_generator are passed to the
|
||||
|
|
|
|||
|
|
@ -115,8 +115,8 @@ void test_slice_buffer_move_first() {
|
|||
grpc_slice_buffer_move_first(&src, 2, &dst);
|
||||
src_len -= 2;
|
||||
dst_len += 2;
|
||||
GPR_ASSERT(src.length == src.length);
|
||||
GPR_ASSERT(dst.length == dst.length);
|
||||
GPR_ASSERT(src.length == src_len);
|
||||
GPR_ASSERT(dst.length == dst_len);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
|
|
|||
|
|
@ -48,10 +48,10 @@ cc_test(
|
|||
"//:grpc",
|
||||
"//:grpc++",
|
||||
"//external:gtest",
|
||||
"//src/proto/grpc/health/v1:health_proto",
|
||||
"//src/proto/grpc/testing:echo_messages_proto",
|
||||
"//src/proto/grpc/testing:echo_proto",
|
||||
"//src/proto/grpc/testing/duplicate:echo_duplicate_proto",
|
||||
"//src/proto/grpc/health/v1:health_proto",
|
||||
"//test/core/util:gpr_test_util",
|
||||
"//test/core/util:grpc_test_util",
|
||||
"//test/cpp/util:test_util",
|
||||
|
|
@ -198,6 +198,26 @@ cc_test(
|
|||
],
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "grpclb_end2end_test",
|
||||
srcs = ["grpclb_end2end_test.cc"],
|
||||
deps = [
|
||||
":test_service_impl",
|
||||
"//:gpr",
|
||||
"//:grpc",
|
||||
"//:grpc++",
|
||||
"//external:gtest",
|
||||
"//src/proto/grpc/lb/v1:load_balancer_proto",
|
||||
"//src/proto/grpc/testing:echo_messages_proto",
|
||||
"//src/proto/grpc/testing:echo_proto",
|
||||
"//src/proto/grpc/testing/duplicate:echo_duplicate_proto",
|
||||
"//test/core/end2end:fake_resolver",
|
||||
"//test/core/util:gpr_test_util",
|
||||
"//test/core/util:grpc_test_util",
|
||||
"//test/cpp/util:test_util",
|
||||
],
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "proto_server_reflection_test",
|
||||
srcs = ["proto_server_reflection_test.cc"],
|
||||
|
|
|
|||
|
|
@ -0,0 +1,520 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2017, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <sstream>
|
||||
#include <thread>
|
||||
|
||||
#include <grpc++/channel.h>
|
||||
#include <grpc++/client_context.h>
|
||||
#include <grpc++/create_channel.h>
|
||||
#include <grpc++/server.h>
|
||||
#include <grpc++/server_builder.h>
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
#include <grpc/support/thd.h>
|
||||
#include <grpc/support/time.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
extern "C" {
|
||||
#include "src/core/lib/iomgr/sockaddr.h"
|
||||
#include "test/core/end2end/fake_resolver.h"
|
||||
}
|
||||
|
||||
#include "test/core/util/port.h"
|
||||
#include "test/core/util/test_config.h"
|
||||
#include "test/cpp/end2end/test_service_impl.h"
|
||||
|
||||
#include "src/proto/grpc/lb/v1/load_balancer.grpc.pb.h"
|
||||
#include "src/proto/grpc/testing/echo.grpc.pb.h"
|
||||
|
||||
// TODO(dgq): Other scenarios in need of testing:
|
||||
// - Send a serverlist with faulty ip:port addresses (port > 2^16, etc).
|
||||
// - Test reception of invalid serverlist
|
||||
// - Test pinging
|
||||
// - Test against a non-LB server.
|
||||
// - Random LB server closing the stream unexpectedly.
|
||||
// - Test using DNS-resolvable names (localhost?)
|
||||
// - Test handling of creation of faulty RR instance by having the LB return a
|
||||
// serverlist with non-existent backends after having initially returned a
|
||||
// valid one.
|
||||
//
|
||||
// Findings from end to end testing to be covered here:
|
||||
// - Handling of LB servers restart, including reconnection after backing-off
|
||||
// retries.
|
||||
// - Destruction of load balanced channel (and therefore of grpclb instance)
|
||||
// while:
|
||||
// 1) the internal LB call is still active. This should work by virtue
|
||||
// of the weak reference the LB call holds. The call should be terminated as
|
||||
// part of the grpclb shutdown process.
|
||||
// 2) the retry timer is active. Again, the weak reference it holds should
|
||||
// prevent a premature call to \a glb_destroy.
|
||||
// - Restart of backend servers with no changes to serverlist. This exercises
|
||||
// the RR handover mechanism.
|
||||
|
||||
using std::chrono::system_clock;
|
||||
|
||||
using grpc::lb::v1::LoadBalanceResponse;
|
||||
using grpc::lb::v1::LoadBalanceRequest;
|
||||
using grpc::lb::v1::LoadBalancer;
|
||||
|
||||
namespace grpc {
|
||||
namespace testing {
|
||||
namespace {
|
||||
|
||||
template <typename ServiceType>
|
||||
class CountedService : public ServiceType {
|
||||
public:
|
||||
int request_count() {
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
return request_count_;
|
||||
}
|
||||
|
||||
int response_count() {
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
return response_count_;
|
||||
}
|
||||
|
||||
void IncreaseResponseCount() {
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
++response_count_;
|
||||
}
|
||||
void IncreaseRequestCount() {
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
++request_count_;
|
||||
}
|
||||
|
||||
protected:
|
||||
std::mutex mu_;
|
||||
|
||||
private:
|
||||
int request_count_ = 0;
|
||||
int response_count_ = 0;
|
||||
};
|
||||
|
||||
using BackendService = CountedService<TestServiceImpl>;
|
||||
using BalancerService = CountedService<LoadBalancer::Service>;
|
||||
|
||||
class BackendServiceImpl : public BackendService {
|
||||
public:
|
||||
BackendServiceImpl() {}
|
||||
|
||||
Status Echo(ServerContext* context, const EchoRequest* request,
|
||||
EchoResponse* response) override {
|
||||
IncreaseRequestCount();
|
||||
const auto status = TestServiceImpl::Echo(context, request, response);
|
||||
IncreaseResponseCount();
|
||||
return status;
|
||||
}
|
||||
};
|
||||
|
||||
grpc::string Ip4ToPackedString(const char* ip_str) {
|
||||
struct in_addr ip4;
|
||||
GPR_ASSERT(inet_pton(AF_INET, ip_str, &ip4) == 1);
|
||||
return grpc::string(reinterpret_cast<const char*>(&ip4), sizeof(ip4));
|
||||
}
|
||||
|
||||
class BalancerServiceImpl : public BalancerService {
|
||||
public:
|
||||
using Stream = ServerReaderWriter<LoadBalanceResponse, LoadBalanceRequest>;
|
||||
using ResponseDelayPair = std::pair<LoadBalanceResponse, int>;
|
||||
|
||||
BalancerServiceImpl() : shutdown_(false) {}
|
||||
|
||||
Status BalanceLoad(ServerContext* context, Stream* stream) override {
|
||||
LoadBalanceRequest request;
|
||||
stream->Read(&request);
|
||||
IncreaseRequestCount();
|
||||
gpr_log(GPR_INFO, "LB: recv msg '%s'", request.DebugString().c_str());
|
||||
|
||||
std::vector<ResponseDelayPair> responses_and_delays;
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
responses_and_delays = responses_and_delays_;
|
||||
}
|
||||
|
||||
for (const auto& response_and_delay : responses_and_delays) {
|
||||
if (shutdown_) break;
|
||||
SendResponse(stream, response_and_delay.first, response_and_delay.second);
|
||||
}
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
void add_response(const LoadBalanceResponse& response, int send_after_ms) {
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
responses_and_delays_.push_back(std::make_pair(response, send_after_ms));
|
||||
}
|
||||
|
||||
void Shutdown() {
|
||||
std::unique_lock<std::mutex> lock(mu_);
|
||||
shutdown_ = true;
|
||||
}
|
||||
|
||||
static LoadBalanceResponse BuildResponseForBackends(
|
||||
const std::vector<int>& backend_ports) {
|
||||
LoadBalanceResponse response;
|
||||
for (const int backend_port : backend_ports) {
|
||||
auto* server = response.mutable_server_list()->add_servers();
|
||||
server->set_ip_address(Ip4ToPackedString("127.0.0.1"));
|
||||
server->set_port(backend_port);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
private:
|
||||
void SendResponse(Stream* stream, const LoadBalanceResponse& response,
|
||||
int delay_ms) {
|
||||
gpr_log(GPR_INFO, "LB: sleeping for %d ms...", delay_ms);
|
||||
gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
|
||||
gpr_time_from_millis(delay_ms, GPR_TIMESPAN)));
|
||||
gpr_log(GPR_INFO, "LB: Woke up! Sending response '%s'",
|
||||
response.DebugString().c_str());
|
||||
stream->Write(response);
|
||||
IncreaseResponseCount();
|
||||
}
|
||||
|
||||
std::vector<ResponseDelayPair> responses_and_delays_;
|
||||
bool shutdown_;
|
||||
};
|
||||
|
||||
class GrpclbEnd2endTest : public ::testing::Test {
|
||||
protected:
|
||||
GrpclbEnd2endTest(int num_backends, int num_balancers)
|
||||
: server_host_("localhost"),
|
||||
num_backends_(num_backends),
|
||||
num_balancers_(num_balancers) {}
|
||||
|
||||
void SetUp() override {
|
||||
response_generator_ = grpc_fake_resolver_response_generator_create();
|
||||
// Start the backends.
|
||||
for (size_t i = 0; i < num_backends_; ++i) {
|
||||
backends_.emplace_back(new BackendServiceImpl());
|
||||
backend_servers_.emplace_back(ServerThread<BackendService>(
|
||||
"backend", server_host_, backends_.back().get()));
|
||||
}
|
||||
// Start the load balancers.
|
||||
for (size_t i = 0; i < num_balancers_; ++i) {
|
||||
balancers_.emplace_back(new BalancerServiceImpl());
|
||||
balancer_servers_.emplace_back(ServerThread<BalancerService>(
|
||||
"balancer", server_host_, balancers_.back().get()));
|
||||
}
|
||||
ResetStub();
|
||||
std::vector<AddressData> addresses;
|
||||
for (size_t i = 0; i < balancer_servers_.size(); ++i) {
|
||||
addresses.emplace_back(AddressData{balancer_servers_[i].port_, true, ""});
|
||||
}
|
||||
SetNextResolution(addresses);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
for (size_t i = 0; i < backends_.size(); ++i) {
|
||||
backend_servers_[i].Shutdown();
|
||||
}
|
||||
for (size_t i = 0; i < balancers_.size(); ++i) {
|
||||
balancers_[i]->Shutdown();
|
||||
balancer_servers_[i].Shutdown();
|
||||
}
|
||||
grpc_fake_resolver_response_generator_unref(response_generator_);
|
||||
}
|
||||
|
||||
void ResetStub() {
|
||||
ChannelArguments args;
|
||||
args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
|
||||
response_generator_);
|
||||
std::ostringstream uri;
|
||||
uri << "test:///servername_not_used";
|
||||
channel_ =
|
||||
CreateCustomChannel(uri.str(), InsecureChannelCredentials(), args);
|
||||
stub_ = grpc::testing::EchoTestService::NewStub(channel_);
|
||||
}
|
||||
|
||||
struct AddressData {
|
||||
int port;
|
||||
bool is_balancer;
|
||||
grpc::string balancer_name;
|
||||
};
|
||||
|
||||
void SetNextResolution(const std::vector<AddressData>& address_data) {
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_lb_addresses* addresses =
|
||||
grpc_lb_addresses_create(address_data.size(), nullptr);
|
||||
for (size_t i = 0; i < address_data.size(); ++i) {
|
||||
char* lb_uri_str;
|
||||
gpr_asprintf(&lb_uri_str, "ipv4:127.0.0.1:%d", address_data[i].port);
|
||||
grpc_uri* lb_uri = grpc_uri_parse(&exec_ctx, lb_uri_str, true);
|
||||
GPR_ASSERT(lb_uri != nullptr);
|
||||
grpc_lb_addresses_set_address_from_uri(
|
||||
addresses, i, lb_uri, address_data[i].is_balancer,
|
||||
address_data[i].balancer_name.c_str(), nullptr);
|
||||
grpc_uri_destroy(lb_uri);
|
||||
gpr_free(lb_uri_str);
|
||||
}
|
||||
grpc_arg fake_addresses = grpc_lb_addresses_create_channel_arg(addresses);
|
||||
grpc_channel_args fake_result = {1, &fake_addresses};
|
||||
grpc_fake_resolver_response_generator_set_response(
|
||||
&exec_ctx, response_generator_, &fake_result);
|
||||
grpc_lb_addresses_destroy(&exec_ctx, addresses);
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
}
|
||||
|
||||
const std::vector<int> GetBackendPorts() const {
|
||||
std::vector<int> backend_ports;
|
||||
for (const auto& bs : backend_servers_) {
|
||||
backend_ports.push_back(bs.port_);
|
||||
}
|
||||
return backend_ports;
|
||||
}
|
||||
|
||||
void ScheduleResponseForBalancer(size_t i,
|
||||
const LoadBalanceResponse& response,
|
||||
int delay_ms) {
|
||||
balancers_.at(i)->add_response(response, delay_ms);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Status, EchoResponse>> SendRpc(const string& message,
|
||||
int num_rpcs,
|
||||
int timeout_ms = 1000) {
|
||||
std::vector<std::pair<Status, EchoResponse>> results;
|
||||
EchoRequest request;
|
||||
EchoResponse response;
|
||||
request.set_message(message);
|
||||
for (int i = 0; i < num_rpcs; i++) {
|
||||
ClientContext context;
|
||||
context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms));
|
||||
Status status = stub_->Echo(&context, request, &response);
|
||||
results.push_back(std::make_pair(status, response));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
struct ServerThread {
|
||||
explicit ServerThread(const grpc::string& type,
|
||||
const grpc::string& server_host, T* service)
|
||||
: type_(type), service_(service) {
|
||||
port_ = grpc_pick_unused_port_or_die();
|
||||
gpr_log(GPR_INFO, "starting %s server on port %d", type_.c_str(), port_);
|
||||
std::mutex mu;
|
||||
std::condition_variable cond;
|
||||
thread_.reset(new std::thread(
|
||||
std::bind(&ServerThread::Start, this, server_host, &mu, &cond)));
|
||||
std::unique_lock<std::mutex> lock(mu);
|
||||
cond.wait(lock);
|
||||
gpr_log(GPR_INFO, "%s server startup complete", type_.c_str());
|
||||
}
|
||||
|
||||
void Start(const grpc::string& server_host, std::mutex* mu,
|
||||
std::condition_variable* cond) {
|
||||
std::ostringstream server_address;
|
||||
server_address << server_host << ":" << port_;
|
||||
ServerBuilder builder;
|
||||
builder.AddListeningPort(server_address.str(),
|
||||
InsecureServerCredentials());
|
||||
builder.RegisterService(service_);
|
||||
server_ = builder.BuildAndStart();
|
||||
std::lock_guard<std::mutex> lock(*mu);
|
||||
cond->notify_one();
|
||||
}
|
||||
|
||||
void Shutdown() {
|
||||
gpr_log(GPR_INFO, "%s about to shutdown", type_.c_str());
|
||||
server_->Shutdown();
|
||||
thread_->join();
|
||||
gpr_log(GPR_INFO, "%s shutdown completed", type_.c_str());
|
||||
}
|
||||
|
||||
int port_;
|
||||
grpc::string type_;
|
||||
std::unique_ptr<Server> server_;
|
||||
T* service_;
|
||||
std::unique_ptr<std::thread> thread_;
|
||||
};
|
||||
|
||||
const grpc::string kMessage_ = "Live long and prosper.";
|
||||
const grpc::string server_host_;
|
||||
const size_t num_backends_;
|
||||
const size_t num_balancers_;
|
||||
std::shared_ptr<Channel> channel_;
|
||||
std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
|
||||
|
||||
std::vector<std::unique_ptr<BackendServiceImpl>> backends_;
|
||||
std::vector<std::unique_ptr<BalancerServiceImpl>> balancers_;
|
||||
|
||||
std::vector<ServerThread<BackendService>> backend_servers_;
|
||||
std::vector<ServerThread<BalancerService>> balancer_servers_;
|
||||
|
||||
grpc_fake_resolver_response_generator* response_generator_;
|
||||
};
|
||||
|
||||
class SingleBalancerTest : public GrpclbEnd2endTest {
|
||||
public:
|
||||
SingleBalancerTest() : GrpclbEnd2endTest(4, 1) {}
|
||||
};
|
||||
|
||||
TEST_F(SingleBalancerTest, Vanilla) {
|
||||
ScheduleResponseForBalancer(
|
||||
0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts()), 0);
|
||||
// Start servers and send 100 RPCs per server.
|
||||
const auto& statuses_and_responses = SendRpc(kMessage_, 100 * num_backends_);
|
||||
|
||||
for (const auto& status_and_response : statuses_and_responses) {
|
||||
EXPECT_TRUE(status_and_response.first.ok());
|
||||
EXPECT_EQ(status_and_response.second.message(), kMessage_);
|
||||
}
|
||||
|
||||
// Each backend should have gotten 100 requests.
|
||||
for (size_t i = 0; i < backends_.size(); ++i) {
|
||||
EXPECT_EQ(100, backend_servers_[i].service_->request_count());
|
||||
}
|
||||
// The balancer got a single request.
|
||||
EXPECT_EQ(1, balancer_servers_[0].service_->request_count());
|
||||
// and sent a single response.
|
||||
EXPECT_EQ(1, balancer_servers_[0].service_->response_count());
|
||||
|
||||
// Check LB policy name for the channel.
|
||||
EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
|
||||
}
|
||||
|
||||
TEST_F(SingleBalancerTest, InitiallyEmptyServerlist) {
|
||||
const int kServerlistDelayMs = 500 * grpc_test_slowdown_factor();
|
||||
const int kCallDeadlineMs = 1000 * grpc_test_slowdown_factor();
|
||||
|
||||
// First response is an empty serverlist, sent right away.
|
||||
ScheduleResponseForBalancer(0, LoadBalanceResponse(), 0);
|
||||
// Send non-empty serverlist only after kServerlistDelayMs
|
||||
ScheduleResponseForBalancer(
|
||||
0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts()),
|
||||
kServerlistDelayMs);
|
||||
|
||||
const auto t0 = system_clock::now();
|
||||
// Client will block: LB will initially send empty serverlist.
|
||||
const auto& statuses_and_responses =
|
||||
SendRpc(kMessage_, num_backends_, kCallDeadlineMs);
|
||||
const auto ellapsed_ms =
|
||||
std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
system_clock::now() - t0);
|
||||
// but eventually, the LB sends a serverlist update that allows the call to
|
||||
// proceed. The call delay must be larger than the delay in sending the
|
||||
// populated serverlist but under the call's deadline.
|
||||
EXPECT_GT(ellapsed_ms.count(), kServerlistDelayMs);
|
||||
EXPECT_LT(ellapsed_ms.count(), kCallDeadlineMs);
|
||||
|
||||
// Each backend should have gotten 1 request.
|
||||
for (size_t i = 0; i < backends_.size(); ++i) {
|
||||
EXPECT_EQ(1, backend_servers_[i].service_->request_count());
|
||||
}
|
||||
for (const auto& status_and_response : statuses_and_responses) {
|
||||
EXPECT_TRUE(status_and_response.first.ok());
|
||||
EXPECT_EQ(status_and_response.second.message(), kMessage_);
|
||||
}
|
||||
|
||||
// The balancer got a single request.
|
||||
EXPECT_EQ(1, balancer_servers_[0].service_->request_count());
|
||||
// and sent two responses.
|
||||
EXPECT_EQ(2, balancer_servers_[0].service_->response_count());
|
||||
|
||||
// Check LB policy name for the channel.
|
||||
EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
|
||||
}
|
||||
|
||||
TEST_F(SingleBalancerTest, RepeatedServerlist) {
|
||||
constexpr int kServerlistDelayMs = 100;
|
||||
|
||||
// Send a serverlist right away.
|
||||
ScheduleResponseForBalancer(
|
||||
0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts()), 0);
|
||||
// ... and the same one a bit later.
|
||||
ScheduleResponseForBalancer(
|
||||
0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts()),
|
||||
kServerlistDelayMs);
|
||||
|
||||
// Send num_backends/2 requests.
|
||||
auto statuses_and_responses = SendRpc(kMessage_, num_backends_ / 2);
|
||||
// only the first half of the backends will receive them.
|
||||
for (size_t i = 0; i < backends_.size(); ++i) {
|
||||
if (i < backends_.size() / 2)
|
||||
EXPECT_EQ(1, backend_servers_[i].service_->request_count());
|
||||
else
|
||||
EXPECT_EQ(0, backend_servers_[i].service_->request_count());
|
||||
}
|
||||
EXPECT_EQ(statuses_and_responses.size(), num_backends_ / 2);
|
||||
for (const auto& status_and_response : statuses_and_responses) {
|
||||
EXPECT_TRUE(status_and_response.first.ok());
|
||||
EXPECT_EQ(status_and_response.second.message(), kMessage_);
|
||||
}
|
||||
|
||||
// Wait for the (duplicated) serverlist update.
|
||||
gpr_sleep_until(gpr_time_add(
|
||||
gpr_now(GPR_CLOCK_REALTIME),
|
||||
gpr_time_from_millis(kServerlistDelayMs * 1.1, GPR_TIMESPAN)));
|
||||
|
||||
// Verify the LB has sent two responses.
|
||||
EXPECT_EQ(2, balancer_servers_[0].service_->response_count());
|
||||
|
||||
// Some more calls to complete the total number of backends.
|
||||
statuses_and_responses = SendRpc(
|
||||
kMessage_,
|
||||
num_backends_ / 2 + (num_backends_ & 0x1) /* extra one if num_bes odd */);
|
||||
// Because a duplicated serverlist should have no effect, all backends must
|
||||
// have been hit once now.
|
||||
for (size_t i = 0; i < backends_.size(); ++i) {
|
||||
EXPECT_EQ(1, backend_servers_[i].service_->request_count());
|
||||
}
|
||||
EXPECT_EQ(statuses_and_responses.size(), num_backends_ / 2);
|
||||
for (const auto& status_and_response : statuses_and_responses) {
|
||||
EXPECT_TRUE(status_and_response.first.ok());
|
||||
EXPECT_EQ(status_and_response.second.message(), kMessage_);
|
||||
}
|
||||
|
||||
// The balancer got a single request.
|
||||
EXPECT_EQ(1, balancer_servers_[0].service_->request_count());
|
||||
// Check LB policy name for the channel.
|
||||
EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace testing
|
||||
} // namespace grpc
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
grpc_init();
|
||||
grpc_test_init(argc, argv);
|
||||
grpc_fake_resolver_init();
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
const auto result = RUN_ALL_TESTS();
|
||||
grpc_shutdown();
|
||||
return result;
|
||||
}
|
||||
|
|
@ -118,7 +118,7 @@ void ThreadManagerTest::PerformTest() {
|
|||
|
||||
// The number of times DoWork() was called is equal to the number of times
|
||||
// WORK_FOUND was returned
|
||||
gpr_log(GPR_DEBUG, "DoWork() called %ld times",
|
||||
gpr_log(GPR_DEBUG, "DoWork() called %" PRIdPTR " times",
|
||||
gpr_atm_no_barrier_load(&num_do_work_));
|
||||
GPR_ASSERT(gpr_atm_no_barrier_load(&num_do_work_) ==
|
||||
gpr_atm_no_barrier_load(&num_work_found_));
|
||||
|
|
|
|||
|
|
@ -37,4 +37,4 @@ git submodule update --init
|
|||
|
||||
# download docker images from dockerhub
|
||||
export DOCKERHUB_ORGANIZATION=grpctesting
|
||||
tools/run_tests/run_tests_matrix.py -f portability linux
|
||||
tools/run_tests/run_tests_matrix.py -f portability linux --internal_ci
|
||||
|
|
|
|||
|
|
@ -37,4 +37,4 @@ git submodule update --init
|
|||
|
||||
# download docker images from dockerhub
|
||||
export DOCKERHUB_ORGANIZATION=grpctesting
|
||||
tools/run_tests/run_tests_matrix.py -f portability linux --build_only
|
||||
tools/run_tests/run_tests_matrix.py -f portability linux --internal_ci --build_only
|
||||
|
|
|
|||
|
|
@ -39,4 +39,4 @@ git clone /var/local/jenkins/grpc /var/local/git/grpc
|
|||
&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
|
||||
${name}')
|
||||
cd /var/local/git/grpc
|
||||
bazel build --spawn_strategy=standalone --genrule_strategy=standalone :all test/... examples/cpp/...
|
||||
bazel build --spawn_strategy=standalone --genrule_strategy=standalone :all test/... examples/...
|
||||
|
|
|
|||
|
|
@ -3292,6 +3292,29 @@
|
|||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr",
|
||||
"gpr_test_util",
|
||||
"grpc",
|
||||
"grpc++",
|
||||
"grpc++_test_util",
|
||||
"grpc_test_util"
|
||||
],
|
||||
"headers": [
|
||||
"src/proto/grpc/lb/v1/load_balancer.grpc.pb.h",
|
||||
"src/proto/grpc/lb/v1/load_balancer.pb.h",
|
||||
"src/proto/grpc/lb/v1/load_balancer_mock.grpc.pb.h"
|
||||
],
|
||||
"is_filegroup": false,
|
||||
"language": "c++",
|
||||
"name": "grpclb_end2end_test",
|
||||
"src": [
|
||||
"test/cpp/end2end/grpclb_end2end_test.cc"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr",
|
||||
|
|
@ -6043,8 +6066,7 @@
|
|||
"grpc++_codegen_base_src",
|
||||
"grpc++_codegen_proto",
|
||||
"grpc++_config_proto",
|
||||
"grpc_test_util",
|
||||
"thrift_util"
|
||||
"grpc_test_util"
|
||||
],
|
||||
"headers": [
|
||||
"src/proto/grpc/health/v1/health.grpc.pb.h",
|
||||
|
|
@ -9149,23 +9171,5 @@
|
|||
],
|
||||
"third_party": false,
|
||||
"type": "filegroup"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"grpc++_codegen_base"
|
||||
],
|
||||
"headers": [
|
||||
"include/grpc++/impl/codegen/thrift_serializer.h",
|
||||
"include/grpc++/impl/codegen/thrift_utils.h"
|
||||
],
|
||||
"is_filegroup": true,
|
||||
"language": "c++",
|
||||
"name": "thrift_util",
|
||||
"src": [
|
||||
"include/grpc++/impl/codegen/thrift_serializer.h",
|
||||
"include/grpc++/impl/codegen/thrift_utils.h"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "filegroup"
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -3417,6 +3417,28 @@
|
|||
"windows"
|
||||
]
|
||||
},
|
||||
{
|
||||
"args": [],
|
||||
"ci_platforms": [
|
||||
"linux",
|
||||
"mac",
|
||||
"posix",
|
||||
"windows"
|
||||
],
|
||||
"cpu_cost": 1.0,
|
||||
"exclude_configs": [],
|
||||
"exclude_iomgrs": [],
|
||||
"flaky": false,
|
||||
"gtest": true,
|
||||
"language": "c++",
|
||||
"name": "grpclb_end2end_test",
|
||||
"platforms": [
|
||||
"linux",
|
||||
"mac",
|
||||
"posix",
|
||||
"windows"
|
||||
]
|
||||
},
|
||||
{
|
||||
"args": [],
|
||||
"ci_platforms": [
|
||||
|
|
|
|||
|
|
@ -77,6 +77,10 @@ def render_junit_xml_report(resultset, xml_report, suite_package='grpc',
|
|||
ET.SubElement(xml_test, 'error', message='Timeout')
|
||||
elif result.state == 'SKIPPED':
|
||||
ET.SubElement(xml_test, 'skipped', message='Skipped')
|
||||
# ensure the report directory exists
|
||||
report_dir = os.path.dirname(os.path.abspath(xml_report))
|
||||
if not os.path.exists(report_dir):
|
||||
os.makedirs(report_dir)
|
||||
tree = ET.ElementTree(root)
|
||||
tree.write(xml_report, encoding='UTF-8')
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,16 @@ _DEFAULT_INNER_JOBS = 2
|
|||
_REPORT_SUFFIX = 'sponge_log.xml'
|
||||
|
||||
|
||||
def _report_filename(name):
|
||||
"""Generates report file name"""
|
||||
return 'report_%s_%s' % (name, _REPORT_SUFFIX)
|
||||
|
||||
|
||||
def _report_filename_internal_ci(name):
|
||||
"""Generates report file name that leads to better presentation by internal CI"""
|
||||
return '%s/%s' % (name, _REPORT_SUFFIX)
|
||||
|
||||
|
||||
def _docker_jobspec(name, runtests_args=[], runtests_envs={},
|
||||
inner_jobs=_DEFAULT_INNER_JOBS):
|
||||
"""Run a single instance of run_tests.py in a docker container"""
|
||||
|
|
@ -63,7 +73,7 @@ def _docker_jobspec(name, runtests_args=[], runtests_envs={},
|
|||
'--use_docker',
|
||||
'-t',
|
||||
'-j', str(inner_jobs),
|
||||
'-x', 'report_%s_%s' % (name, _REPORT_SUFFIX),
|
||||
'-x', _report_filename(name),
|
||||
'--report_suite_name', '%s' % name] + runtests_args,
|
||||
environ=runtests_envs,
|
||||
shortname='run_tests_%s' % name,
|
||||
|
|
@ -83,7 +93,7 @@ def _workspace_jobspec(name, runtests_args=[], workspace_name=None,
|
|||
'tools/run_tests/helper_scripts/run_tests_in_workspace.sh',
|
||||
'-t',
|
||||
'-j', str(inner_jobs),
|
||||
'-x', '../report_%s_%s' % (name, _REPORT_SUFFIX),
|
||||
'-x', '../%s' % _report_filename(name),
|
||||
'--report_suite_name', '%s' % name] + runtests_args,
|
||||
environ=env,
|
||||
shortname='run_tests_%s' % name,
|
||||
|
|
@ -380,8 +390,17 @@ if __name__ == "__main__":
|
|||
argp.add_argument('--max_time', default=-1, type=int,
|
||||
help='Maximum amount of time to run tests for' +
|
||||
'(other tests will be skipped)')
|
||||
argp.add_argument('--internal_ci',
|
||||
default=False,
|
||||
action='store_const',
|
||||
const=True,
|
||||
help='Put reports into subdirectories to improve presentation of '
|
||||
'results by Internal CI.')
|
||||
args = argp.parse_args()
|
||||
|
||||
if args.internal_ci:
|
||||
_report_filename = _report_filename_internal_ci # override the function
|
||||
|
||||
extra_args = []
|
||||
if args.build_only:
|
||||
extra_args.append('--build_only')
|
||||
|
|
@ -450,7 +469,7 @@ if __name__ == "__main__":
|
|||
ignored_num_skipped_failures, skipped_results = jobset.run(
|
||||
skipped_jobs, skip_jobs=True)
|
||||
resultset.update(skipped_results)
|
||||
report_utils.render_junit_xml_report(resultset, 'report_%s' % _REPORT_SUFFIX,
|
||||
report_utils.render_junit_xml_report(resultset, _report_filename('aggregate_tests'),
|
||||
suite_name='aggregate_tests')
|
||||
|
||||
if num_failures == 0:
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@ cat << EOF | awk '{ print $1 }' | sort > $want_submodules
|
|||
30dbc81fb5ffdc98ea9b14b1918bfe4e8779b26e third_party/gflags (v2.2.0)
|
||||
ec44c6c1675c25b9827aacd08c02433cccde7780 third_party/googletest (release-1.8.0)
|
||||
593e917c176b5bc5aafa57bf9f6030d749d91cd5 third_party/protobuf (v3.1.0-alpha-1-326-g593e917)
|
||||
bcad91771b7f0bff28a1cac1981d7ef2b9bcef3c third_party/thrift (bcad917)
|
||||
cacf7f1d4e3d44d871b605da3b647f07d718623f third_party/zlib (v1.2.11)
|
||||
7691f773af79bf75a62d1863fd0f13ebf9dc51b1 third_party/cares/cares (1.12.0)
|
||||
EOF
|
||||
|
|
|
|||
|
|
@ -197,8 +197,6 @@
|
|||
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_windows.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\proto_utils.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\config_protobuf.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\thrift_serializer.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\thrift_utils.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="$(SolutionDir)\..\test\cpp\end2end\test_service_impl.h" />
|
||||
|
|
|
|||
|
|
@ -186,12 +186,6 @@
|
|||
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\config_protobuf.h">
|
||||
<Filter>include\grpc++\impl\codegen</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\thrift_serializer.h">
|
||||
<Filter>include\grpc++\impl\codegen</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\thrift_utils.h">
|
||||
<Filter>include\grpc++\impl\codegen</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="$(SolutionDir)\..\test\cpp\end2end\test_service_impl.h">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,215 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\1.0.204.1.props')" />
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{15BCAA4C-F569-D5B8-50CF-F442CBC71902}</ProjectGuid>
|
||||
<IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
|
||||
<IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(VisualStudioVersion)' == '10.0'" Label="Configuration">
|
||||
<PlatformToolset>v100</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(VisualStudioVersion)' == '11.0'" Label="Configuration">
|
||||
<PlatformToolset>v110</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'" Label="Configuration">
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'" Label="Configuration">
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\cpptest.props" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\global.props" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\openssl.props" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\protobuf.props" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\winsock.props" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\zlib.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<TargetName>grpclb_end2end_test</TargetName>
|
||||
<Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
|
||||
<Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
|
||||
<Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
|
||||
<Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
||||
<TargetName>grpclb_end2end_test</TargetName>
|
||||
<Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
|
||||
<Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
|
||||
<Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
|
||||
<Configuration-grpc_dependencies_openssl>Release</Configuration-grpc_dependencies_openssl>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<TreatWarningAsError>true</TreatWarningAsError>
|
||||
<DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
|
||||
<MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
|
||||
<GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<TreatWarningAsError>true</TreatWarningAsError>
|
||||
<DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
|
||||
<MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
|
||||
<GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<TreatWarningAsError>true</TreatWarningAsError>
|
||||
<DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
|
||||
<MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
|
||||
<GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<TreatWarningAsError>true</TreatWarningAsError>
|
||||
<DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
|
||||
<MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
|
||||
<GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.pb.cc">
|
||||
</ClCompile>
|
||||
<ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.pb.h">
|
||||
</ClInclude>
|
||||
<ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.grpc.pb.cc">
|
||||
</ClCompile>
|
||||
<ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.grpc.pb.h">
|
||||
</ClInclude>
|
||||
<ClCompile Include="$(SolutionDir)\..\test\cpp\end2end\grpclb_end2end_test.cc">
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc++_test_util\grpc++_test_util.vcxproj">
|
||||
<Project>{0BE77741-552A-929B-A497-4EF7ECE17A64}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_test_util\grpc_test_util.vcxproj">
|
||||
<Project>{17BCAFC0-5FDC-4C94-AEB9-95F3E220614B}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc++\grpc++.vcxproj">
|
||||
<Project>{C187A093-A0FE-489D-A40A-6E33DE0F9FEB}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc\grpc.vcxproj">
|
||||
<Project>{29D16885-7228-4C31-81ED-5F9187C7F2A9}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr_test_util\gpr_test_util.vcxproj">
|
||||
<Project>{EAB0A629-17A9-44DB-B5FF-E91A721FE037}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
|
||||
<Project>{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
|
||||
<Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
|
||||
</ImportGroup>
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" />
|
||||
<Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" />
|
||||
<Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" />
|
||||
<Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" />
|
||||
<Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.proto">
|
||||
<Filter>src\proto\grpc\lb\v1</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(SolutionDir)\..\test\cpp\end2end\grpclb_end2end_test.cc">
|
||||
<Filter>test\cpp\end2end</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Filter Include="src">
|
||||
<UniqueIdentifier>{5ffc769b-475b-67a1-b131-2af6f6103043}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\proto">
|
||||
<UniqueIdentifier>{165c6d96-aac0-d0b0-a1b4-9470159d683e}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\proto\grpc">
|
||||
<UniqueIdentifier>{0b3a7ccc-ea48-092f-75f1-866995a4ed04}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\proto\grpc\lb">
|
||||
<UniqueIdentifier>{8f4e5440-acec-c6e3-4a3d-c8ff6ed84e11}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\proto\grpc\lb\v1">
|
||||
<UniqueIdentifier>{191ccb8f-33fe-b990-20c1-87c04d15a7c2}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="test">
|
||||
<UniqueIdentifier>{f501dace-533d-819c-ca99-9e0359bb67ef}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="test\cpp">
|
||||
<UniqueIdentifier>{fcbf6f3b-2707-4605-d76e-f32b545c6531}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="test\cpp\end2end">
|
||||
<UniqueIdentifier>{f70e20f4-442c-b400-758d-f13abf182438}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
Loading…
Reference in New Issue