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 }
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 }