From 974240b635af9cf2b94e2f1f3c02beab662a189d Mon Sep 17 00:00:00 2001 From: Michael Vrable Date: Thu, 20 Nov 2008 15:47:52 -0800 Subject: [PATCH] Drop the use of exceptions for fatal error handling. --- localdb.cc | 27 ++++++++++++++------------- metadata.cc | 2 +- scandir.cc | 2 +- store.cc | 10 +++++----- store.h | 13 ------------- util.h | 2 +- 6 files changed, 22 insertions(+), 34 deletions(-) diff --git a/localdb.cc b/localdb.cc index 7d93bb1..7304d49 100644 --- a/localdb.cc +++ b/localdb.cc @@ -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); diff --git a/metadata.cc b/metadata.cc index 8de1a00..e1ea1aa 100644 --- a/metadata.cc +++ b/metadata.cc @@ -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; diff --git a/scandir.cc b/scandir.cc index ef7833c..f119197 100644 --- a/scandir.cc +++ b/scandir.cc @@ -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"); } } diff --git a/store.cc b/store.cc index bfeb18a..aa69d9e 100644 --- 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 --- a/store.h +++ b/store.h @@ -45,19 +45,6 @@ class LbsObject; * metadata. Currently implemented as map. */ typedef std::map 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 --- 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 -- 2.20.1