mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-15 09:31:45 +00:00
Adjust transfer methods behaviour when interrupted
A transer is attempted even if the transport has been interrupted (with a timeout). When the timeout is reached, transfer methods will return TransferResult::interrupted (-3).
This commit is contained in:
committed by
Dennis Klein
parent
5e97d85956
commit
6932f88c84
@@ -130,7 +130,7 @@ class Socket final : public fair::mq::Socket
|
||||
|
||||
bool ShouldRetry(int flags, int timeout, int& elapsed) const
|
||||
{
|
||||
if (!fManager.Interrupted() && ((flags & ZMQ_DONTWAIT) == 0)) {
|
||||
if ((flags & ZMQ_DONTWAIT) == 0) {
|
||||
if (timeout > 0) {
|
||||
elapsed += fTimeout;
|
||||
if (elapsed >= timeout) {
|
||||
@@ -147,10 +147,10 @@ class Socket final : public fair::mq::Socket
|
||||
{
|
||||
if (zmq_errno() == ETERM) {
|
||||
LOG(debug) << "Terminating socket " << fId;
|
||||
return -1;
|
||||
return static_cast<int>(TransferResult::error);
|
||||
} else {
|
||||
LOG(error) << "Failed transfer on socket " << fId << ", reason: " << zmq_strerror(errno);
|
||||
return -1;
|
||||
return static_cast<int>(TransferResult::error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ class Socket final : public fair::mq::Socket
|
||||
ZMsg zmqMsg(sizeof(MetaHeader));
|
||||
std::memcpy(zmqMsg.Data(), &(shmMsg->fMeta), sizeof(MetaHeader));
|
||||
|
||||
while (true && !fManager.Interrupted()) {
|
||||
while (true) {
|
||||
int nbytes = zmq_msg_send(zmqMsg.Msg(), fSocket, flags);
|
||||
if (nbytes > 0) {
|
||||
shmMsg->fQueued = true;
|
||||
@@ -175,17 +175,19 @@ class Socket final : public fair::mq::Socket
|
||||
fBytesTx += size;
|
||||
return size;
|
||||
} else if (zmq_errno() == EAGAIN || zmq_errno() == EINTR) {
|
||||
if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
if (fManager.Interrupted()) {
|
||||
return static_cast<int>(TransferResult::interrupted);
|
||||
} else if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
continue;
|
||||
} else {
|
||||
return -2;
|
||||
return static_cast<int>(TransferResult::timeout);
|
||||
}
|
||||
} else {
|
||||
return HandleErrors();
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
return static_cast<int>(TransferResult::error);
|
||||
}
|
||||
|
||||
int Receive(MessagePtr& msg, const int timeout = -1) override
|
||||
@@ -218,10 +220,12 @@ class Socket final : public fair::mq::Socket
|
||||
++fMessagesRx;
|
||||
return size;
|
||||
} else if (zmq_errno() == EAGAIN || zmq_errno() == EINTR) {
|
||||
if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
if (fManager.Interrupted()) {
|
||||
return static_cast<int>(TransferResult::interrupted);
|
||||
} else if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
continue;
|
||||
} else {
|
||||
return -2;
|
||||
return static_cast<int>(TransferResult::timeout);
|
||||
}
|
||||
} else {
|
||||
return HandleErrors();
|
||||
@@ -249,7 +253,7 @@ class Socket final : public fair::mq::Socket
|
||||
std::memcpy(metas++, &(shmMsg->fMeta), sizeof(MetaHeader));
|
||||
}
|
||||
|
||||
while (!fManager.Interrupted()) {
|
||||
while (true) {
|
||||
int64_t totalSize = 0;
|
||||
int nbytes = zmq_msg_send(zmqMsg.Msg(), fSocket, flags);
|
||||
if (nbytes > 0) {
|
||||
@@ -267,17 +271,19 @@ class Socket final : public fair::mq::Socket
|
||||
|
||||
return totalSize;
|
||||
} else if (zmq_errno() == EAGAIN || zmq_errno() == EINTR) {
|
||||
if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
if (fManager.Interrupted()) {
|
||||
return static_cast<int>(TransferResult::interrupted);
|
||||
} else if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
continue;
|
||||
} else {
|
||||
return -2;
|
||||
return static_cast<int>(TransferResult::timeout);
|
||||
}
|
||||
} else {
|
||||
return HandleErrors();
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
return static_cast<int>(TransferResult::error);
|
||||
}
|
||||
|
||||
int64_t Receive(std::vector<MessagePtr>& msgVec, const int timeout = -1) override
|
||||
@@ -290,7 +296,7 @@ class Socket final : public fair::mq::Socket
|
||||
|
||||
ZMsg zmqMsg;
|
||||
|
||||
while (!fManager.Interrupted()) {
|
||||
while (true) {
|
||||
int64_t totalSize = 0;
|
||||
int nbytes = zmq_msg_recv(zmqMsg.Msg(), fSocket, flags);
|
||||
if (nbytes > 0) {
|
||||
@@ -321,17 +327,19 @@ class Socket final : public fair::mq::Socket
|
||||
|
||||
return totalSize;
|
||||
} else if (zmq_errno() == EAGAIN || zmq_errno() == EINTR) {
|
||||
if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
if (fManager.Interrupted()) {
|
||||
return static_cast<int>(TransferResult::interrupted);
|
||||
} else if (ShouldRetry(flags, timeout, elapsed)) {
|
||||
continue;
|
||||
} else {
|
||||
return -2;
|
||||
return static_cast<int>(TransferResult::timeout);
|
||||
}
|
||||
} else {
|
||||
return HandleErrors();
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
return static_cast<int>(TransferResult::error);
|
||||
}
|
||||
|
||||
void* GetSocket() const { return fSocket; }
|
||||
@@ -498,7 +506,7 @@ class Socket final : public fair::mq::Socket
|
||||
if (constant == "pollout")
|
||||
return ZMQ_POLLOUT;
|
||||
|
||||
return -1;
|
||||
throw SocketError(tools::ToString("GetConstant called with an invalid argument: ", constant));
|
||||
}
|
||||
|
||||
~Socket() override { Close(); }
|
||||
|
Reference in New Issue
Block a user