CkIO: Handle errors uniformly
authorPhil Miller <mille121@illinois.edu>
Wed, 10 Jul 2013 18:23:29 +0000 (13:23 -0500)
committerPhil Miller <mille121@illinois.edu>
Tue, 20 Aug 2013 23:28:45 +0000 (18:28 -0500)
src/libs/ck-libs/io/ckio.C

index 6bc22804cdd780a9547cc86d70b39ab37887bf92..86f6f3635b50bff8d95926cf51fb250ad26e1abd 100644 (file)
@@ -1,6 +1,7 @@
 #include <string>
 #include <map>
 #include <algorithm>
+#include <sstream>
 
 typedef int FileToken;
 #include "CkIO.decl.h"
@@ -78,6 +79,14 @@ namespace Ck { namespace IO {
         { }
       };
 
+      void fatalError(std::string desc, std::string file) {
+        std::stringstream out;
+        out << "FATAL ERROR on PE " << CkMyPe()
+            << " working on file '" << file << "': "
+            << desc << "; system reported " << strerror(errno) << std::endl;
+        CkAbort(out.str().c_str());
+      }
+
       class Director : public CBase_Director {
         int filesOpened;
         map<FileToken, impl::FileInfo> files;
@@ -178,7 +187,12 @@ namespace Ck { namespace IO {
         }
 
         void close(FileToken token, CkCallback closed) {
-          ::close(files[token].fd);
+          int ret;
+          do {
+            ret = ::close(files[token].fd);
+          } while (ret < 0 && errno == EINTR);
+          if (ret < 0)
+            fatalError("close failed", files[token].name);
           files.erase(token);
           contribute(closed);
         }
@@ -204,7 +218,7 @@ namespace Ck { namespace IO {
           fd = ::open(name.c_str(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
 #endif
           if (-1 == fd)
-            CkAbort("Failed to open a file for parallel output");
+            fatalError("Failed to open a file for parallel output", name);
           return fd;
         }
 
@@ -291,7 +305,8 @@ namespace Ck { namespace IO {
         }
 
         void syncData() {
-          fdatasync(file->fd);
+          if (fdatasync(file->fd) < 0)
+            fatalError("fdatasync failed", file->name);
           contribute(complete);
         }
 
@@ -305,8 +320,7 @@ namespace Ck { namespace IO {
               if (errno == EINTR) {
                 continue;
               } else {
-                CkPrintf("Output failed on PE %d: %s", CkMyPe(), strerror(errno));
-                CkAbort("Giving up");
+                fatalError("Call to pwrite failed", file->name);
               }
             }
             l -= ret;