From 571ead77f7b7427709dd4433acd7d2703b94033c Mon Sep 17 00:00:00 2001
From: Carsten Patzke <carsten.patzke@desy.de>
Date: Thu, 16 Apr 2020 16:14:17 +0200
Subject: [PATCH] Replaced Fabric's timeout error with standard IO timeout
 error

---
 common/cpp/include/asapo_fabric/fabric_error.h            | 5 -----
 .../cpp/src/asapo_fabric/common/fabric_context_impl.cpp   | 8 ++++----
 common/cpp/src/asapo_fabric/common/fabric_context_impl.h  | 2 +-
 .../src/asapo_fabric/common/task/fabric_waitable_task.cpp | 3 ++-
 common/cpp/src/system_io/system_io_linux_mac.cpp          | 2 ++
 consumer/api/cpp/src/fabric_consumer_client.h             | 1 +
 tests/automatic/asapo_fabric/timeout_test.cpp             | 3 ++-
 tests/manual/asapo_fabric/fabric_server.cpp               | 2 +-
 8 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/common/cpp/include/asapo_fabric/fabric_error.h b/common/cpp/include/asapo_fabric/fabric_error.h
index 854d677f4..3c15ea604 100644
--- a/common/cpp/include/asapo_fabric/fabric_error.h
+++ b/common/cpp/include/asapo_fabric/fabric_error.h
@@ -11,7 +11,6 @@ enum class FabricErrorType {
     kInternalConnectionError, // This might occur when the connection is unexpectedly closed
     kNoDeviceFound,
     kClientNotInitialized,
-    kTimeout,
     kConnectionRefused,
 };
 
@@ -39,10 +38,6 @@ auto const kClientNotInitializedError = FabricErrorTemplate {
     "The client was not initialized. Add server address first!",
     FabricErrorType::kClientNotInitialized
 };
