Skip to content

Commit

Permalink
Implement Grpc based signaling service
Browse files Browse the repository at this point in the history
  • Loading branch information
erikzenker committed Feb 12, 2017
1 parent ccfb4b5 commit 2290374
Show file tree
Hide file tree
Showing 20 changed files with 906 additions and 456 deletions.
52 changes: 43 additions & 9 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

language: cpp
sudo: false

Expand All @@ -7,37 +8,36 @@ cache:
- $HOME/.cache/cmake
- $HOME/.cache/boost
- $HOME/.cache/zmq
- $HOME/.cache/grpc
- $HOME/.cache/protobuf

addons:
apt:
sources:
- ubuntu-toolchain-r-test
#- llvm-toolchain-precise-3.5
packages:
- tree
- gcc-6
- g++-6 # also possible: g++5.2 or g++-6
- clang-3.5
- openmpi-bin
- libopenmpi-dev
# - clang-3.5

env:
global:
- CMAKE_ROOT: $HOME/.cache/cmake
- BOOST_ROOT: $HOME/.cache/boost
- ZMQ_ROOT: $HOME/.cache/zmq
- GRPC_ROOT: $HOME/.cache/grpc
- PROTOBUF_ROOT: $HOME/.cache/protobuf
- BOOST_LIBRARY_DIR: $HOME/.cache/boost
- BOOST_MIN: 106100 # careful: hard coded below
- GRAYBAT_ROOT: $TRAVIS_BUILD_DIR
- OMP_NUM_THREADS: 4 # ignored in thread layer
matrix:
- COMPILER=gcc STRATEGY=""
#- COMPILER=clang STRATEGY=""

before_install:
- mkdir -p $HOME/build

#- export CMAKE_FLAGS="-DALPAKA_ACC_"$STRATEGY"_ENABLE=ON"
- export CMAKE_FLAGS="-DCMAKE_CXX_FLAGS=\"-Werror\""
- if [ "$COMPILER" == "gcc" ]; then
echo "Using g++-6";
Expand Down Expand Up @@ -113,12 +113,46 @@ install:
else
echo "ZeroMQ directory already exists";
fi
#############################################################################
# PROTOBUF
#############################################################################
- export CMAKE_PREFIX_PATH=$PROTOBUF_ROOT:$CMAKE_PREFIX_PATH
- echo $CMAKE_PREFIX_PATH
- tree $PROTOBUF_ROOT
- if [ ! "$(ls -A $PROTOBUF_ROOT)" ]; then
cd /tmp/;
travis_retry git clone https://github.com/google/protobuf.git;
cd /tmp/protobuf/;
./autogen.sh;
mkdir -p $PROTOBUF_ROOT;
./configure --prefix=$PROTOBUF_ROOT;
make check;
make install;
else
echo "Protobuf directory already exists";
fi
#############################################################################
# GRPC #
#############################################################################
- export CMAKE_PREFIX_PATH=$GRPC_ROOT:$CMAKE_PREFIX_PATH
- echo $CMAKE_PREFIX_PATH
- tree $GRPC_ROOT
- if [ ! "$(ls -A $GRPC_ROOT)" ]; then
cd /tmp/;
travis_retry git clone -b $(curl -L http://grpc.io/release) https://github.com/grpc/grpc;
cd /tmp/grpc/;
git submodule update --init;
mkdir -p $GRPC_ROOT;
make prefix=$GRPC_ROOT install;
else
echo "Grpc directory already exists";
fi

script:
- cd $HOME/build
- cmake $CMAKE_FLAGS $GRAYBAT_ROOT
- make check
- make gbZMQSignaling
- ./gbZMQSignaling&
- make signaling
- ./signaling&
- ctest --output-on-failure
- killall gbZMQSignaling
- killall signaling
19 changes: 10 additions & 9 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)


###############################################################################
# Targets
###############################################################################
Expand All @@ -90,12 +91,12 @@ target_link_libraries(benchmark ${LIBS})

