Drop the use of exceptions for fatal error handling.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Thu, 20 Nov 2008 23:47:52 +0000 (15:47 -0800)
committerMichael Vrable <mvrable@turin.ucsd.edu>
Thu, 20 Nov 2008 23:47:52 +0000 (15:47 -0800)
localdb.cc
metadata.cc
scandir.cc
store.cc
store.h
util.h

index 7d93bb1..7304d49 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "localdb.h"
 #include "store.h"
+#include "util.h"
 
 using std::min;
 using std::string;
@@ -52,7 +53,7 @@ sqlite3_stmt *LocalDb::Prepare(const char *sql)
     rc = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, &tail);
     if (rc != SQLITE_OK) {
         ReportError(rc);
-        throw IOException(string("Error preparing statement: ") + sql);
+        fatal(string("Error preparing statement: ") + sql);
     }
 
     return stmt;
@@ -73,14 +74,14 @@ void LocalDb::Open(const char *path, const char *snapshot_name,
     if (rc) {
         fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
         sqlite3_close(db);
-        throw IOException("Error opening local database");
+        fatal("Error opening local database");
     }
 
     rc = sqlite3_exec(db, "begin", NULL, NULL, NULL);
     if (rc) {
         fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
         sqlite3_close(db);
-        throw IOException("Error starting transaction");
+        fatal("Error starting transaction");
     }
 
     sqlite3_extended_result_codes(db, 1);
@@ -103,7 +104,7 @@ void LocalDb::Open(const char *path, const char *snapshot_name,
     if (rc != SQLITE_DONE) {
         ReportError(rc);
         sqlite3_close(db);
-        throw IOException("Database execution error!");
+        fatal("Database execution error!");
     }
 
     snapshotid = sqlite3_last_insert_rowid(db);
@@ -111,7 +112,7 @@ void LocalDb::Open(const char *path, const char *snapshot_name,
     if (snapshotid == 0) {
         ReportError(rc);
         sqlite3_close(db);
-        throw IOException("Find snapshot id");
+        fatal("Find snapshot id");
     }
 
     /* Create a temporary table which will be used to keep track of the objects
@@ -126,7 +127,7 @@ void LocalDb::Open(const char *path, const char *snapshot_name,
     if (rc != SQLITE_OK) {
         ReportError(rc);
         sqlite3_close(db);
-        throw IOException("Database initialization");
+        fatal("Database initialization");
     }
     rc = sqlite3_exec(db,
                       "create unique index snapshot_refs_index "
@@ -135,7 +136,7 @@ void LocalDb::Open(const char *path, const char *snapshot_name,
     if (rc != SQLITE_OK) {
         ReportError(rc);
         sqlite3_close(db);
-        throw IOException("Database initialization");
+        fatal("Database initialization");
     }
 }
 
@@ -187,7 +188,7 @@ int64_t LocalDb::SegmentToId(const string &segment)
                       SQLITE_TRANSIENT);
     rc = sqlite3_step(stmt);
     if (rc != SQLITE_DONE) {
-        throw IOException("Could not execute INSERT statement!");
+        fatal("Could not execute INSERT statement!");
     }
     sqlite3_finalize(stmt);
 
@@ -197,11 +198,11 @@ int64_t LocalDb::SegmentToId(const string &segment)
 
     rc = sqlite3_step(stmt);
     if (rc == SQLITE_DONE) {
-        throw IOException("No segment found by id");
+        fatal("No segment found by id");
     } else if (rc == SQLITE_ROW) {
         result = sqlite3_column_int64(stmt, 0);
     } else {
-        throw IOException("Error executing find segment by id query");
+        fatal("Error executing find segment by id query");
     }
 
     sqlite3_finalize(stmt);
@@ -220,11 +221,11 @@ string LocalDb::IdToSegment(int64_t segmentid)
 
     rc = sqlite3_step(stmt);
     if (rc == SQLITE_DONE) {
-        throw IOException("No segment found by id");
+        fatal("No segment found by id");
     } else if (rc == SQLITE_ROW) {
         result = (const char *)sqlite3_column_text(stmt, 0);
     } else {
-        throw IOException("Error executing find segment by id query");
+        fatal("Error executing find segment by id query");
     }
 
     sqlite3_finalize(stmt);
@@ -586,7 +587,7 @@ void LocalDb::StoreChunkSignatures(ObjectReference ref,
         fprintf(stderr,
                 "Could not determine blockid in StoreChunkSignatures!\n");
         ReportError(rc);
-        throw IOException("Error getting blockid");
+        fatal("Error getting blockid");
     }
     int64_t blockid = sqlite3_column_int64(stmt, 0);
     sqlite3_finalize(stmt);
index 8de1a00..e1ea1aa 100644 (file)
@@ -128,7 +128,7 @@ MetadataWriter::MetadataWriter(TarSegmentStore *store,
     if (statcache_out == NULL) {
         fprintf(stderr, "Error opening statcache %s: %m\n",
                 statcache_tmp_path.c_str());
-        throw IOException("Error opening statcache");
+        fatal("Error opening statcache");
     }
 
     old_metadata_eof = false;
index ef7833c..f119197 100644 (file)
@@ -925,7 +925,7 @@ int main(int argc, char *argv[])
         waitpid(signature_pid, &status, 0);
 
         if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-            throw IOException("Signature filter process error");
+            fatal("Signature filter process error");
         }
     }
 
index bfeb18a..aa69d9e 100644 (file)
--- a/store.cc
+++ b/store.cc
@@ -77,14 +77,14 @@ Tarfile::~Tarfile()
     tar_write(buf, TAR_BLOCK_SIZE);
 
     if (close(filter_fd) != 0)
-        throw IOException("Error closing Tarfile");
+        fatal("Error closing Tarfile");
 
     /* ...and wait for filter process to finish. */
     int status;
     waitpid(filter_pid, &status, 0);
 
     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-        throw IOException("Filter process error");
+        fatal("Filter process error");
     }
 
     close(real_fd);
@@ -101,13 +101,13 @@ int spawn_filter(int fd_out, const char *program, pid_t *filter_pid)
 
     /* Create a pipe for communicating with the filter process. */
     if (pipe(fds) < 0) {
-        throw IOException("Unable to create pipe for filter");
+        fatal("Unable to create pipe for filter");
     }
 
     /* Create a child process which can exec() the filter program. */
     pid = fork();
     if (pid < 0)
-        throw IOException("Unable to fork filter process");
+        fatal("Unable to fork filter process");
 
     if (pid > 0) {
         /* Parent process */
@@ -150,7 +150,7 @@ void Tarfile::tar_write(const char *data, size_t len)
             if (errno == EINTR)
                 continue;
             fprintf(stderr, "Write error: %m\n");
-            throw IOException("Write error");
+            fatal("Write error");
         }
 
         len -= res;
diff --git a/store.h b/store.h
index 656659d..aa98e30 100644 (file)
--- a/store.h
+++ b/store.h
@@ -45,19 +45,6 @@ class LbsObject;
  * metadata.  Currently implemented as map<string, string>. */
 typedef std::map<std::string, std::string> dictionary;
 
-/* IOException will be thrown if an error occurs while reading or writing in
- * one of the I/O wrappers.  Depending upon the context; this may be fatal or
- * not--typically, errors reading/writing the store will be serious, but errors
- * reading an individual file are less so. */
-class IOException : public std::exception {
-private:
-    std::string error;
-public:
-    explicit IOException(const std::string &err) { error = err; }
-    virtual ~IOException() throw () { }
-    std::string getError() const { return error; }
-};
-
 /* Simplified TAR header--we only need to store regular files, don't need to
  * handle long filenames, etc. */
 static const int TAR_BLOCK_SIZE = 512;
diff --git a/util.h b/util.h
index 5922a42..38596b5 100644 (file)
--- a/util.h
+++ b/util.h
@@ -35,6 +35,6 @@ std::string encode_int(long long n, int base=10);
 long long parse_int(const std::string &s);
 void cloexec(int fd);
 
-void fatal(std::string msg);
+void fatal(std::string msg) __attribute__((noreturn));
 
 #endif // _LBS_TARSTORE_H