mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-13 16:46:47 +00:00
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:
parent
43a06e3cc7
commit
e73fcbd595
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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");
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user