# Test cases
file(GLOB TESTS test/integration/*.cpp)
add_executable(check EXCLUDE_FROM_ALL ${TESTS})
add_executable(check EXCLUDE_FROM_ALL ${TESTS} ${graybat_GENERATED_FILES})
target_link_libraries(check ${LIBS})

# Fast testing
file(GLOB TESTSFAST test/integration/main.cpp test/integration/CommunicationPolicyTests.cpp)
add_executable(checkFast EXCLUDE_FROM_ALL ${TESTSFAST})
add_executable(checkFast EXCLUDE_FROM_ALL ${TESTSFAST} ${graybat_GENERATED_FILES})
set_property(TARGET checkFast PROPERTY CXX_STANDARD 14)
target_link_libraries(checkFast ${LIBS})

Expand All @@ -104,17 +105,17 @@ add_custom_target(example)
file(GLOB EXAMPLES example/*.cpp)
foreach(EXAMPLE ${EXAMPLES})
get_filename_component(DEP ${EXAMPLE} NAME_WE)
add_executable(${DEP} EXCLUDE_FROM_ALL ${EXAMPLE})
add_executable(${DEP} EXCLUDE_FROM_ALL ${EXAMPLE} ${graybat_GENERATED_FILES})
set_property(TARGET ${DEP} PROPERTY CXX_STANDARD 14)
target_link_libraries(${DEP} LINK_INTERFACE_LIBRARIES graybat)
target_link_libraries(${DEP} ${LIBS})
target_link_libraries(${DEP} ${LIBS})
add_dependencies(example ${DEP})
endforeach(EXAMPLE)

# ZMQ signaling server
add_executable(gbZMQSignaling EXCLUDE_FROM_ALL utils/zmq_signaling_server.cpp )
set_property(TARGET gbZMQSignaling PROPERTY CXX_STANDARD 11)
target_link_libraries(gbZMQSignaling ${LIBS})
# GRPC signaling server
add_executable( signaling EXCLUDE_FROM_ALL utils/signaling_server.cpp ${graybat_GENERATED_FILES})
set_property(TARGET signaling PROPERTY CXX_STANDARD 11)
target_link_libraries(signaling ${LIBS})

# CTest
enable_testing()
Expand All @@ -140,7 +141,7 @@ install(
DESTINATION "lib/graybat"
)

install( TARGETS gbZMQSignaling
install( TARGETS signaling
RUNTIME DESTINATION "bin"
)

Expand Down
22 changes: 9 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,18 @@ or by setting the `graybat_DIR`:
set(graybat_DIR <ABSOLUTE-PATH-TO-GRAYBAT>)


The CMAKE-Configfile of graybat provides the CMAKE variables `${graybat_INCLUDE_DIRS}` and
`${graybat_LIBRARIES}`. Where `${graybat_INCLUDE_DIRS}` contains all header files
included by graybat and `${graybat_LIBRARIES}` contains all libraries used by graybat.
The CMAKE-Configfile of graybat provides the CMAKE variables `${graybat_INCLUDE_DIRS}`,
`${graybat_LIBRARIES}`, and `${graybat_GENERATED_FILES}`. Where `${graybat_INCLUDE_DIRS}` contains all header files
included by graybat,`${graybat_LIBRARIES}` contains all libraries used by graybat, and `${graybat_GENERATED_FILES}`
contains all generated files that need to be compiled with the target.
The following is a an example of how to embed graybat into your `CMakeLists.txt`

find_package(graybat REQUIRED CONFIG)
include_directories(SYSTEM ${graybat_INCLUDE_DIRS})
set(LIBS ${LIBS} ${graybat_LIBRARIES})

add_executable(myTarget main.cpp ${graybat_GENERATED_FILES})
target_link_libraries(signaling ${LIBS})

Finally, the application can use graybat e.g. `#include <graybat/Cage.hpp>`.

Expand All @@ -126,7 +130,7 @@ Finally, the application can use graybat e.g. `#include <graybat/Cage.hpp>`.
There exist benchmarks for graybat:
```
make benchmark
./gbZMQSignaling&
./signaling_server&
./benchmark
Run on (4 X 2493.8 MHz CPU s)
Expand Down Expand Up @@ -159,7 +163,7 @@ meassureSingleMessageSendZmq/976.562k 23033162 ns 22561309 ns 31

* **benchmark** : Benchmarks

* **gbZMQSignaling** : Signaling server for zeroMQ communication policy.
* **signaling** : Signaling server for zeroMQ communication policy.

* **doc**: Build documentation in `doc/`.

Expand All @@ -172,14 +176,6 @@ meassureSingleMessageSendZmq/976.562k 23033162 ns 22561309 ns 31
* g++ 5.2.0


### Current Compilation Status:

| *branch* | *state* | *description* |
| -------- | --------| ------------- |
| **master** | [![Build Status](http://haseongpu.mooo.com/api/badge/github.com/erikzenker/GrayBat/status.svg?branch=master)](http://haseongpu.mooo.com/github.com/erikzenker/GrayBat) | stable releases |
| **dev** | [![Build Status](http://haseongpu.mooo.com/api/badge/github.com/erikzenker/GrayBat/status.svg?branch=dev)](http://haseongpu.mooo.com/github.com/erikzenker/GrayBat) |development branch |


##Related Material##
* Talk by Erik Zenker of his diploma defence [![DOI](https://zenodo.org/badge/doi/10.5281/zenodo.16306.svg)](http://dx.doi.org/10.5281/zenodo.16306)

Expand Down
30 changes: 27 additions & 3 deletions graybatConfig.cmake
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#
# Copyright 2016 Erik Zenker
# Copyright 2016-2017 Erik Zenker
#
# This file is part of Graybat.
#
Expand All @@ -20,8 +20,9 @@

# - Config file for the graybat package
# It defines the following variables
# graybat_INCLUDE_DIRS - include directories for FooBar
# graybat_LIBRARIES - libraries to link against
# graybat_INCLUDE_DIRS - include directories for Graybat
# graybat_LIBRARIES - libraries to link against
# graybat_GENERATED_FILES - files to add to targets using Graybat

###############################################################################
# graybat
Expand Down Expand Up @@ -75,3 +76,26 @@ set(graybat_LIBRARIES ${graybat_LIBRARIES} ${MPI_CXX_LIBRARIES})
################################################################################
find_package(Threads MODULE)
set(graybat_LIBRARIES ${graybat_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})

################################################################################
# Find Protobuf
################################################################################
find_package(Protobuf REQUIRED)
set(graybat_INCLUDE_DIRS ${graybat_INCLUDE_DIRS} ${PROTOBUF_INCLUDE_DIRS})
set(graybat_LIBRARIES ${graybat_LIBRARIES} ${PROTOBUF_LIBRARIES})

################################################################################
# Find GRPC
################################################################################
find_package(GRPC REQUIRED)
set(graybat_INCLUDE_DIRS ${graybat_INCLUDE_DIRS} ${GRPC_INCLUDE_DIRS})
set(graybat_LIBRARIES ${graybat_LIBRARIES} ${GRPC_LIBRARIES})

###############################################################################
# Generate files
###############################################################################
set(graybat_INCLUDE_DIRS ${graybat_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/utils/protos/*.proto")
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${ProtoFiles})
PROTOBUF_GENERATE_GRPC_CPP(GRPC_SRCS GRPC_HDRS ${ProtoFiles})
set(graybat_GENERATED_FILES ${GRPC_SRCS} ${PROTO_SRCS})
58 changes: 31 additions & 27 deletions include/graybat/communicationPolicy/ZMQ.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ struct ZMQ : public graybat::communicationPolicy::socket::Base<ZMQ> {
::zmq::context_t zmqContext;
Socket recvSocket;
Socket ctrlSocket;
Socket signalingSocket;
std::vector<Socket> sendSockets;
std::vector<Socket> ctrlSendSockets;

Expand All @@ -123,13 +122,17 @@ struct ZMQ : public graybat::communicationPolicy::socket::Base<ZMQ> {

// Construct
ZMQ(Config const config)
: SocketBase(config), zmqContext(1), recvSocket(zmqContext, ZMQ_PULL),
ctrlSocket(zmqContext, ZMQ_PULL), signalingSocket(zmqContext, ZMQ_REQ),
peerUri(bindToNextFreePort(recvSocket, config.peerUri)),
ctrlUri(bindToNextFreePort(ctrlSocket, config.peerUri)) {

// std::cout << "PeerUri: " << peerUri << std::endl;
SocketBase::init();
: SocketBase(config)
, zmqContext(1)
, recvSocket(zmqContext, ZMQ_PULL)
, ctrlSocket(zmqContext, ZMQ_PULL)
, peerUri(bindToNextFreePort(recvSocket, config.peerUri))
, ctrlUri(bindToNextFreePort(ctrlSocket, config.peerUri))
{

//std::cout << "--> ZMQ" << std::endl;
SocketBase::init();
//std::cout << "<-- ZMQ" << std::endl;
}

// Copy constructor
Expand Down Expand Up @@ -161,8 +164,8 @@ struct ZMQ : public graybat::communicationPolicy::socket::Base<ZMQ> {
}

template <typename T_Socket>
void connectToSocket(T_Socket &socket, std::string const signalingUri) {
socket.connect(signalingUri.c_str());
void connectToSocket(T_Socket &socket, std::string const uri) {
socket.connect(uri.c_str());
}

template <typename T_Socket>
Expand Down Expand Up @@ -191,25 +194,26 @@ struct ZMQ : public graybat::communicationPolicy::socket::Base<ZMQ> {
socket.send(data);
}

Uri bindToNextFreePort(Socket &socket, const std::string peerUri) {
std::string peerBaseUri = peerUri.substr(0, peerUri.rfind(":"));
unsigned peerBasePort = std::stoi(peerUri.substr(peerUri.rfind(":") + 1));
bool connected = false;

std::string uri;
while (!connected) {
try {
uri = peerBaseUri + ":" + std::to_string(peerBasePort);
socket.bind(uri.c_str());
connected = true;
} catch (::zmq::error_t e) {
// std::cout << e.what() << ". PeerUri \"" << uri << "\". Try to
// increment port and rebind." << std::endl;
peerBasePort++;
Uri bindToNextFreePort(Socket& socket, const std::string peerUri)
{
std::string peerBaseUri = peerUri.substr(0, peerUri.rfind(":"));
unsigned peerBasePort = std::stoi(peerUri.substr(peerUri.rfind(":") + 1));
bool connected = false;

std::string uri;
while (!connected) {
try {
uri = peerBaseUri + ":" + std::to_string(peerBasePort);
socket.bind(uri.c_str());
connected = true;
} catch (::zmq::error_t e) {
// std::cout << e.what() << ". PeerUri \"" << uri << "\". Try to
// increment port and rebind." << std::endl;
peerBasePort++;
}
}
}

return uri;
return uri;
}

}; // class ZMQ
Expand Down
Loading

0 comments on commit 2290374

Please sign in to comment.