Include device ID in the zeromq socket identity.

For request sockets in ZeroMQ the socket identity must be unique, otherwise multiple clients will be rejected.
Update the tests to test this use case.
This commit is contained in:
Alexey Rybalchenko 2016-03-03 11:23:47 +01:00
parent e1fef82657
commit c42b6ca4ae
16 changed files with 38 additions and 27 deletions

View File

@ -409,7 +409,7 @@ bool FairMQChannel::InitCommandInterface(FairMQTransportFactory* factory, int nu
{
fTransportFactory = factory;
fCmdSocket = fTransportFactory->CreateSocket("sub", "device-commands", numIoThreads);
fCmdSocket = fTransportFactory->CreateSocket("sub", "device-commands", numIoThreads, "internal");
if (fCmdSocket)
{
fCmdSocket->Connect("inproc://commands");

View File

@ -98,7 +98,7 @@ void FairMQDevice::InitWrapper()
if (!fCmdSocket)
{
fCmdSocket = fTransportFactory->CreateSocket("pub", "device-commands", fNumIoThreads);
fCmdSocket = fTransportFactory->CreateSocket("pub", "device-commands", fNumIoThreads, fId);
fCmdSocket->Bind("inproc://commands");
}
@ -191,7 +191,7 @@ bool FairMQDevice::InitChannel(FairMQChannel& ch)
{
LOG(DEBUG) << "Initializing channel " << ch.fChannelName << " (" << ch.fType << ")";
// initialize the socket
ch.fSocket = fTransportFactory->CreateSocket(ch.fType, ch.fChannelName, fNumIoThreads);
ch.fSocket = fTransportFactory->CreateSocket(ch.fType, ch.fChannelName, fNumIoThreads, fId);
// set high water marks
ch.fSocket->SetOption("snd-hwm", &(ch.fSndBufSize), sizeof(ch.fSndBufSize));
ch.fSocket->SetOption("rcv-hwm", &(ch.fRcvBufSize), sizeof(ch.fRcvBufSize));

View File

@ -34,7 +34,7 @@ class FairMQTransportFactory
virtual FairMQMessage* CreateMessage(const size_t size) = 0;
virtual FairMQMessage* CreateMessage(void* data, const size_t size, fairmq_free_fn* ffn = NULL, void* hint = NULL) = 0;
virtual FairMQSocket* CreateSocket(const std::string& type, const std::string& name, const int numIoThreads) = 0;
virtual FairMQSocket* CreateSocket(const std::string& type, const std::string& name, const int numIoThreads, const std::string& id = "") = 0;
virtual FairMQPoller* CreatePoller(const std::vector<FairMQChannel>& channels) = 0;
virtual FairMQPoller* CreatePoller(const std::unordered_map<std::string, std::vector<FairMQChannel>>& channelsMap, const std::initializer_list<std::string> channelList) = 0;

View File

@ -20,7 +20,7 @@
using namespace std;
FairMQSocketNN::FairMQSocketNN(const string& type, const std::string& name, const int numIoThreads)
FairMQSocketNN::FairMQSocketNN(const string& type, const std::string& name, const int numIoThreads, const std::string& id /*= ""*/)
: FairMQSocket(0, 0, NN_DONTWAIT)
, fSocket(-1)
, fId()
@ -29,7 +29,7 @@ FairMQSocketNN::FairMQSocketNN(const string& type, const std::string& name, cons
, fMessagesTx(0)
, fMessagesRx(0)
{
fId = name + "." + type;
fId = id + "." + name + "." + type;
if (numIoThreads > 1)
{

View File

@ -26,7 +26,7 @@
class FairMQSocketNN : public FairMQSocket
{
public:
FairMQSocketNN(const std::string& type, const std::string& name, const int numIoThreads); // numIoThreads is not used in nanomsg.
FairMQSocketNN(const std::string& type, const std::string& name, const int numIoThreads, const std::string& id = ""); // numIoThreads is not used in nanomsg.
FairMQSocketNN(const FairMQSocketNN&) = delete;
FairMQSocketNN operator=(const FairMQSocketNN&) = delete;

View File

@ -36,9 +36,9 @@ FairMQMessage* FairMQTransportFactoryNN::CreateMessage(void* data, const size_t
return new FairMQMessageNN(data, size, ffn, hint);
}
FairMQSocket* FairMQTransportFactoryNN::CreateSocket(const string& type, const std::string& name, const int numIoThreads)
FairMQSocket* FairMQTransportFactoryNN::CreateSocket(const string& type, const std::string& name, const int numIoThreads, const std::string& id /*= ""*/)
{
return new FairMQSocketNN(type, name, numIoThreads);
return new FairMQSocketNN(type, name, numIoThreads, id);
}
FairMQPoller* FairMQTransportFactoryNN::CreatePoller(const vector<FairMQChannel>& channels)

View File

@ -31,7 +31,7 @@ class FairMQTransportFactoryNN : public FairMQTransportFactory
virtual FairMQMessage* CreateMessage(const size_t size);
virtual FairMQMessage* CreateMessage(void* data, const size_t size, fairmq_free_fn* ffn = NULL, void* hint = NULL);
virtual FairMQSocket* CreateSocket(const std::string& type, const std::string& name, const int numIoThreads);
virtual FairMQSocket* CreateSocket(const std::string& type, const std::string& name, const int numIoThreads, const std::string& id = "");
virtual FairMQPoller* CreatePoller(const std::vector<FairMQChannel>& channels);
virtual FairMQPoller* CreatePoller(const std::unordered_map<std::string, std::vector<FairMQChannel>>& channelsMap, const std::initializer_list<std::string> channelList);

View File

@ -23,12 +23,22 @@ FairMQTestRep::FairMQTestRep()
void FairMQTestRep::Run()
{
std::unique_ptr<FairMQMessage> request(NewMessage());
if (Receive(request, "data") >= 0)
std::unique_ptr<FairMQMessage> request1(NewMessage());
if (Receive(request1, "data") >= 0)
{
LOG(INFO) << "Received request 1";
std::unique_ptr<FairMQMessage> reply(NewMessage());
Send(reply, "data");
}
std::unique_ptr<FairMQMessage> request2(NewMessage());
if (Receive(request2, "data") >= 0)
{
LOG(INFO) << "Received request 2";
std::unique_ptr<FairMQMessage> reply(NewMessage());
Send(reply, "data");
}
LOG(INFO) << "REQ-REP test successfull";
}
FairMQTestRep::~FairMQTestRep()

View File

@ -29,7 +29,7 @@ void FairMQTestReq::Run()
std::unique_ptr<FairMQMessage> reply(NewMessage());
if (Receive(reply, "data") >= 0)
{
LOG(INFO) << "REQ-REP test successfull";
LOG(INFO) << "received reply";
}
}

View File

@ -25,7 +25,7 @@ int main(int argc, char** argv)
testRep.SetProperty(FairMQTestRep::Id, "testRep");
FairMQChannel repChannel("rep", "connect", "tcp://127.0.0.1:5558");
FairMQChannel repChannel("rep", "bind", "tcp://127.0.0.1:5558");
testRep.fChannels["data"].push_back(repChannel);
testRep.ChangeState("INIT_DEVICE");

View File

@ -23,9 +23,9 @@ int main(int argc, char** argv)
testReq.CatchSignals();
testReq.SetTransport("zeromq");
testReq.SetProperty(FairMQTestReq::Id, "testReq");
testReq.SetProperty(FairMQTestReq::Id, "testReq" + std::to_string(getpid()));
FairMQChannel reqChannel("req", "bind", "tcp://127.0.0.1:5558");
FairMQChannel reqChannel("req", "connect", "tcp://127.0.0.1:5558");
testReq.fChannels["data"].push_back(reqChannel);
testReq.ChangeState("INIT_DEVICE");

View File

@ -1,9 +1,12 @@
#!/bin/bash
trap 'kill -TERM $REQ_PID; kill -TERM $REP_PID; wait $REQ_PID; wait $REP_PID;' TERM
trap 'kill -TERM $REQ1_PID; kill -TERM $REQ2_PID; kill -TERM $REP_PID; wait $REQ1_PID; wait $REQ2_PID; wait $REP_PID;' TERM
@CMAKE_BINARY_DIR@/bin/test-fairmq-req &
REQ_PID=$!
REQ1_PID=$!
@CMAKE_BINARY_DIR@/bin/test-fairmq-req &
REQ2_PID=$!
@CMAKE_BINARY_DIR@/bin/test-fairmq-rep &
REP_PID=$!
wait $REQ_PID
wait $REQ1_PID
wait $REQ2_PID
wait $REP_PID

View File

@ -24,7 +24,7 @@ using namespace std;
// Context to hold the ZeroMQ sockets
boost::shared_ptr<FairMQContextZMQ> FairMQSocketZMQ::fContext = boost::shared_ptr<FairMQContextZMQ>(new FairMQContextZMQ(1));
FairMQSocketZMQ::FairMQSocketZMQ(const string& type, const string& name, const int numIoThreads)
FairMQSocketZMQ::FairMQSocketZMQ(const string& type, const string& name, const int numIoThreads, const std::string& id /*= ""*/)
: FairMQSocket(ZMQ_SNDMORE, ZMQ_RCVMORE, ZMQ_DONTWAIT)
, fSocket(NULL)
, fId()
@ -33,7 +33,7 @@ FairMQSocketZMQ::FairMQSocketZMQ(const string& type, const string& name, const i
, fMessagesTx(0)
, fMessagesRx(0)
{
fId = name + "." + type;
fId = id + "." + name + "." + type;
if (zmq_ctx_set(fContext->GetContext(), ZMQ_IO_THREADS, numIoThreads) != 0)
{
@ -68,8 +68,6 @@ FairMQSocketZMQ::FairMQSocketZMQ(const string& type, const string& name, const i
LOG(ERROR) << "Failed setting ZMQ_SUBSCRIBE socket option, reason: " << zmq_strerror(errno);
}
}
// LOG(INFO) << "created socket " << fId;
}
string FairMQSocketZMQ::GetId()

View File

@ -23,7 +23,7 @@
class FairMQSocketZMQ : public FairMQSocket
{
public:
FairMQSocketZMQ(const std::string& type, const std::string& name, const int numIoThreads);
FairMQSocketZMQ(const std::string& type, const std::string& name, const int numIoThreads, const std::string& id = "");
FairMQSocketZMQ(const FairMQSocketZMQ&) = delete;
FairMQSocketZMQ operator=(const FairMQSocketZMQ&) = delete;

View File

@ -40,9 +40,9 @@ FairMQMessage* FairMQTransportFactoryZMQ::CreateMessage(void* data, const size_t
return new FairMQMessageZMQ(data, size, ffn, hint);
}
FairMQSocket* FairMQTransportFactoryZMQ::CreateSocket(const string& type, const std::string& name, const int numIoThreads)
FairMQSocket* FairMQTransportFactoryZMQ::CreateSocket(const string& type, const std::string& name, const int numIoThreads, const std::string& id /*= ""*/)
{
return new FairMQSocketZMQ(type, name, numIoThreads);
return new FairMQSocketZMQ(type, name, numIoThreads, id);
}
FairMQPoller* FairMQTransportFactoryZMQ::CreatePoller(const vector<FairMQChannel>& channels)

View File

@ -32,7 +32,7 @@ class FairMQTransportFactoryZMQ : public FairMQTransportFactory
virtual FairMQMessage* CreateMessage(const size_t size);
virtual FairMQMessage* CreateMessage(void* data, const size_t size, fairmq_free_fn* ffn = NULL, void* hint = NULL);
virtual FairMQSocket* CreateSocket(const std::string& type, const std::string& name, const int numIoThreads);
virtual FairMQSocket* CreateSocket(const std::string& type, const std::string& name, const int numIoThreads, const std::string& id = "");
virtual FairMQPoller* CreatePoller(const std::vector<FairMQChannel>& channels);
virtual FairMQPoller* CreatePoller(const std::unordered_map<std::string, std::vector<FairMQChannel>>& channelsMap, const std::initializer_list<std::string> channelList);