Error.cc

Go to the documentation of this file.
00001 
00022 #include "Common/Compat.h"
00023 #include "Common/HashMap.h"
00024 
00025 #include "Error.h"
00026 
00027 using namespace Hypertable;
00028 
00029 namespace {
00030   struct ErrorInfo {
00031     int          code;
00032     const char  *text;
00033   };
00034 
00035   ErrorInfo error_info[] = {
00036     { Error::UNPOSSIBLE,                  "But that's unpossible!" },
00037     { Error::EXTERNAL,                    "External error" },
00038     { Error::FAILED_EXPECTATION,          "HYPERTABLE failed expectation" },
00039     { Error::OK,                          "HYPERTABLE ok" },
00040     { Error::PROTOCOL_ERROR,              "HYPERTABLE protocol error" },
00041     { Error::REQUEST_TRUNCATED,           "HYPERTABLE request truncated" },
00042     { Error::RESPONSE_TRUNCATED,          "HYPERTABLE response truncated" },
00043     { Error::REQUEST_TIMEOUT,             "HYPERTABLE request timeout" },
00044     { Error::LOCAL_IO_ERROR,              "HYPERTABLE local i/o error" },
00045     { Error::BAD_ROOT_LOCATION,           "HYPERTABLE bad root location" },
00046     { Error::BAD_SCHEMA,                  "HYPERTABLE bad schema" },
00047     { Error::INVALID_METADATA,            "HYPERTABLE invalid metadata" },
00048     { Error::BAD_KEY,                     "HYPERTABLE bad key" },
00049     { Error::METADATA_NOT_FOUND,          "HYPERTABLE metadata not found" },
00050     { Error::HQL_PARSE_ERROR,             "HYPERTABLE HQL parse error" },
00051     { Error::FILE_NOT_FOUND,              "HYPERTABLE file not found" },
00052     { Error::BLOCK_COMPRESSOR_UNSUPPORTED_TYPE,
00053         "HYPERTABLE block compressor unsupported type" },
00054     { Error::BLOCK_COMPRESSOR_INVALID_ARG,
00055         "HYPERTABLE block compressor invalid arg" },
00056     { Error::BLOCK_COMPRESSOR_TRUNCATED,
00057         "HYPERTABLE block compressor block truncated" },
00058     { Error::BLOCK_COMPRESSOR_BAD_HEADER,
00059         "HYPERTABLE block compressor bad block header" },
00060     { Error::BLOCK_COMPRESSOR_BAD_MAGIC,
00061         "HYPERTABLE block compressor bad magic string" },
00062     { Error::BLOCK_COMPRESSOR_CHECKSUM_MISMATCH,
00063         "HYPERTABLE block compressor block checksum mismatch" },
00064     { Error::BLOCK_COMPRESSOR_INFLATE_ERROR,
00065         "HYPERTABLE block compressor inflate error" },
00066     { Error::BLOCK_COMPRESSOR_INIT_ERROR,
00067         "HYPERTABLE block compressor initialization error" },
00068     { Error::TABLE_NOT_FOUND,             "HYPERTABLE table does not exist" },
00069     { Error::COMMAND_PARSE_ERROR,         "HYPERTABLE command parse error" },
00070     { Error::CONNECT_ERROR_MASTER,        "HYPERTABLE Master connect error" },
00071     { Error::CONNECT_ERROR_HYPERSPACE,
00072         "HYPERTABLE Hyperspace client connect error" },
00073     { Error::TOO_MANY_COLUMNS,            "HYPERTABLE too many columns" },
00074     { Error::BAD_DOMAIN_NAME,             "HYPERTABLE bad domain name" },
00075     { Error::MALFORMED_REQUEST,           "HYPERTABLE malformed request" },
00076     { Error::BAD_MEMORY_ALLOCATION,       "HYPERTABLE bad memory allocation"},
00077     { Error::BAD_SCAN_SPEC,               "HYPERTABLE bad scan specification"},
00078     { Error::NOT_IMPLEMENTED,             "HYPERTABLE not implemented"},
00079     { Error::VERSION_MISMATCH,            "HYPERTABLE version mismatch"},
00080     { Error::CANCELLED,                   "HYPERTABLE cancelled"},
00081     { Error::SCHEMA_PARSE_ERROR,          "HYPERTABLE schema parse error" },
00082     { Error::SYNTAX_ERROR,                "HYPERTABLE syntax error" },
00083     { Error::DOUBLE_UNGET,                  "HYPERTABLE double unget" },
00084     { Error::EMPTY_BLOOMFILTER,             "HYPERTABLE empty bloom filter" },
00085     { Error::BLOOMFILTER_CHECKSUM_MISMATCH, "HYPERTABLE bloom filter checksum mismatch" },
00086     { Error::NAME_ALREADY_IN_USE,           "HYPERTABLE name already in use" },
00087     { Error::NAMESPACE_DOES_NOT_EXIST,      "HYPERTABLE namespace does not exist" },
00088     { Error::BAD_NAMESPACE,                 "HYPERTABLE bad namespace" },
00089     { Error::NAMESPACE_EXISTS,              "HYPERTABLE namespace exists" },
00090     { Error::NO_RESPONSE,                   "HYPERTABLE no response" },
00091     { Error::NOT_ALLOWED,                   "HYPERTABLE not allowed" },
00092     { Error::INDUCED_FAILURE,               "HYPERTABLE induced failure" },
00093     { Error::CONFIG_BAD_ARGUMENT,         "CONFIG bad argument(s)"},
00094     { Error::CONFIG_BAD_CFG_FILE,         "CONFIG bad cfg file"},
00095     { Error::CONFIG_GET_ERROR,            "CONFIG failed to get config value"},
00096     { Error::CONFIG_BAD_VALUE,            "CONFIG bad config value"},
00097     { Error::COMM_NOT_CONNECTED,          "COMM not connected" },
00098     { Error::COMM_BROKEN_CONNECTION,      "COMM broken connection" },
00099     { Error::COMM_CONNECT_ERROR,          "COMM connect error" },
00100     { Error::COMM_ALREADY_CONNECTED,      "COMM already connected" },
00101     { Error::COMM_SEND_ERROR,             "COMM send error" },
00102     { Error::COMM_RECEIVE_ERROR,          "COMM receive error" },
00103     { Error::COMM_POLL_ERROR,             "COMM poll error" },
00104     { Error::COMM_CONFLICTING_ADDRESS,    "COMM conflicting address" },
00105     { Error::COMM_SOCKET_ERROR,           "COMM socket error" },
00106     { Error::COMM_BIND_ERROR,             "COMM bind error" },
00107     { Error::COMM_LISTEN_ERROR,           "COMM listen error" },
00108     { Error::COMM_HEADER_CHECKSUM_MISMATCH,  "COMM header checksum mismatch" },
00109     { Error::COMM_PAYLOAD_CHECKSUM_MISMATCH, "COMM payload checksum mismatch" },
00110     { Error::COMM_BAD_HEADER,             "COMM bad header" },
00111     { Error::COMM_INVALID_PROXY,          "COMM invalid proxy" },
00112     { Error::DFSBROKER_BAD_FILE_HANDLE,   "DFS BROKER bad file handle" },
00113     { Error::DFSBROKER_IO_ERROR,          "DFS BROKER i/o error" },
00114     { Error::DFSBROKER_FILE_NOT_FOUND,    "DFS BROKER file not found" },
00115     { Error::DFSBROKER_BAD_FILENAME,      "DFS BROKER bad filename" },
00116     { Error::DFSBROKER_PERMISSION_DENIED, "DFS BROKER permission denied" },
00117     { Error::DFSBROKER_INVALID_ARGUMENT,  "DFS BROKER invalid argument" },
00118     { Error::DFSBROKER_INVALID_CONFIG,    "DFS BROKER invalid config value" },
00119     { Error::DFSBROKER_EOF,               "DFS BROKER end of file" },
00120     { Error::HYPERSPACE_IO_ERROR,         "HYPERSPACE i/o error" },
00121     { Error::HYPERSPACE_CREATE_FAILED,    "HYPERSPACE create failed" },
00122     { Error::HYPERSPACE_FILE_NOT_FOUND,   "HYPERSPACE file not found" },
00123     { Error::HYPERSPACE_ATTR_NOT_FOUND,   "HYPERSPACE attribute not found" },
00124     { Error::HYPERSPACE_DELETE_ERROR,     "HYPERSPACE delete error" },
00125     { Error::HYPERSPACE_BAD_PATHNAME,     "HYPERSPACE bad pathname" },
00126     { Error::HYPERSPACE_PERMISSION_DENIED,"HYPERSPACE permission denied" },
00127     { Error::HYPERSPACE_EXPIRED_SESSION,  "HYPERSPACE expired session" },
00128     { Error::HYPERSPACE_FILE_EXISTS,      "HYPERSPACE file exists" },
00129     { Error::HYPERSPACE_IS_DIRECTORY,     "HYPERSPACE is directory" },
00130     { Error::HYPERSPACE_INVALID_HANDLE,   "HYPERSPACE invalid handle" },
00131     { Error::HYPERSPACE_REQUEST_CANCELLED,"HYPERSPACE request cancelled" },
00132     { Error::HYPERSPACE_MODE_RESTRICTION, "HYPERSPACE mode restriction" },
00133     { Error::HYPERSPACE_ALREADY_LOCKED,   "HYPERSPACE already locked" },
00134     { Error::HYPERSPACE_LOCK_CONFLICT,    "HYPERSPACE lock conflict" },
00135     { Error::HYPERSPACE_NOT_LOCKED,       "HYPERSPACE not locked" },
00136     { Error::HYPERSPACE_BAD_ATTRIBUTE,    "HYPERSPACE bad attribute" },
00137     { Error::HYPERSPACE_BERKELEYDB_ERROR, "HYPERSPACE Berkeley DB error" },
00138     { Error::HYPERSPACE_DIR_NOT_EMPTY,    "HYPERSPACE directory not empty" },
00139     { Error::HYPERSPACE_BERKELEYDB_DEADLOCK,
00140         "HYPERSPACE Berkeley DB deadlock" },
00141     { Error::HYPERSPACE_BERKELEYDB_REP_HANDLE_DEAD,
00142         "HYPERSPACE Berkeley DB replication handle dead" },
00143     { Error::HYPERSPACE_FILE_OPEN,        "HYPERSPACE file open" },
00144     { Error::HYPERSPACE_CLI_PARSE_ERROR,  "HYPERSPACE CLI parse error" },
00145     { Error::HYPERSPACE_CREATE_SESSION_FAILED,
00146         "HYPERSPACE unable to create session " },
00147     { Error::HYPERSPACE_NOT_MASTER_LOCATION,
00148         "HYPERSPACE not master location" },
00149 
00150     { Error::HYPERSPACE_STATEDB_ERROR,
00151         "HYPERSPACE State DB error" },
00152     { Error::HYPERSPACE_STATEDB_DEADLOCK,
00153         "HYPERSPACE State DB deadlock" },
00154     { Error::HYPERSPACE_STATEDB_BAD_KEY,
00155         "HYPERSPACE State DB bad key" },
00156     { Error::HYPERSPACE_STATEDB_BAD_VALUE,
00157         "HYPERSPACE State DB bad value" },
00158     { Error::HYPERSPACE_STATEDB_ALREADY_DELETED,
00159         "HYPERSPACE State DB attempt to access/delete previously deleted state" },
00160     { Error::HYPERSPACE_STATEDB_EVENT_EXISTS,
00161         "HYPERSPACE State DB event exists" },
00162     { Error::HYPERSPACE_STATEDB_EVENT_NOT_EXISTS,
00163         "HYPERSPACE State DB event does not exist" },
00164     { Error::HYPERSPACE_STATEDB_EVENT_ATTR_NOT_FOUND,
00165         "HYPERSPACE State DB event attr not found" },
00166     { Error::HYPERSPACE_STATEDB_SESSION_EXISTS,
00167         "HYPERSPACE State DB session exists" },
00168     { Error::HYPERSPACE_STATEDB_SESSION_NOT_EXISTS,
00169         "HYPERSPACE State DB session does not exist" },
00170     { Error::HYPERSPACE_STATEDB_SESSION_ATTR_NOT_FOUND,
00171         "HYPERSPACE State DB session attr not found" },
00172     { Error::HYPERSPACE_STATEDB_HANDLE_EXISTS,
00173         "HYPERSPACE State DB handle exists" },
00174     { Error::HYPERSPACE_STATEDB_HANDLE_NOT_EXISTS,
00175         "HYPERSPACE State DB handle does not exist" },
00176     { Error::HYPERSPACE_STATEDB_HANDLE_ATTR_NOT_FOUND,
00177         "HYPERSPACE State DB handle attr not found" },
00178     { Error::HYPERSPACE_STATEDB_NODE_EXISTS,
00179         "HYPERSPACE State DB node exists" },
00180     { Error::HYPERSPACE_STATEDB_NODE_NOT_EXISTS,
00181         "HYPERSPACE State DB node does not exist" },
00182     { Error::HYPERSPACE_STATEDB_NODE_ATTR_NOT_FOUND,
00183         "HYPERSPACE State DB node attr not found" },
00184 
00185     { Error::MASTER_TABLE_EXISTS,         "MASTER table exists" },
00186     { Error::MASTER_BAD_SCHEMA,           "MASTER bad schema" },
00187     { Error::MASTER_NOT_RUNNING,          "MASTER not running" },
00188     { Error::MASTER_NO_RANGESERVERS,      "MASTER no range servers" },
00189     { Error::MASTER_FILE_NOT_LOCKED,      "MASTER file not locked" },
00190     { Error::MASTER_RANGESERVER_ALREADY_REGISTERED ,
00191         "MASTER range server with same location already registered" },
00192     { Error::MASTER_BAD_COLUMN_FAMILY,    "MASTER bad column family" },
00193     { Error::MASTER_SCHEMA_GENERATION_MISMATCH,
00194         "Master schema generation mismatch" },
00195     { Error::MASTER_LOCATION_ALREADY_ASSIGNED,
00196       "MASTER location already assigned" },
00197     { Error::MASTER_LOCATION_INVALID, "MASTER location invalid" },
00198     { Error::MASTER_OPERATION_IN_PROGRESS, "MASTER operation in progress" },
00199 
00200     { Error::RANGESERVER_GENERATION_MISMATCH,
00201         "RANGE SERVER generation mismatch" },
00202     { Error::RANGESERVER_RANGE_ALREADY_LOADED,
00203         "RANGE SERVER range already loaded" },
00204     { Error::RANGESERVER_RANGE_MISMATCH,       "RANGE SERVER range mismatch" },
00205     { Error::RANGESERVER_NONEXISTENT_RANGE,
00206         "RANGE SERVER non-existent range" },
00207     { Error::RANGESERVER_OUT_OF_RANGE,         "RANGE SERVER out of range" },
00208     { Error::RANGESERVER_RANGE_NOT_FOUND,      "RANGE SERVER range not found" },
00209     { Error::RANGESERVER_INVALID_SCANNER_ID,
00210         "RANGE SERVER invalid scanner id" },
00211     { Error::RANGESERVER_SCHEMA_PARSE_ERROR,
00212         "RANGE SERVER schema parse error" },
00213     { Error::RANGESERVER_SCHEMA_INVALID_CFID,
00214         "RANGE SERVER invalid column family id" },
00215     { Error::RANGESERVER_INVALID_COLUMNFAMILY,
00216         "RANGE SERVER invalid column family" },
00217     { Error::RANGESERVER_TRUNCATED_COMMIT_LOG,
00218         "RANGE SERVER truncated commit log" },
00219     { Error::RANGESERVER_NO_METADATA_FOR_RANGE,
00220         "RANGE SERVER no metadata for range" },
00221     { Error::RANGESERVER_SHUTTING_DOWN,        "RANGE SERVER shutting down" },
00222     { Error::RANGESERVER_CORRUPT_COMMIT_LOG,
00223         "RANGE SERVER corrupt commit log" },
00224     { Error::RANGESERVER_UNAVAILABLE,          "RANGE SERVER unavailable" },
00225     { Error::RANGESERVER_REVISION_ORDER_ERROR,
00226         "RANGE SERVER supplied revision is not strictly increasing" },
00227     { Error::RANGESERVER_ROW_OVERFLOW,         "RANGE SERVER row overflow" },
00228     { Error::RANGESERVER_TABLE_NOT_FOUND,      "RANGE SERVER table not found" },
00229     { Error::RANGESERVER_BAD_SCAN_SPEC,
00230         "RANGE SERVER bad scan specification" },
00231     { Error::RANGESERVER_CLOCK_SKEW,
00232         "RANGE SERVER clock skew detected" },
00233     { Error::RANGESERVER_BAD_CELLSTORE_FILENAME,
00234         "RANGE SERVER bad CellStore filename" },
00235     { Error::RANGESERVER_CORRUPT_CELLSTORE,
00236         "RANGE SERVER corrupt CellStore" },
00237     { Error::RANGESERVER_TABLE_DROPPED, "RANGE SERVER table dropped" },
00238     { Error::RANGESERVER_UNEXPECTED_TABLE_ID, "RANGE SERVER unexpected table ID" },
00239     { Error::RANGESERVER_RANGE_BUSY, "RANGE SERVER range busy" },
00240     { Error::RANGESERVER_BAD_CELL_INTERVAL, "RANGE SERVER bad cell interval" },
00241     { Error::RANGESERVER_SHORT_CELLSTORE_READ, "RANGE SERVER short cellstore read" },
00242     { Error::HQL_BAD_LOAD_FILE_FORMAT,         "HQL bad load file format" },
00243     { Error::METALOG_BAD_RS_HEADER, "METALOG bad range server metalog header" },
00244     { Error::METALOG_BAD_HEADER,  "METALOG bad metalog header" },
00245     { Error::METALOG_ENTRY_TRUNCATED,   "METALOG entry truncated" },
00246     { Error::METALOG_CHECKSUM_MISMATCH, "METALOG checksum mismatch" },
00247     { Error::METALOG_ENTRY_BAD_TYPE, "METALOG bad entry type" },
00248     { Error::METALOG_ENTRY_BAD_ORDER, "METALOG entry out of order" },
00249     { Error::SERIALIZATION_INPUT_OVERRUN,
00250         "SERIALIZATION input buffer overrun" },
00251     { Error::SERIALIZATION_BAD_VINT,      "SERIALIZATION bad vint encoding" },
00252     { Error::SERIALIZATION_BAD_VSTR,      "SERIALIZATION bad vstr encoding" },
00253     { Error::THRIFTBROKER_BAD_SCANNER_ID, "THRIFT BROKER bad scanner id" },
00254     { Error::THRIFTBROKER_BAD_MUTATOR_ID, "THRIFT BROKER bad mutator id" },
00255     { Error::THRIFTBROKER_BAD_NAMESPACE_ID , "THRIFT BROKER bad namespace id" },
00256     { Error::THRIFTBROKER_BAD_FUTURE_ID ,    "THRIFT BROKER bad future id" },
00257     { 0, 0 }
00258   };
00259 
00260   typedef hash_map<int, const char *>  TextMap;
00261 
00262   TextMap &build_text_map() {
00263     TextMap *map = new TextMap();
00264     for (int i=0; error_info[i].text != 0; i++)
00265       (*map)[error_info[i].code] = error_info[i].text;
00266     return *map;
00267   }
00268 
00269   TextMap &text_map = build_text_map();
00270 
00271 } // local namespace
00272 
00273 const char *Error::get_text(int error) {
00274   const char *text = text_map[error];
00275   if (text == 0)
00276     return "ERROR NOT REGISTERED";
00277   return text;
00278 }
00279 
00280 namespace Hypertable {
00281 
00282 std::ostream &operator<<(std::ostream &out, const Exception &e) {
00283   out <<"Hypertable::Exception: "<< e.message() <<" - "
00284       << Error::get_text(e.code());
00285 
00286   if (e.line())
00287     out <<"\n\tat "<< e.func() <<" ("<< e.file() <<':'<< e.line() <<')';
00288 
00289   int prev_code = e.code();
00290 
00291   for (Exception *prev = e.prev; prev; prev = prev->prev) {
00292     out <<"\n\tat "<< (prev->func() ? prev->func() : "-") <<" ("
00293         << (prev->file() ? prev->file() : "-") <<':'<< prev->line() <<"): "
00294         << prev->message();
00295 
00296     if (prev->code() != prev_code) {
00297       out <<" - "<< Error::get_text(prev->code());
00298       prev_code = prev->code();
00299     }
00300   }
00301   return out;
00302 }
00303 
00304 std::ostream &
00305 Exception::render_messages(std::ostream &out, const char *sep) const {
00306   out << message() <<" - "<< Error::get_text(m_error);
00307 
00308   for (Exception *p = prev; p; p = p->prev)
00309     out << sep << p->message();
00310 
00311   return out;
00312 }
00313 
00314 } // namespace Hypertable