Re-org v3 related files to make it a submodule.
This commit is contained in:
parent
4e9d17c188
commit
72b215a513
|
|
@ -13,23 +13,22 @@ find_package(Boost REQUIRED COMPONENTS system thread locale random)
|
||||||
find_package(OpenSSL REQUIRED)
|
find_package(OpenSSL REQUIRED)
|
||||||
find_package(Protobuf REQUIRED)
|
find_package(Protobuf REQUIRED)
|
||||||
|
|
||||||
set(GRPC_LIBRARY_PATH /usr/lib
|
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindGRPC.cmake)
|
||||||
/usr/lib64
|
set(GRPC_LIBRARIES ${GPR_LIBRARY} ${GRPC_LIBRARY} ${GRPC_GRPC++_LIBRARY})
|
||||||
/usr/local/lib
|
|
||||||
/usr/local/lib64
|
|
||||||
/usr/local/opt/grpc)
|
|
||||||
find_library(GPR_LIBRARY NAMES gpr PATHS ${GRPC_LIBRARY_PATH})
|
|
||||||
find_library(GRPC_LIBRARY NAMES grpc PATHS ${GRPC_LIBRARY_PATH})
|
|
||||||
find_library(GRPC++_LIBRARY NAMES grpc++ PATHS ${GRPC_LIBRARY_PATH})
|
|
||||||
set(GRPC_LIBRARIES ${GPR_LIBRARY} ${GRPC_LIBRARY} ${GRPC++_LIBRARY})
|
|
||||||
|
|
||||||
file(GLOB_RECURSE PROTO_SRC RELATIVE "${CMAKE_SOURCE_DIR}/proto" "proto/*.proto")
|
file(GLOB_RECURSE PROTO_SRC RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/proto" "proto/*.proto")
|
||||||
|
|
||||||
add_custom_target(proto-gen
|
# Generate protobuf definitions
|
||||||
COMMAND protoc -I . --cpp_out=. ${PROTO_SRC}
|
execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE}
|
||||||
COMMAND protoc -I . --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` ./rpc.proto ./v3lock.proto
|
-I ${CMAKE_CURRENT_SOURCE_DIR}/proto
|
||||||
COMMENT "Generate protobuf stuffs"
|
--cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/proto
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/proto)
|
${PROTO_SRC})
|
||||||
|
execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE}
|
||||||
|
-I ${CMAKE_CURRENT_SOURCE_DIR}/proto
|
||||||
|
--grpc_out=${CMAKE_CURRENT_SOURCE_DIR}/proto
|
||||||
|
--plugin=protoc-gen-grpc=${GRPC_CPP_PLUGIN}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/proto/rpc.proto
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/proto/v3lock.proto)
|
||||||
|
|
||||||
enable_testing()
|
enable_testing()
|
||||||
include_directories(SYSTEM ${CPPREST_INCLUDE_DIR}
|
include_directories(SYSTEM ${CPPREST_INCLUDE_DIR}
|
||||||
|
|
@ -40,4 +39,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Werror -Wno-string-compare -std=c++11")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Werror -Wno-string-compare -std=c++11")
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if (BUILD_TESTS)
|
||||||
add_subdirectory(tst)
|
add_subdirectory(tst)
|
||||||
|
endif ()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,143 @@
|
||||||
|
# This file is taken from
|
||||||
|
#
|
||||||
|
# https://github.com/IvanSafonov/grpc-cmake-example
|
||||||
|
#
|
||||||
|
# The original repository is open-sourced with the MIT license.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Locate and configure the gRPC library
|
||||||
|
#
|
||||||
|
# Adds the following targets:
|
||||||
|
#
|
||||||
|
# gRPC::gpr - GPR library
|
||||||
|
# gRPC::grpc - gRPC library
|
||||||
|
# gRPC::grpc++ - gRPC C++ library
|
||||||
|
# gRPC::grpc++_reflection - gRPC C++ reflection library
|
||||||
|
# gRPC::grpc_cpp_plugin - C++ generator plugin for Protocol Buffers
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generates C++ sources from the .proto files
|
||||||
|
#
|
||||||
|
# grpc_generate_cpp (<SRCS> <HDRS> <DEST> [<ARGN>...])
|
||||||
|
#
|
||||||
|
# SRCS - variable to define with autogenerated source files
|
||||||
|
# HDRS - variable to define with autogenerated header files
|
||||||
|
# DEST - directory where the source files will be created
|
||||||
|
# ARGN - .proto files
|
||||||
|
#
|
||||||
|
function(GRPC_GENERATE_CPP SRCS HDRS DEST)
|
||||||
|
if(NOT ARGN)
|
||||||
|
message(SEND_ERROR "Error: GRPC_GENERATE_CPP() called without any proto files")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GRPC_GENERATE_CPP_APPEND_PATH)
|
||||||
|
# Create an include path for each file specified
|
||||||
|
foreach(FIL ${ARGN})
|
||||||
|
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
|
||||||
|
get_filename_component(ABS_PATH ${ABS_FIL} PATH)
|
||||||
|
list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
|
||||||
|
if(${_contains_already} EQUAL -1)
|
||||||
|
list(APPEND _protobuf_include_path -I ${ABS_PATH})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
else()
|
||||||
|
set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(DEFINED PROTOBUF_IMPORT_DIRS)
|
||||||
|
foreach(DIR ${PROTOBUF_IMPORT_DIRS})
|
||||||
|
get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
|
||||||
|
list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
|
||||||
|
if(${_contains_already} EQUAL -1)
|
||||||
|
list(APPEND _protobuf_include_path -I ${ABS_PATH})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${SRCS})
|
||||||
|
set(${HDRS})
|
||||||
|
foreach(FIL ${ARGN})
|
||||||
|
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
|
||||||
|
get_filename_component(FIL_WE ${FIL} NAME_WE)
|
||||||
|
|
||||||
|
list(APPEND ${SRCS} "${DEST}/${FIL_WE}.grpc.pb.cc")
|
||||||
|
list(APPEND ${HDRS} "${DEST}/${FIL_WE}.grpc.pb.h")
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${DEST}/${FIL_WE}.grpc.pb.cc"
|
||||||
|
"${DEST}/${FIL_WE}.grpc.pb.h"
|
||||||
|
COMMAND protobuf::protoc
|
||||||
|
ARGS --grpc_out ${DEST} ${_protobuf_include_path} --plugin=protoc-gen-grpc=${GRPC_CPP_PLUGIN} ${ABS_FIL}
|
||||||
|
DEPENDS ${ABS_FIL} protobuf::protoc gRPC::grpc_cpp_plugin
|
||||||
|
COMMENT "Running C++ gRPC compiler on ${FIL}"
|
||||||
|
VERBATIM )
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
|
||||||
|
set(${SRCS} ${${SRCS}} PARENT_SCOPE)
|
||||||
|
set(${HDRS} ${${HDRS}} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# By default have GRPC_GENERATE_CPP macro pass -I to protoc
|
||||||
|
# for each directory where a proto file is referenced.
|
||||||
|
if(NOT DEFINED GRPC_GENERATE_CPP_APPEND_PATH)
|
||||||
|
set(GRPC_GENERATE_CPP_APPEND_PATH TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Find gRPC include directory
|
||||||
|
find_path(GRPC_INCLUDE_DIR grpc/grpc.h)
|
||||||
|
mark_as_advanced(GRPC_INCLUDE_DIR)
|
||||||
|
|
||||||
|
# Find gGPR library
|
||||||
|
find_library(GPR_LIBRARY NAMES gpr)
|
||||||
|
mark_as_advanced(GRPC_GPR_LIBRARY)
|
||||||
|
add_library(gRPC::gpr UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(gRPC::gpr PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES ${GRPC_INCLUDE_DIR}
|
||||||
|
INTERFACE_LINK_LIBRARIES "-lpthread;-ldl"
|
||||||
|
IMPORTED_LOCATION ${GPR_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Find gRPC library
|
||||||
|
find_library(GRPC_LIBRARY NAMES grpc)
|
||||||
|
mark_as_advanced(GRPC_LIBRARY)
|
||||||
|
add_library(gRPC::grpc UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(gRPC::grpc PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES ${GRPC_INCLUDE_DIR}
|
||||||
|
INTERFACE_LINK_LIBRARIES gRPC::gpr
|
||||||
|
IMPORTED_LOCATION ${GRPC_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Find gRPC C++ library
|
||||||
|
find_library(GRPC_GRPC++_LIBRARY NAMES grpc++)
|
||||||
|
mark_as_advanced(GRPC_GRPC++_LIBRARY)
|
||||||
|
add_library(gRPC::grpc++ UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(gRPC::grpc++ PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES ${GRPC_INCLUDE_DIR}
|
||||||
|
INTERFACE_LINK_LIBRARIES gRPC::grpc
|
||||||
|
IMPORTED_LOCATION ${GRPC_GRPC++_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Find gRPC C++ reflection library
|
||||||
|
find_library(GRPC_GRPC++_REFLECTION_LIBRARY NAMES grpc++_reflection)
|
||||||
|
mark_as_advanced(GRPC_GRPC++_REFLECTION_LIBRARY)
|
||||||
|
add_library(gRPC::grpc++_reflection UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(gRPC::grpc++_reflection PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES ${GRPC_INCLUDE_DIR}
|
||||||
|
INTERFACE_LINK_LIBRARIES gRPC::grpc++
|
||||||
|
IMPORTED_LOCATION ${GRPC_GRPC++_REFLECTION_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Find gRPC CPP generator
|
||||||
|
find_program(GRPC_CPP_PLUGIN NAMES grpc_cpp_plugin)
|
||||||
|
mark_as_advanced(GRPC_CPP_PLUGIN)
|
||||||
|
add_executable(gRPC::grpc_cpp_plugin IMPORTED)
|
||||||
|
set_target_properties(gRPC::grpc_cpp_plugin PROPERTIES
|
||||||
|
IMPORTED_LOCATION ${GRPC_CPP_PLUGIN}
|
||||||
|
)
|
||||||
|
|
||||||
|
include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(gRPC DEFAULT_MSG
|
||||||
|
GPR_LIBRARY GRPC_LIBRARY GRPC_INCLUDE_DIR GRPC_GRPC++_REFLECTION_LIBRARY GRPC_CPP_PLUGIN)
|
||||||
|
|
@ -29,9 +29,11 @@ namespace etcd
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Constructs an etcd client object.
|
* Constructs an etcd client object.
|
||||||
* @param etcd_url is the url of the etcd server to connect to, like "http://127.0.0.1:4001"
|
* @param etcd_url is the url of the etcd server to connect to, like "http://127.0.0.1:4001",
|
||||||
|
* or multiple url, seperated by ',' or ';'.
|
||||||
|
* @param load_balancer is the load balance strategy, can be one of round_robin/pick_first/grpclb/xds.
|
||||||
*/
|
*/
|
||||||
Client(std::string const & etcd_url);
|
Client(std::string const & etcd_url, std::string const & load_balancer = "round_robin");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a get request to the etcd server
|
* Sends a get request to the etcd server
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,9 @@ namespace etcd
|
||||||
|
|
||||||
auto v3resp = call->ParseResponse();
|
auto v3resp = call->ParseResponse();
|
||||||
|
|
||||||
resp = etcd::Response(v3resp);
|
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
|
||||||
|
std::chrono::high_resolution_clock::now() - call->startTimepoint());
|
||||||
|
resp = etcd::Response(v3resp, duration);
|
||||||
|
|
||||||
return resp;
|
return resp;
|
||||||
});
|
});
|
||||||
|
|
@ -109,8 +111,13 @@ namespace etcd
|
||||||
*/
|
*/
|
||||||
std::vector<mvccpb::Event> const & events() const;
|
std::vector<mvccpb::Event> const & events() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the duration of request execution in microseconds.
|
||||||
|
*/
|
||||||
|
std::chrono::microseconds const & duration() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Response(const etcdv3::V3Response& response);
|
Response(const etcdv3::V3Response& response, std::chrono::microseconds const& duration);
|
||||||
Response(int error_code, char const * error_message);
|
Response(int error_code, char const * error_message);
|
||||||
|
|
||||||
int _error_code;
|
int _error_code;
|
||||||
|
|
@ -123,6 +130,7 @@ namespace etcd
|
||||||
Keys _keys;
|
Keys _keys;
|
||||||
std::string _lock_key; // for lock
|
std::string _lock_key; // for lock
|
||||||
std::vector<mvccpb::Event> _events; // for watch
|
std::vector<mvccpb::Event> _events; // for watch
|
||||||
|
std::chrono::microseconds _duration; // execute duration (in microseconds), during the action created and response parsed
|
||||||
friend class SyncClient;
|
friend class SyncClient;
|
||||||
friend class etcdv3::AsyncWatchAction;
|
friend class etcdv3::AsyncWatchAction;
|
||||||
friend class Client;
|
friend class Client;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef __V3_ACTION_HPP__
|
#ifndef __V3_ACTION_HPP__
|
||||||
#define __V3_ACTION_HPP__
|
#define __V3_ACTION_HPP__
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "proto/v3lock.grpc.pb.h"
|
#include "proto/v3lock.grpc.pb.h"
|
||||||
|
|
@ -45,12 +47,13 @@ namespace etcdv3
|
||||||
Action(etcdv3::ActionParameters params);
|
Action(etcdv3::ActionParameters params);
|
||||||
Action(){};
|
Action(){};
|
||||||
void waitForResponse();
|
void waitForResponse();
|
||||||
|
const std::chrono::high_resolution_clock::time_point startTimepoint();
|
||||||
protected:
|
protected:
|
||||||
Status status;
|
Status status;
|
||||||
ClientContext context;
|
ClientContext context;
|
||||||
CompletionQueue cq_;
|
CompletionQueue cq_;
|
||||||
etcdv3::ActionParameters parameters;
|
etcdv3::ActionParameters parameters;
|
||||||
|
std::chrono::high_resolution_clock::time_point start_timepoint;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncTxnResponse.hpp"
|
#include "etcd/v3/AsyncTxnResponse.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncTxnResponse.hpp"
|
#include "etcd/v3/AsyncTxnResponse.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncDeleteRangeResponse.hpp"
|
#include "etcd/v3/AsyncDeleteRangeResponse.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/V3Response.hpp"
|
#include "etcd/v3/V3Response.hpp"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncRangeResponse.hpp"
|
#include "etcd/v3/AsyncRangeResponse.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncLeaseGrantResponse.hpp"
|
#include "etcd/v3/AsyncLeaseGrantResponse.hpp"
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
using etcdserverpb::LeaseGrantResponse;
|
using etcdserverpb::LeaseGrantResponse;
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/V3Response.hpp"
|
#include "etcd/v3/V3Response.hpp"
|
||||||
|
|
||||||
|
|
||||||
using etcdserverpb::LeaseGrantResponse;
|
using etcdserverpb::LeaseGrantResponse;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/v3lock.grpc.pb.h"
|
#include "proto/v3lock.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncLockResponse.hpp"
|
#include "etcd/v3/AsyncLockResponse.hpp"
|
||||||
#include "etcd/Response.hpp"
|
#include "etcd/Response.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/v3lock.grpc.pb.h"
|
#include "proto/v3lock.grpc.pb.h"
|
||||||
#include "v3/include/V3Response.hpp"
|
#include "etcd/v3/V3Response.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/V3Response.hpp"
|
#include "etcd/v3/V3Response.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncTxnResponse.hpp"
|
#include "etcd/v3/AsyncTxnResponse.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncTxnResponse.hpp"
|
#include "etcd/v3/AsyncTxnResponse.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef __ASYNC_TXNRESPONSE_HPP__
|
#ifndef __ASYNC_TXNRESPONSE_HPP__
|
||||||
#define __ASYNC_TXNRESPONSE_HPP__
|
#define __ASYNC_TXNRESPONSE_HPP__
|
||||||
|
|
||||||
#include "v3/include/V3Response.hpp"
|
|
||||||
#include "proto/rpc.pb.h"
|
#include "proto/rpc.pb.h"
|
||||||
|
#include "etcd/v3/V3Response.hpp"
|
||||||
|
|
||||||
using etcdserverpb::TxnResponse;
|
using etcdserverpb::TxnResponse;
|
||||||
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncTxnResponse.hpp"
|
#include "etcd/v3/AsyncTxnResponse.hpp"
|
||||||
|
|
||||||
|
|
||||||
using grpc::ClientAsyncResponseReader;
|
using grpc::ClientAsyncResponseReader;
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncWatchResponse.hpp"
|
#include "etcd/v3/AsyncWatchResponse.hpp"
|
||||||
#include "etcd/Response.hpp"
|
#include "etcd/Response.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/rpc.grpc.pb.h"
|
#include "proto/rpc.grpc.pb.h"
|
||||||
#include "proto/rpc.pb.h"
|
#include "proto/rpc.pb.h"
|
||||||
#include "v3/include/V3Response.hpp"
|
#include "etcd/v3/V3Response.hpp"
|
||||||
|
|
||||||
|
|
||||||
using etcdserverpb::WatchRequest;
|
using etcdserverpb::WatchRequest;
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include "proto/kv.pb.h"
|
#include "proto/kv.pb.h"
|
||||||
|
|
||||||
#include "v3/include/KeyValue.hpp"
|
#include "etcd/v3/KeyValue.hpp"
|
||||||
|
|
||||||
namespace etcdv3
|
namespace etcdv3
|
||||||
{
|
{
|
||||||
|
|
@ -1,11 +1,12 @@
|
||||||
file(GLOB_RECURSE CPP_CLIENT_SRC RELATIVE "${CMAKE_SOURCE_DIR}/src"
|
file(GLOB_RECURSE CPP_CLIENT_SRC
|
||||||
"${CMAKE_SOURCE_DIR}/proto/*.cc"
|
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
"${CMAKE_SOURCE_DIR}/src/*.cpp"
|
"${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/v3/src/*.cpp")
|
"${CMAKE_CURRENT_SOURCE_DIR}/**/*.cpp"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/../proto/*.cc")
|
||||||
|
|
||||||
add_library(etcd-cpp-api SHARED ${CPP_CLIENT_SRC})
|
add_library(etcd-cpp-api SHARED ${CPP_CLIENT_SRC})
|
||||||
set_property(TARGET etcd-cpp-api PROPERTY CXX_STANDARD 11)
|
set_property(TARGET etcd-cpp-api PROPERTY CXX_STANDARD 11)
|
||||||
target_include_directories(etcd-cpp-api PRIVATE ${CMAKE_SOURCE_DIR}/proto)
|
target_include_directories(etcd-cpp-api PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../proto)
|
||||||
|
|
||||||
target_link_libraries(etcd-cpp-api PUBLIC
|
target_link_libraries(etcd-cpp-api PUBLIC
|
||||||
${CPPREST_LIB}
|
${CPPREST_LIB}
|
||||||
|
|
@ -28,11 +29,10 @@ install (FILES ../proto/auth.pb.h
|
||||||
../proto/v3lock.pb.h
|
../proto/v3lock.pb.h
|
||||||
../proto/v3lock.grpc.pb.h
|
../proto/v3lock.grpc.pb.h
|
||||||
DESTINATION include/etcd/proto)
|
DESTINATION include/etcd/proto)
|
||||||
install (FILES ../v3/include/Transaction.hpp
|
install (FILES ../etcd/v3/Transaction.hpp
|
||||||
DESTINATION include/etcd/v3/include)
|
DESTINATION include/etcd/v3)
|
||||||
install (FILES ../proto/gogoproto/gogo.pb.h
|
install (FILES ../proto/gogoproto/gogo.pb.h
|
||||||
DESTINATION include/etcd/proto/gogoproto)
|
DESTINATION include/etcd/proto/gogoproto)
|
||||||
install (FILES ../proto/google/api/annotations.pb.h
|
install (FILES ../proto/google/api/annotations.pb.h
|
||||||
../proto/google/api/http.pb.h
|
../proto/google/api/http.pb.h
|
||||||
DESTINATION include/etcd/proto/google/api)
|
DESTINATION include/etcd/proto/google/api)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,85 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "etcd/Client.hpp"
|
#include "etcd/Client.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
#include "v3/include/AsyncTxnResponse.hpp"
|
#include "etcd/v3/AsyncTxnResponse.hpp"
|
||||||
#include "v3/include/AsyncRangeResponse.hpp"
|
#include "etcd/v3/AsyncRangeResponse.hpp"
|
||||||
#include "v3/include/AsyncWatchResponse.hpp"
|
#include "etcd/v3/AsyncWatchResponse.hpp"
|
||||||
#include "v3/include/AsyncDeleteRangeResponse.hpp"
|
#include "etcd/v3/AsyncDeleteRangeResponse.hpp"
|
||||||
#include "v3/include/AsyncLockResponse.hpp"
|
#include "etcd/v3/AsyncLockResponse.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "v3/include/AsyncSetAction.hpp"
|
#include "etcd/v3/AsyncSetAction.hpp"
|
||||||
#include "v3/include/AsyncCompareAndSwapAction.hpp"
|
#include "etcd/v3/AsyncCompareAndSwapAction.hpp"
|
||||||
#include "v3/include/AsyncCompareAndDeleteAction.hpp"
|
#include "etcd/v3/AsyncCompareAndDeleteAction.hpp"
|
||||||
#include "v3/include/AsyncUpdateAction.hpp"
|
#include "etcd/v3/AsyncUpdateAction.hpp"
|
||||||
#include "v3/include/AsyncGetAction.hpp"
|
#include "etcd/v3/AsyncGetAction.hpp"
|
||||||
#include "v3/include/AsyncDeleteAction.hpp"
|
#include "etcd/v3/AsyncDeleteAction.hpp"
|
||||||
#include "v3/include/AsyncWatchAction.hpp"
|
#include "etcd/v3/AsyncWatchAction.hpp"
|
||||||
#include "v3/include/AsyncLeaseGrantAction.hpp"
|
#include "etcd/v3/AsyncLeaseGrantAction.hpp"
|
||||||
#include "v3/include/AsyncLockAction.hpp"
|
#include "etcd/v3/AsyncLockAction.hpp"
|
||||||
#include "v3/include/AsyncTxnAction.hpp"
|
#include "etcd/v3/AsyncTxnAction.hpp"
|
||||||
|
|
||||||
|
#include <boost/algorithm/string.hpp>
|
||||||
|
|
||||||
using grpc::Channel;
|
using grpc::Channel;
|
||||||
|
|
||||||
|
|
||||||
|
static bool dns_resolve(std::string const &target, std::vector<std::string> &endpoints) {
|
||||||
|
struct addrinfo hints = {}, *addrs;
|
||||||
|
hints.ai_family = AF_INET;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
hints.ai_protocol = IPPROTO_TCP;
|
||||||
|
|
||||||
etcd::Client::Client(std::string const & address)
|
std::vector<std::string> target_parts;
|
||||||
{
|
boost::split(target_parts, target, boost::is_any_of(":"));
|
||||||
std::string stripped_address;
|
if (target_parts.size() != 2) {
|
||||||
std::string substr("://");
|
std::cerr << "warn: invalid URL: " << target << std::endl;
|
||||||
std::string::size_type i = address.find(substr);
|
return false;
|
||||||
if(i != std::string::npos)
|
|
||||||
{
|
|
||||||
stripped_address = address.substr(i+substr.length());
|
|
||||||
}
|
}
|
||||||
std::shared_ptr<Channel> channel = grpc::CreateChannel(stripped_address, grpc::InsecureChannelCredentials());
|
if (getaddrinfo(target_parts[0].c_str(), target_parts[1].c_str(), &hints, &addrs) != 0) {
|
||||||
std::cout << "channel is: " << channel << std::endl;
|
std::cerr << "warn: getaddrinfo() failed for endpoint " << target << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char host[16] = {'\0'};
|
||||||
|
for (struct addrinfo* addr = addrs; addr != nullptr; addr = addr->ai_next) {
|
||||||
|
memset(host, '\0', sizeof(host));
|
||||||
|
getnameinfo(addr->ai_addr, addr->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
|
||||||
|
endpoints.emplace_back(std::string(host) + ":" + target_parts[1]);
|
||||||
|
}
|
||||||
|
freeaddrinfo(addrs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
etcd::Client::Client(std::string const & address, std::string const & load_balancer)
|
||||||
|
{
|
||||||
|
std::vector<std::string> addresses;
|
||||||
|
boost::algorithm::split(addresses, address, boost::algorithm::is_any_of(",;"));
|
||||||
|
std::string stripped_address;
|
||||||
|
{
|
||||||
|
std::vector<std::string> stripped_addresses;
|
||||||
|
std::string substr("://");
|
||||||
|
for (auto const &addr: addresses) {
|
||||||
|
std::string::size_type idx = addr.find(substr);
|
||||||
|
std::string target = idx == std::string::npos ? addr : addr.substr(idx + substr.length());
|
||||||
|
dns_resolve(target, stripped_addresses);
|
||||||
|
}
|
||||||
|
stripped_address = boost::algorithm::join(stripped_addresses, ",");
|
||||||
|
}
|
||||||
|
grpc::ChannelArguments grpc_args;
|
||||||
|
grpc_args.SetLoadBalancingPolicyName(load_balancer);
|
||||||
|
std::shared_ptr<Channel> channel = grpc::CreateCustomChannel(
|
||||||
|
"ipv4:///" + stripped_address,
|
||||||
|
grpc::InsecureChannelCredentials(),
|
||||||
|
grpc_args);
|
||||||
stub_= KV::NewStub(channel);
|
stub_= KV::NewStub(channel);
|
||||||
watchServiceStub= Watch::NewStub(channel);
|
watchServiceStub= Watch::NewStub(channel);
|
||||||
leaseServiceStub= Lease::NewStub(channel);
|
leaseServiceStub= Lease::NewStub(channel);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
#include "etcd/Response.hpp"
|
#include "etcd/Response.hpp"
|
||||||
#include "v3/include/V3Response.hpp"
|
#include "etcd/v3/V3Response.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
etcd::Response::Response(const etcdv3::V3Response& reply)
|
etcd::Response::Response(const etcdv3::V3Response& reply, std::chrono::microseconds const& duration)
|
||||||
{
|
{
|
||||||
_index = reply.get_index();
|
_index = reply.get_index();
|
||||||
_action = reply.get_action();
|
_action = reply.get_action();
|
||||||
|
|
@ -28,6 +28,9 @@ etcd::Response::Response(const etcdv3::V3Response& reply)
|
||||||
|
|
||||||
_lock_key = reply.get_lock_key();
|
_lock_key = reply.get_lock_key();
|
||||||
_events = reply.get_events();
|
_events = reply.get_events();
|
||||||
|
|
||||||
|
// duration
|
||||||
|
_duration = duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -105,4 +108,8 @@ std::string const & etcd::Response::lock_key() const {
|
||||||
|
|
||||||
std::vector<mvccpb::Event> const & etcd::Response::events() const {
|
std::vector<mvccpb::Event> const & etcd::Response::events() const {
|
||||||
return this->_events;
|
return this->_events;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
std::chrono::microseconds const& etcd::Response::duration() const {
|
||||||
|
return this->_duration;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include "etcd/Value.hpp"
|
#include "etcd/Value.hpp"
|
||||||
#include "v3/include/KeyValue.hpp"
|
#include "etcd/v3/KeyValue.hpp"
|
||||||
|
|
||||||
etcd::Value::Value()
|
etcd::Value::Value()
|
||||||
: dir(false),
|
: dir(false),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "etcd/Watcher.hpp"
|
#include "etcd/Watcher.hpp"
|
||||||
#include "v3/include/AsyncWatchAction.hpp"
|
#include "etcd/v3/AsyncWatchAction.hpp"
|
||||||
|
|
||||||
etcd::Watcher::Watcher(std::string const & address, std::string const & key, std::function<void(Response)> callback)
|
etcd::Watcher::Watcher(std::string const & address, std::string const & key, std::function<void(Response)> callback)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
#include <grpc/support/log.h>
|
#include <grpc/support/log.h>
|
||||||
#include "v3/include/Action.hpp"
|
#include "etcd/v3/Action.hpp"
|
||||||
|
|
||||||
etcdv3::Action::Action(etcdv3::ActionParameters params)
|
etcdv3::Action::Action(etcdv3::ActionParameters params)
|
||||||
{
|
{
|
||||||
parameters = params;
|
parameters = params;
|
||||||
|
start_timepoint = std::chrono::high_resolution_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
etcdv3::ActionParameters::ActionParameters()
|
etcdv3::ActionParameters::ActionParameters()
|
||||||
|
|
@ -27,3 +28,6 @@ void etcdv3::Action::waitForResponse()
|
||||||
GPR_ASSERT(got_tag == (void*)this);
|
GPR_ASSERT(got_tag == (void*)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::chrono::high_resolution_clock::time_point etcdv3::Action::startTimepoint() {
|
||||||
|
return this->start_timepoint;
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "v3/include/AsyncCompareAndDeleteAction.hpp"
|
#include "etcd/v3/AsyncCompareAndDeleteAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
using etcdserverpb::Compare;
|
using etcdserverpb::Compare;
|
||||||
using etcdserverpb::RangeRequest;
|
using etcdserverpb::RangeRequest;
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "v3/include/AsyncCompareAndSwapAction.hpp"
|
#include "etcd/v3/AsyncCompareAndSwapAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
using etcdserverpb::Compare;
|
using etcdserverpb::Compare;
|
||||||
using etcdserverpb::RangeRequest;
|
using etcdserverpb::RangeRequest;
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncDeleteAction.hpp"
|
#include "etcd/v3/AsyncDeleteAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
using etcdserverpb::DeleteRangeRequest;
|
using etcdserverpb::DeleteRangeRequest;
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncDeleteRangeResponse.hpp"
|
#include "etcd/v3/AsyncDeleteRangeResponse.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
|
|
||||||
void etcdv3::AsyncDeleteRangeResponse::ParseResponse(std::string const& key, bool prefix, DeleteRangeResponse& resp)
|
void etcdv3::AsyncDeleteRangeResponse::ParseResponse(std::string const& key, bool prefix, DeleteRangeResponse& resp)
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncGetAction.hpp"
|
#include "etcd/v3/AsyncGetAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
using etcdserverpb::RangeRequest;
|
using etcdserverpb::RangeRequest;
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "v3/include/AsyncLeaseGrantAction.hpp"
|
#include "etcd/v3/AsyncLeaseGrantAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
using etcdserverpb::LeaseGrantRequest;
|
using etcdserverpb::LeaseGrantRequest;
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncLeaseGrantResponse.hpp"
|
#include "etcd/v3/AsyncLeaseGrantResponse.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
|
|
||||||
void etcdv3::AsyncLeaseGrantResponse::ParseResponse(LeaseGrantResponse& resp)
|
void etcdv3::AsyncLeaseGrantResponse::ParseResponse(LeaseGrantResponse& resp)
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncLockAction.hpp"
|
#include "etcd/v3/AsyncLockAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
using v3lockpb::LockRequest;
|
using v3lockpb::LockRequest;
|
||||||
using v3lockpb::UnlockRequest;
|
using v3lockpb::UnlockRequest;
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncLockResponse.hpp"
|
#include "etcd/v3/AsyncLockResponse.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
|
|
||||||
void etcdv3::AsyncLockResponse::ParseResponse(LockResponse& resp)
|
void etcdv3::AsyncLockResponse::ParseResponse(LockResponse& resp)
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncRangeResponse.hpp"
|
#include "etcd/v3/AsyncRangeResponse.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
|
|
||||||
void etcdv3::AsyncRangeResponse::ParseResponse(RangeResponse& resp, bool prefix)
|
void etcdv3::AsyncRangeResponse::ParseResponse(RangeResponse& resp, bool prefix)
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "v3/include/AsyncSetAction.hpp"
|
#include "etcd/v3/AsyncSetAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
using etcdserverpb::Compare;
|
using etcdserverpb::Compare;
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
#include "v3/include/AsyncTxnAction.hpp"
|
#include "etcd/v3/AsyncTxnAction.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
|
|
||||||
etcdv3::AsyncTxnAction::AsyncTxnAction(etcdv3::ActionParameters param, etcdv3::Transaction const &tx)
|
etcdv3::AsyncTxnAction::AsyncTxnAction(etcdv3::ActionParameters param, etcdv3::Transaction const &tx)
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#include "v3/include/AsyncTxnResponse.hpp"
|
#include "etcd/v3/AsyncTxnResponse.hpp"
|
||||||
#include "v3/include/AsyncRangeResponse.hpp"
|
#include "etcd/v3/AsyncRangeResponse.hpp"
|
||||||
#include "v3/include/AsyncDeleteRangeResponse.hpp"
|
#include "etcd/v3/AsyncDeleteRangeResponse.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
using etcdserverpb::ResponseOp;
|
using etcdserverpb::ResponseOp;
|
||||||
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#include "v3/include/AsyncUpdateAction.hpp"
|
#include "etcd/v3/AsyncUpdateAction.hpp"
|
||||||
#include "v3/include/AsyncRangeResponse.hpp"
|
#include "etcd/v3/AsyncRangeResponse.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
using etcdserverpb::Compare;
|
using etcdserverpb::Compare;
|
||||||
using etcdserverpb::RangeRequest;
|
using etcdserverpb::RangeRequest;
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncWatchAction.hpp"
|
#include "etcd/v3/AsyncWatchAction.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
|
|
||||||
using etcdserverpb::RangeRequest;
|
using etcdserverpb::RangeRequest;
|
||||||
|
|
@ -36,21 +36,20 @@ etcdv3::AsyncWatchAction::AsyncWatchAction(etcdv3::ActionParameters param)
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("failed to create a watch connection");
|
throw std::runtime_error("failed to create a watch connection");
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait "write" success
|
|
||||||
if (cq_.Next(&got_tag, &ok) && ok && got_tag == (void *)"write") {
|
|
||||||
stream->Read(&reply, (void*)this);
|
|
||||||
} else {
|
|
||||||
throw std::runtime_error("failed to read proper reply from server");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void etcdv3::AsyncWatchAction::waitForResponse()
|
void etcdv3::AsyncWatchAction::waitForResponse()
|
||||||
{
|
{
|
||||||
void* got_tag;
|
void* got_tag;
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
|
|
||||||
|
// wait "write" (WatchCreateRequest) success, and start to read the first reply
|
||||||
|
if (cq_.Next(&got_tag, &ok) && ok && got_tag == (void *)"write") {
|
||||||
|
stream->Read(&reply, (void*)this);
|
||||||
|
} else {
|
||||||
|
throw std::runtime_error("failed to write WatchCreateRequest to server");
|
||||||
|
}
|
||||||
|
|
||||||
while(cq_.Next(&got_tag, &ok))
|
while(cq_.Next(&got_tag, &ok))
|
||||||
{
|
{
|
||||||
if(ok == false)
|
if(ok == false)
|
||||||
|
|
@ -64,12 +63,22 @@ void etcdv3::AsyncWatchAction::waitForResponse()
|
||||||
}
|
}
|
||||||
if(got_tag == (void*)this) // read tag
|
if(got_tag == (void*)this) // read tag
|
||||||
{
|
{
|
||||||
if(reply.events_size())
|
if ((reply.created() && reply.header().revision() < parameters.revision) ||
|
||||||
{
|
reply.events_size() > 0) {
|
||||||
|
// we stop watch under two conditions:
|
||||||
|
//
|
||||||
|
// 1. watch for a future revision, return immediately with empty events set
|
||||||
|
// 2. receive any effective events.
|
||||||
stream->WritesDone((void*)"writes done");
|
stream->WritesDone((void*)"writes done");
|
||||||
|
|
||||||
|
// leave a warning if the response is too large and been fragmented
|
||||||
|
if (reply.fragment()) {
|
||||||
|
std::cerr << "WARN: The response hasn't been fully received and parsed" << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// otherwise, start next round read-reply
|
||||||
stream->Read(&reply, (void*)this);
|
stream->Read(&reply, (void*)this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -105,8 +114,12 @@ void etcdv3::AsyncWatchAction::waitForResponse(std::function<void(etcd::Response
|
||||||
{
|
{
|
||||||
if(reply.events_size())
|
if(reply.events_size())
|
||||||
{
|
{
|
||||||
|
// for the callback case, we don't stop immediately if watching for a future revison,
|
||||||
|
// we wait until there are some expected events.
|
||||||
auto resp = ParseResponse();
|
auto resp = ParseResponse();
|
||||||
callback(resp);
|
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
|
||||||
|
std::chrono::high_resolution_clock::now() - start_timepoint);
|
||||||
|
callback(etcd::Response(resp, duration));
|
||||||
}
|
}
|
||||||
stream->Read(&reply, (void*)this);
|
stream->Read(&reply, (void*)this);
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/AsyncWatchResponse.hpp"
|
#include "etcd/v3/AsyncWatchResponse.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
void etcdv3::AsyncWatchResponse::ParseResponse(WatchResponse& reply)
|
void etcdv3::AsyncWatchResponse::ParseResponse(WatchResponse& reply)
|
||||||
{
|
{
|
||||||
|
|
@ -7,8 +7,6 @@ void etcdv3::AsyncWatchResponse::ParseResponse(WatchResponse& reply)
|
||||||
for (auto const &e: reply.events()) {
|
for (auto const &e: reply.events()) {
|
||||||
events.emplace_back(e);
|
events.emplace_back(e);
|
||||||
}
|
}
|
||||||
std::cout << "index = " << index << ", event size = " << reply.events().size()
|
|
||||||
<< ", res event size = " << events.size() << std::endl;
|
|
||||||
for(int cnt =0; cnt < reply.events_size(); cnt++)
|
for(int cnt =0; cnt < reply.events_size(); cnt++)
|
||||||
{
|
{
|
||||||
auto event = reply.events(cnt);
|
auto event = reply.events(cnt);
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include "v3/include/KeyValue.hpp"
|
#include "etcd/v3/KeyValue.hpp"
|
||||||
|
|
||||||
etcdv3::KeyValue::KeyValue()
|
etcdv3::KeyValue::KeyValue()
|
||||||
{
|
{
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include "v3/include/Transaction.hpp"
|
#include "etcd/v3/Transaction.hpp"
|
||||||
|
|
||||||
using etcdserverpb::Compare;
|
using etcdserverpb::Compare;
|
||||||
using etcdserverpb::RangeRequest;
|
using etcdserverpb::RangeRequest;
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include "v3/include/V3Response.hpp"
|
#include "etcd/v3/V3Response.hpp"
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
void etcdv3::V3Response::set_error_code(int code)
|
void etcdv3::V3Response::set_error_code(int code)
|
||||||
{
|
{
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include "v3/include/action_constants.hpp"
|
#include "etcd/v3/action_constants.hpp"
|
||||||
|
|
||||||
char const * etcdv3::CREATE_ACTION = "create";
|
char const * etcdv3::CREATE_ACTION = "create";
|
||||||
char const * etcdv3::COMPARESWAP_ACTION = "compareAndSwap";
|
char const * etcdv3::COMPARESWAP_ACTION = "compareAndSwap";
|
||||||
|
|
@ -10,4 +10,3 @@ char const * etcdv3::COMPAREDELETE_ACTION = "compareAndDelete";
|
||||||
char const * etcdv3::LOCK_ACTION = "lock";
|
char const * etcdv3::LOCK_ACTION = "lock";
|
||||||
char const * etcdv3::UNLOCK_ACTION = "unlock";
|
char const * etcdv3::UNLOCK_ACTION = "unlock";
|
||||||
char const * etcdv3::TXN_ACTION = "txn";
|
char const * etcdv3::TXN_ACTION = "txn";
|
||||||
|
|
||||||
Loading…
Reference in New Issue