-auto const kTimeout = FabricErrorTemplate {
-    "Timeout",
-    FabricErrorType::kTimeout
-};
 auto const kConnectionRefusedError = FabricErrorTemplate {
     "Connection refused",
     FabricErrorType::kConnectionRefused
diff --git a/common/cpp/src/asapo_fabric/common/fabric_context_impl.cpp b/common/cpp/src/asapo_fabric/common/fabric_context_impl.cpp
index b4cac75c1..c4b88a377 100644
--- a/common/cpp/src/asapo_fabric/common/fabric_context_impl.cpp
+++ b/common/cpp/src/asapo_fabric/common/fabric_context_impl.cpp
@@ -284,13 +284,13 @@ void FabricContextImpl::InternalWait(FabricAddress targetAddress, FabricWaitable
     // Check if we simply can wait for our task
     task->Wait(requestTimeoutMs_, error);
 
-    if (*error == FabricErrorTemplates::kTimeout) {
+    if (*error == IOErrorTemplates::kTimeout) {
         if (targetAddress == FI_ASAPO_ADDR_NO_ALIVE_CHECK) {
             CancelTask(task, error);
             // We expect the task to fail with 'Operation canceled'
             if (*error == FabricErrorTemplates::kInternalOperationCanceledError) {
                 // Switch it to a timeout so its more clearly what happened
-                *error = FabricErrorTemplates::kTimeout.Generate();
+                *error = IOErrorTemplates::kTimeout.Generate();
             }
         } else {
             InternalWaitWithAliveCheck(targetAddress, task, error);
@@ -301,7 +301,7 @@ void FabricContextImpl::InternalWait(FabricAddress targetAddress, FabricWaitable
 void FabricContextImpl::InternalWaitWithAliveCheck(FabricAddress targetAddress, FabricWaitableTask* task,
         Error* error) {// Handle advanced alive check
     bool aliveCheckFailed = false;
-    for (uint32_t i = 0; i < maxTimeoutRetires_ && *error == FabricErrorTemplates::kTimeout; i++) {
+    for (uint32_t i = 0; i < maxTimeoutRetires_ && *error == IOErrorTemplates::kTimeout; i++) {
         *error = nullptr;
         printf("HandleFiCommandAndWait - Tries: %d\n", i);
         if (!TargetIsAliveCheck(targetAddress)) {
@@ -316,7 +316,7 @@ void FabricContextImpl::InternalWaitWithAliveCheck(FabricAddress targetAddress,
     if (aliveCheckFailed) {
         *error = FabricErrorTemplates::kInternalConnectionError.Generate();
     } else if(*error == FabricErrorTemplates::kInternalOperationCanceledError) {
-        *error = FabricErrorTemplates::kTimeout.Generate();
+        *error = IOErrorTemplates::kTimeout.Generate();
     }
 }
 
diff --git a/common/cpp/src/asapo_fabric/common/fabric_context_impl.h b/common/cpp/src/asapo_fabric/common/fabric_context_impl.h
index 8d51c4cb1..12fc38d3e 100644
--- a/common/cpp/src/asapo_fabric/common/fabric_context_impl.h
+++ b/common/cpp/src/asapo_fabric/common/fabric_context_impl.h
@@ -141,7 +141,7 @@ class FabricContextImpl : public FabricContext {
             // Success
             break;
         case FI_EAGAIN: // We felt trough our own timeout loop
-            *error = FabricErrorTemplates::kTimeout.Generate();
+            *error = IOErrorTemplates::kTimeout.Generate();
             break;
         case FI_ENOENT:
             *error = FabricErrorTemplates::kConnectionRefusedError.Generate();
diff --git a/common/cpp/src/asapo_fabric/common/task/fabric_waitable_task.cpp b/common/cpp/src/asapo_fabric/common/task/fabric_waitable_task.cpp
index 47efa2fe8..e4a13b07f 100644
--- a/common/cpp/src/asapo_fabric/common/task/fabric_waitable_task.cpp
+++ b/common/cpp/src/asapo_fabric/common/task/fabric_waitable_task.cpp
@@ -1,3 +1,4 @@
+#include <common/io_error.h>
 #include "fabric_waitable_task.h"
 #include "../../fabric_internal_error.h"
 
@@ -21,7 +22,7 @@ void FabricWaitableTask::HandleErrorCompletion(const fi_cq_err_entry* errEntry)
 void FabricWaitableTask::Wait(uint32_t sleepInMs, Error* error) {
     if (sleepInMs) {
         if (future_.wait_for(std::chrono::milliseconds(sleepInMs)) == std::future_status::timeout) {
-            *error = FabricErrorTemplates::kTimeout.Generate();
+            *error = IOErrorTemplates::kTimeout.Generate();
             return;
         }
     } else {
diff --git a/common/cpp/src/system_io/system_io_linux_mac.cpp b/common/cpp/src/system_io/system_io_linux_mac.cpp
index aa8d193ae..43137367a 100644
--- a/common/cpp/src/system_io/system_io_linux_mac.cpp
+++ b/common/cpp/src/system_io/system_io_linux_mac.cpp
@@ -31,6 +31,8 @@ Error GetLastErrorFromErrno() {
     switch (errno) {
     case 0:
         return nullptr;
+    case EINTR:
+        return TextError("Interrupt occurred, is a debugger attached?");
     case EBADF:
         return IOErrorTemplates::kBadFileNumber.Generate();
     case EAGAIN:
diff --git a/consumer/api/cpp/src/fabric_consumer_client.h b/consumer/api/cpp/src/fabric_consumer_client.h
index 1f98c5913..a852b1ba3 100644
--- a/consumer/api/cpp/src/fabric_consumer_client.h
+++ b/consumer/api/cpp/src/fabric_consumer_client.h
@@ -7,6 +7,7 @@
 #include <mutex>
 #include "asapo_fabric/asapo_fabric.h"
 #include "net_client.h"
+#include "common/networking.h"
 
 namespace asapo {
 
diff --git a/tests/automatic/asapo_fabric/timeout_test.cpp b/tests/automatic/asapo_fabric/timeout_test.cpp
index 42abd6408..0e2ab643b 100644
--- a/tests/automatic/asapo_fabric/timeout_test.cpp
+++ b/tests/automatic/asapo_fabric/timeout_test.cpp
@@ -4,6 +4,7 @@
 #include <logger/logger.h>
 #include <testing.h>
 #include <asapo_fabric/asapo_fabric.h>
+#include <common/io_error.h>
 
 using namespace asapo;
 using namespace fabric;
@@ -64,7 +65,7 @@ void ClientThread(const std::string& hostname, uint16_t port) {
               "The following call might take a while since its able to reach the server but the server is not responding"
               << std::endl;
     client->Recv(serverAddress, 0, &dummyBuffer, sizeof(dummyBuffer), &err);
-    M_AssertEq(FabricErrorTemplates::kTimeout, err, "client->Recv");
+    M_AssertEq(IOErrorTemplates::kTimeout, err, "client->Recv");
     err = nullptr;
 
     serverShutdown.set_value();
diff --git a/tests/manual/asapo_fabric/fabric_server.cpp b/tests/manual/asapo_fabric/fabric_server.cpp
index fb973398b..2b55cfd3a 100644
--- a/tests/manual/asapo_fabric/fabric_server.cpp
+++ b/tests/manual/asapo_fabric/fabric_server.cpp
@@ -16,7 +16,7 @@ void ServerThread(FabricServer* server, size_t bufferSize, FileData* buffer) {
         GenericRequestHeader request;
 
         server->RecvAny(&clientAddress, &messageId, &request, sizeof(request), &error);
-        if (error == FabricErrorTemplates::kTimeout) {
+        if (error == IOErrorTemplates::kTimeout) {
             error = nullptr;
             continue;
         }
-- 
GitLab