状态码
IoTDB 引入了状态码这一概念。例如,因为 IoTDB 需要在写入数据之前首先注册时间序列,一种可能的解决方案是:
try {
writeData();
} catch (SQLException e) {
// the most case is that the time series does not exist
if (e.getMessage().contains("exist")) {
//However, using the content of the error message is not so efficient
registerTimeSeries();
//write data once again
writeData();
}
}
利用状态码,我们就可以不必写诸如if (e.getErrorMessage().contains("exist"))
的代码, 只需要使用e.getStatusType().getCode() == TSStatusCode.TIME_SERIES_NOT_EXIST_ERROR.getStatusCode()
。
这里是状态码和相对应信息的列表:
状态码 | 状态类型 | 状态信息 |
---|---|---|
200 | SUCCESS_STATUS | 成功状态 |
201 | INCOMPATIBLE_VERSION | 版本不兼容 |
202 | CONFIGURATION_ERROR | 配置文件有错误项 |
203 | START_UP_ERROR | 启动错误 |
204 | SHUT_DOWN_ERROR | 关机错误 |
300 | UNSUPPORTED_OPERATION | 不支持的操作 |
301 | EXECUTE_STATEMENT_ERROR | 执行语句错误 |
302 | MULTIPLE_ERROR | 多行语句执行错误 |
303 | ILLEGAL_PARAMETER | 参数错误 |
304 | OVERLAP_WITH_EXISTING_TASK | 与正在执行的其他操作冲突 |
305 | INTERNAL_SERVER_ERROR | 服务器内部错误 |
306 | DISPATCH_ERROR | 分发错误 |
400 | REDIRECTION_RECOMMEND | 推荐客户端重定向 |
500 | DATABASE_NOT_EXIST | 数据库不存在 |
501 | DATABASE_ALREADY_EXISTS | 数据库已存在 |
502 | SERIES_OVERFLOW | 序列数量超过阈值 |
503 | TIMESERIES_ALREADY_EXIST | 时间序列已存在 |
504 | TIMESERIES_IN_BLACK_LIST | 时间序列正在删除 |
505 | ALIAS_ALREADY_EXIST | 路径别名已经存在 |
506 | PATH_ALREADY_EXIST | 路径已经存在 |
507 | METADATA_ERROR | 处理元数据错误 |
508 | PATH_NOT_EXIST | 路径不存在 |
509 | ILLEGAL_PATH | 路径不合法 |
510 | CREATE_TEMPLATE_ERROR | 创建物理量模板失败 |
511 | DUPLICATED_TEMPLATE | 元数据模板重复 |
512 | UNDEFINED_TEMPLATE | 元数据模板未定义 |
513 | TEMPLATE_NOT_SET | 元数据模板未设置 |
514 | DIFFERENT_TEMPLATE | 元数据模板不一致 |
515 | TEMPLATE_IS_IN_USE | 元数据模板正在使用 |
516 | TEMPLATE_INCOMPATIBLE | 元数据模板不兼容 |
517 | SEGMENT_NOT_FOUND | 未找到 Segment |
518 | PAGE_OUT_OF_SPACE | SchemaFile 中 Page 空间不够 |
519 | RECORD_DUPLICATED | 记录重复 |
520 | SEGMENT_OUT_OF_SPACE | SchemaFile 中 segment 空间不够 |
521 | SCHEMA_FILE_NOT_EXISTS | SchemaFile 不存在 |
522 | OVERSIZE_RECORD | 记录大小超过元数据文件页面大小 |
523 | SCHEMA_FILE_REDO_LOG_BROKEN | SchemaFile 的 redo 日志损坏 |
524 | TEMPLATE_NOT_ACTIVATED | 元数据模板未激活 |
600 | SYSTEM_READ_ONLY | IoTDB 系统只读 |
601 | STORAGE_ENGINE_ERROR | 存储引擎相关错误 |
602 | STORAGE_ENGINE_NOT_READY | 存储引擎还在恢复中,还不能接受读写操作 |
603 | DATAREGION_PROCESS_ERROR | DataRegion 相关错误 |
604 | TSFILE_PROCESSOR_ERROR | TsFile 处理器相关错误 |
605 | WRITE_PROCESS_ERROR | 写入相关错误 |
606 | WRITE_PROCESS_REJECT | 写入拒绝错误 |
607 | OUT_OF_TTL | 插入时间少于 TTL 时间边界 |
608 | COMPACTION_ERROR | 合并错误 |
609 | ALIGNED_TIMESERIES_ERROR | 对齐时间序列错误 |
610 | WAL_ERROR | WAL 异常 |
611 | DISK_SPACE_INSUFFICIENT | 磁盘空间不足 |
700 | SQL_PARSE_ERROR | SQL 语句分析错误 |
701 | SEMANTIC_ERROR | SQL 语义错误 |
702 | GENERATE_TIME_ZONE_ERROR | 生成时区错误 |
703 | SET_TIME_ZONE_ERROR | 设置时区错误 |
704 | QUERY_NOT_ALLOWED | 查询语句不允许 |
705 | LOGICAL_OPERATOR_ERROR | 逻辑符相关错误 |
706 | LOGICAL_OPTIMIZE_ERROR | 逻辑优化相关错误 |
707 | UNSUPPORTED_FILL_TYPE | 不支持的填充类型 |
708 | QUERY_PROCESS_ERROR | 查询处理相关错误 |
709 | MPP_MEMORY_NOT_ENOUGH | MPP 框架中任务执行内存不足 |
710 | CLOSE_OPERATION_ERROR | 关闭操作错误 |
711 | TSBLOCK_SERIALIZE_ERROR | TsBlock 序列化错误 |
712 | INTERNAL_REQUEST_TIME_OUT | MPP 操作超时 |
713 | INTERNAL_REQUEST_RETRY_ERROR | 内部操作重试失败 |
714 | NO_SUCH_QUERY | 查询不存在 |
715 | QUERY_WAS_KILLED | 查询执行时被终止 |
800 | UNINITIALIZED_AUTH_ERROR | 授权模块未初始化 |
801 | WRONG_LOGIN_PASSWORD | 用户名或密码错误 |
802 | NOT_LOGIN | 没有登录 |
803 | NO_PERMISSION | 没有操作权限 |
804 | USER_NOT_EXIST | 用户不存在 |
805 | USER_ALREADY_EXIST | 用户已存在 |
806 | USER_ALREADY_HAS_ROLE | 用户拥有对应角色 |
807 | USER_NOT_HAS_ROLE | 用户未拥有对应角色 |
808 | ROLE_NOT_EXIST | 角色不存在 |
809 | ROLE_ALREADY_EXIST | 角色已存在 |
810 | ALREADY_HAS_PRIVILEGE | 已拥有对应权限 |
811 | NOT_HAS_PRIVILEGE | 未拥有对应权限 |
812 | CLEAR_PERMISSION_CACHE_ERROR | 清空权限缓存失败 |
813 | UNKNOWN_AUTH_PRIVILEGE | 未知权限 |
814 | UNSUPPORTED_AUTH_OPERATION | 不支持的权限操作 |
815 | AUTH_IO_EXCEPTION | 权限模块IO异常 |
900 | MIGRATE_REGION_ERROR | Region 迁移失败 |
901 | CREATE_REGION_ERROR | 创建 region 失败 |
902 | DELETE_REGION_ERROR | 删除 region 失败 |
903 | PARTITION_CACHE_UPDATE_ERROR | 更新分区缓存失败 |
904 | CONSENSUS_NOT_INITIALIZED | 共识层未初始化,不能提供服务 |
905 | REGION_LEADER_CHANGE_ERROR | Region leader 迁移失败 |
906 | NO_AVAILABLE_REGION_GROUP | 无法找到可用的 Region 副本组 |
907 | LACK_DATA_PARTITION_ALLOCATION | 调用创建数据分区方法的返回结果里缺少信息 |
1000 | DATANODE_ALREADY_REGISTERED | DataNode 在集群中已经注册 |
1001 | NO_ENOUGH_DATANODE | DataNode 数量不足,无法移除节点或创建副本 |
1002 | ADD_CONFIGNODE_ERROR | 新增 ConfigNode 失败 |
1003 | REMOVE_CONFIGNODE_ERROR | 移除 ConfigNode 失败 |
1004 | DATANODE_NOT_EXIST | 此 DataNode 不存在 |
1005 | DATANODE_STOP_ERROR | DataNode 关闭失败 |
1006 | REMOVE_DATANODE_ERROR | 移除 datanode 失败 |
1007 | REGISTER_DATANODE_WITH_WRONG_ID | 注册的 DataNode 中有错误的注册id |
1008 | CAN_NOT_CONNECT_DATANODE | 连接 DataNode 失败 |
1100 | LOAD_FILE_ERROR | 加载文件错误 |
1101 | LOAD_PIECE_OF_TSFILE_ERROR | 加载 TsFile 片段异常 |
1102 | DESERIALIZE_PIECE_OF_TSFILE_ERROR | 反序列化 TsFile 片段异常 |
1103 | SYNC_CONNECTION_ERROR | 同步连接错误 |
1104 | SYNC_FILE_REDIRECTION_ERROR | 同步文件时重定向异常 |
1105 | SYNC_FILE_ERROR | 同步文件异常 |
1106 | CREATE_PIPE_SINK_ERROR | 创建 PIPE Sink 失败 |
1107 | PIPE_ERROR | PIPE 异常 |
1108 | PIPESERVER_ERROR | PIPE server 异常 |
1109 | VERIFY_METADATA_ERROR | 校验元数据失败 |
1200 | UDF_LOAD_CLASS_ERROR | UDF 加载类异常 |
1201 | UDF_DOWNLOAD_ERROR | 无法从 ConfigNode 下载 UDF |
1202 | CREATE_UDF_ON_DATANODE_ERROR | 在 DataNode 创建 UDF 失败 |
1203 | DROP_UDF_ON_DATANODE_ERROR | 在 DataNode 卸载 UDF 失败 |
1300 | CREATE_TRIGGER_ERROR | ConfigNode 创建 Trigger 失败 |
1301 | DROP_TRIGGER_ERROR | ConfigNode 删除 Trigger 失败 |
1302 | TRIGGER_FIRE_ERROR | 触发器执行错误 |
1303 | TRIGGER_LOAD_CLASS_ERROR | 触发器加载类异常 |
1304 | TRIGGER_DOWNLOAD_ERROR | 从 ConfigNode 下载触发器异常 |
1305 | CREATE_TRIGGER_INSTANCE_ERROR | 创建触发器实例异常 |
1306 | ACTIVE_TRIGGER_INSTANCE_ERROR | 激活触发器实例异常 |
1307 | DROP_TRIGGER_INSTANCE_ERROR | 删除触发器实例异常 |
1308 | UPDATE_TRIGGER_LOCATION_ERROR | 更新有状态的触发器所在 DataNode 异常 |
1400 | NO_SUCH_CQ | CQ 任务不存在 |
1401 | CQ_ALREADY_ACTIVE | CQ 任务已激活 |
1402 | CQ_AlREADY_EXIST | CQ 任务已存在 |
1403 | CQ_UPDATE_LAST_EXEC_TIME_ERROR | CQ 更新上一次执行时间失败 |
在最新版本中,我们重构了 IoTDB 的异常类。通过将错误信息统一提取到异常类中,并为所有异常添加不同的错误代码,从而当捕获到异常并引发更高级别的异常时,错误代码将保留并传递,以便用户了解详细的错误原因。 除此之外,我们添加了一个基础异常类“ProcessException”,由所有异常扩展。