FairMQ: Parameterize the command interface initializing with sub socket

! THIS PATCH BREAKS NANOMSG TRANSPORT !

The subscriber command socket was created using the transport factory of
the channel which might not implement sub sockets. This patch creates
the subscriber command sockets in the device initialization and passes
them down (move) to the command interface initialization.

This patch puts more focus on the GetSocket interface of FairMQSocket,
because all command sockets are now implemented with the default
transport - the channels use an internal poller which polls over sockets
of potentially different transports now (e.g. zeromq command socket and
nanomsg data socket). Basically, all transports need to return file
descriptors compatible to be used in a single poll set. THIS IS NOT THE CASE!

! THIS PATCH BREAKS NANOMSG TRANSPORT !
This commit is contained in:
Dennis Klein 2018-02-19 18:44:08 +01:00 committed by Mohammad Al-Turany
parent 43a06e3cc7
commit e73fcbd595
4 changed files with 17 additions and 44 deletions

View File

@ -660,9 +660,9 @@ void FairMQChannel::InitTransport(shared_ptr<FairMQTransportFactory> factory)
fTransportType = factory->GetType(); fTransportType = factory->GetType();
} }
bool FairMQChannel::InitCommandInterface() bool FairMQChannel::InitCommandInterface(FairMQSocketPtr channelCmdSocket)
{ {
fChannelCmdSocket = fTransportFactory->CreateSocket("sub", "device-commands"); fChannelCmdSocket = std::move(channelCmdSocket);
if (fChannelCmdSocket) if (fChannelCmdSocket)
{ {
fChannelCmdSocket->Connect("inproc://commands"); fChannelCmdSocket->Connect("inproc://commands");

View File

@ -322,7 +322,7 @@ class FairMQChannel
bool CheckCompatibility(std::vector<std::unique_ptr<FairMQMessage>>& msgVec) const; bool CheckCompatibility(std::vector<std::unique_ptr<FairMQMessage>>& msgVec) const;
void InitTransport(std::shared_ptr<FairMQTransportFactory> factory); void InitTransport(std::shared_ptr<FairMQTransportFactory> factory);
bool InitCommandInterface(); bool InitCommandInterface(FairMQSocketPtr channelCmdSocket);
bool HandleUnblock() const; bool HandleUnblock() const;

View File

@ -48,7 +48,7 @@ FairMQDevice::FairMQDevice()
, fDefaultTransport() , fDefaultTransport()
, fInitializationTimeoutInS(120) , fInitializationTimeoutInS(120)
, fDataCallbacks(false) , fDataCallbacks(false)
, fDeviceCmdSockets() , fDeviceCmdSocket(nullptr)
, fMsgInputs() , fMsgInputs()
, fMultipartInputs() , fMultipartInputs()
, fMultitransportInputs() , fMultitransportInputs()
@ -79,7 +79,7 @@ FairMQDevice::FairMQDevice(const fair::mq::tools::Version version)
, fDefaultTransport() , fDefaultTransport()
, fInitializationTimeoutInS(120) , fInitializationTimeoutInS(120)
, fDataCallbacks(false) , fDataCallbacks(false)
, fDeviceCmdSockets() , fDeviceCmdSocket(nullptr)
, fMsgInputs() , fMsgInputs()
, fMultipartInputs() , fMultipartInputs()
, fMultitransportInputs() , fMultitransportInputs()
@ -102,21 +102,6 @@ void FairMQDevice::InitWrapper()
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (fDeviceCmdSockets.empty())
{
auto p = fDeviceCmdSockets.emplace(fTransportFactory->GetType(), fTransportFactory->CreateSocket("pub", "device-commands"));
if (p.second)
{
p.first->second->Bind("inproc://commands");
}
else
{
exit(EXIT_FAILURE);
}
FairMQMessagePtr msg(fTransportFactory->CreateMessage());
}
// Containers to store the uninitialized channels. // Containers to store the uninitialized channels.
vector<FairMQChannel*> uninitializedBindingChannels; vector<FairMQChannel*> uninitializedBindingChannels;
vector<FairMQChannel*> uninitializedConnectingChannels; vector<FairMQChannel*> uninitializedConnectingChannels;
@ -248,7 +233,7 @@ void FairMQDevice::AttachChannels(vector<FairMQChannel*>& chans)
{ {
if (AttachChannel(**itr)) if (AttachChannel(**itr))
{ {
(*itr)->InitCommandInterface(); (*itr)->InitCommandInterface(Transport()->CreateSocket("sub", "device-commands"));
(*itr)->SetModified(false); (*itr)->SetModified(false);
itr = chans.erase(itr); itr = chans.erase(itr);
} }
@ -476,10 +461,7 @@ void FairMQDevice::RunWrapper()
// notify channels to resume transfers // notify channels to resume transfers
FairMQChannel::fInterrupted = false; FairMQChannel::fInterrupted = false;
for (auto& kv : fDeviceCmdSockets) fDeviceCmdSocket->Resume();
{
kv.second->Resume();
}
try try
{ {
@ -780,18 +762,12 @@ shared_ptr<FairMQTransportFactory> FairMQDevice::AddTransport(const string& tran
pair<FairMQ::Transport, shared_ptr<FairMQTransportFactory>> trPair(FairMQ::TransportTypes.at(transport), tr); pair<FairMQ::Transport, shared_ptr<FairMQTransportFactory>> trPair(FairMQ::TransportTypes.at(transport), tr);
fTransports.insert(trPair); fTransports.insert(trPair);
auto p = fDeviceCmdSockets.emplace(tr->GetType(), tr->CreateSocket("pub", "device-commands")); if (!fDeviceCmdSocket) {
if (p.second) fDeviceCmdSocket = Transport()->CreateSocket("pub", "device-commands");
{ if(!fDeviceCmdSocket->Bind("inproc://commands")) {
p.first->second->Bind("inproc://commands");
}
else
{
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
}
FairMQMessagePtr msg(tr->CreateMessage());
return tr; return tr;
} }
else else
@ -974,12 +950,9 @@ void FairMQDevice::LogSocketRates()
void FairMQDevice::Unblock() void FairMQDevice::Unblock()
{ {
FairMQChannel::fInterrupted = true; FairMQChannel::fInterrupted = true;
for (auto& kv : fDeviceCmdSockets) fDeviceCmdSocket->Interrupt();
{ FairMQMessagePtr cmd(Transport()->CreateMessage());
kv.second->Interrupt(); fDeviceCmdSocket->Send(cmd);
FairMQMessagePtr cmd(fTransports.at(kv.first)->CreateMessage());
kv.second->Send(cmd);
}
} }
void FairMQDevice::ResetTaskWrapper() void FairMQDevice::ResetTaskWrapper()

View File

@ -194,7 +194,7 @@ class FairMQDevice : public FairMQStateMachine
/// @brief Getter for default transport factory /// @brief Getter for default transport factory
auto Transport() const -> const FairMQTransportFactory* auto Transport() const -> const FairMQTransportFactory*
{ {
return fTransports.cbegin()->second.get(); return fTransports.at(fair::mq::TransportTypes[GetDefaultTransport()]).get();
} }
template<typename... Args> template<typename... Args>
@ -517,7 +517,7 @@ class FairMQDevice : public FairMQStateMachine
void CreateOwnConfig(); void CreateOwnConfig();
bool fDataCallbacks; bool fDataCallbacks;
std::unordered_map<FairMQ::Transport, FairMQSocketPtr> fDeviceCmdSockets; ///< Sockets used for the internal unblocking mechanism FairMQSocketPtr fDeviceCmdSocket; ///< Socket used for the internal unblocking mechanism
std::unordered_map<std::string, InputMsgCallback> fMsgInputs; std::unordered_map<std::string, InputMsgCallback> fMsgInputs;
std::unordered_map<std::string, InputMultipartCallback> fMultipartInputs; std::unordered_map<std::string, InputMultipartCallback> fMultipartInputs;
std::unordered_map<FairMQ::Transport, std::vector<std::string>> fMultitransportInputs; std::unordered_map<FairMQ::Transport, std::vector<std::string>> fMultitransportInputs;