Exemplo n.º 1
0
void HandleError(const leveldb::Status &status) throw(leveldb_error) {
    if (status.ok())
        return;
    if (status.IsCorruption())
        throw leveldb_error("Database corrupted");
    if (status.IsIOError())
        throw leveldb_error("Database I/O error");
    if (status.IsNotFound())
        throw leveldb_error("Database entry missing");
    throw leveldb_error("Unknown database error");
}
Exemplo n.º 2
0
void HandleError(const leveldb::Status &status) noexcept(false) {
    if (status.ok())
        return;
    LogPrintf("%s\n", status.ToString());
    if (status.IsCorruption())
        throw leveldb_error("Database corrupted");
    if (status.IsIOError())
        throw leveldb_error("Database I/O error");
    if (status.IsNotFound())
        throw leveldb_error("Database entry missing");
    throw leveldb_error("Unknown database error");
}
Exemplo n.º 3
0
bool KeyValueStorage::process_status(const leveldb::Status & status, bool reopen) {
	if (status.ok()) {
		return true;
	}
	std::lock_guard<Mutex> lock(mutex);
	error = status.ToString();
	if (status.IsCorruption()) {
		if (++repairs > 2)
			return false;
		errorstream << "Trying to repair database [" << db_name << "] try=" << repairs << " [" << error << "]" << std::endl;
		leveldb::Options options;
		options.create_if_missing = true;
		leveldb::Status status_repair;
		try {
			status_repair = leveldb::RepairDB(fullpath, options);
		} catch (std::exception &e) {
			errorstream << "First repair [" << db_name << "] exception [" << e.what() << "]" << std::endl;
			auto options_repair = options;
			options_repair.paranoid_checks = true;
			try {
				status_repair = leveldb::RepairDB(fullpath, options_repair);
			} catch (std::exception &e) {
				errorstream << "Second repair [" << db_name << "] exception [" << e.what() << "]" << std::endl;
			}
		}
		if (!status.ok()) {
			error = status.ToString();
			errorstream << "Repair [" << db_name << "] fail [" << error << "]" << std::endl;
			delete db;
			db = nullptr;
			return false;
		}
		if (reopen) {
			auto status_open = leveldb::DB::Open(options, fullpath, &db);
			if (!status_open.ok()) {
				error = status_open.ToString();
				errorstream << "Trying to reopen database [" << db_name << "] fail [" << error << "]" << std::endl;
				delete db;
				db = nullptr;
				return false;
			}
		}
	}
	return status.ok();
}
Exemplo n.º 4
0
extern ERL_NIF_TERM make_status_tuple(ErlNifEnv* env, leveldb::Status status){
    const char* type;
    if(status.IsNotFound()){
	type = "not_found";
    }
    else if(status.IsCorruption()){
	type = "corruption";
    }
    else if(status.IsIOError()){
	type = "io_error";
    }
    else{
	type = "unspecified";
    }
    const char* stString = status.ToString().c_str();
    return enif_make_tuple2(env, enif_make_atom(env, "error"),
			    enif_make_atom(env, type));
}
Exemplo n.º 5
0
static void histogramLevelDBError(const char* histogramName, const leveldb::Status& s)
{
    ASSERT(!s.ok());
    enum {
        LevelDBNotFound,
        LevelDBCorruption,
        LevelDBIOError,
        LevelDBOther,
        LevelDBMaxError
    };
    int levelDBError = LevelDBOther;
    if (s.IsNotFound())
        levelDBError = LevelDBNotFound;
    else if (s.IsCorruption())
        levelDBError = LevelDBCorruption;
    else if (s.IsIOError())
        levelDBError = LevelDBIOError;
    HistogramSupport::histogramEnumeration(histogramName, levelDBError, LevelDBMaxError);
}
Exemplo n.º 6
0
void LevelDB::checkDbError(leveldb::Status aStatus) throw(DbException) {
	if (aStatus.ok())
		return;

	if (aStatus.IsNotFound())
		return;

	string ret = Text::toUtf8(aStatus.ToString());

#ifdef _WIN32
	if (aStatus.IsCorruption() || aStatus.IsIOError()) {
		if (ret.back() != '.')
			ret += ".";
		ret += " " + STRING_F(DB_ERROR_HINT, STRING(HASHING));
	}
#endif

	throw DbException(ret);
}