This is an automated email from the ASF dual-hosted git repository. rnewson pushed a commit to branch fdb-error-handling in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit d975bb76a812fc1baa1d30560a6ea8b944016fe6 Author: Robert Newson <[email protected]> AuthorDate: Wed Jan 27 15:15:21 2021 +0000 Handle all erlfdb error codes --- src/chttpd/src/chttpd.erl | 168 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 158 insertions(+), 10 deletions(-) diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl index 0c5e272..f091c23 100644 --- a/src/chttpd/src/chttpd.erl +++ b/src/chttpd/src/chttpd.erl @@ -362,10 +362,8 @@ catch_error(HttpReq, error, decryption_failed) -> send_error(HttpReq, decryption_failed); catch_error(HttpReq, error, not_ciphertext) -> send_error(HttpReq, not_ciphertext); -catch_error(HttpReq, error, {erlfdb_error, 2101}) -> - send_error(HttpReq, transaction_too_large); -catch_error(HttpReq, error, {erlfdb_error, 1031}) -> - send_error(HttpReq, transaction_timeout); +catch_error(HttpReq, error, {erlfdb_error, _} = Error) -> + send_error(HttpReq, Error); catch_error(HttpReq, Tag, Error) -> Stack = erlang:get_stacktrace(), % TODO improve logging and metrics collection for client disconnects @@ -927,6 +925,8 @@ buffer_response(Req) -> end. +error_info({erlfdb_error, _} = Error) -> + erlfdb_error_info(Error); error_info({Error, Reason}) when is_list(Reason) -> error_info({Error, couch_util:to_binary(Reason)}); error_info(bad_request) -> @@ -1001,9 +1001,6 @@ error_info({doc_validation, Reason}) -> {400, <<"doc_validation">>, Reason}; error_info({invalid_since_seq, Reason}) -> {400, <<"invalid_since_seq">>, Reason}; -error_info(transaction_timeout) -> - {408, <<"transaction_timeout">>, - <<"The request transaction timed out" >>}; error_info({missing_stub, Reason}) -> {412, <<"missing_stub">>, Reason}; error_info(request_entity_too_large) -> @@ -1016,9 +1013,6 @@ error_info({request_entity_too_large, {bulk_get, Max}}) when is_integer(Max) -> {413, <<"max_bulk_get_count_exceeded">>, integer_to_binary(Max)}; error_info({request_entity_too_large, DocID}) -> {413, <<"document_too_large">>, DocID}; -error_info(transaction_too_large) -> - {413, <<"transaction_too_large">>, - <<"The request transaction is larger than 10MB" >>}; error_info({error, security_migration_updates_disabled}) -> {503, <<"security_migration">>, <<"Updates to security docs are disabled during " "security migration.">>}; @@ -1051,6 +1045,160 @@ error_info({Error, Reason, _Stack}) -> error_info(Error) -> maybe_handle_error(Error). + +erlfdb_error_info({erlfdb_error, ErrorCode}) -> + StatusCode = fdb_error_to_http_status_code(ErrorCode), + ErrorName = fdb_error_name(ErrorCode), + ErrorDesc = erlfdb:get_error_string(ErrorCode), + {StatusCode, ErrorName, ErrorDesc}. + + +fdb_error_to_http_status_code(2101) -> + 413; +fdb_error_to_http_status_code(2102) -> + 413; +fdb_error_to_http_status_code(2103) -> + 413; +fdb_error_to_http_status_code(_) -> + 500. + + +fdb_error_name(0) -> + success; +fdb_error_name(1000) -> + operation_failed; +fdb_error_name(1004) -> + timed_out; +fdb_error_name(1007) -> + transaction_too_old; +fdb_error_name(1009) -> + future_version; +fdb_error_name(1020) -> + not_committed; +fdb_error_name(1021) -> + commit_unknown_result; +fdb_error_name(1025) -> + transaction_cancelled; +fdb_error_name(1031) -> + transaction_timed_out; +fdb_error_name(1032) -> + too_many_watches; +fdb_error_name(1034) -> + watches_disabled; +fdb_error_name(1036) -> + accessed_unreadable; +fdb_error_name(1037) -> + process_behind; +fdb_error_name(1038) -> + database_locked; +fdb_error_name(1039) -> + cluster_version_changed; +fdb_error_name(1040) -> + external_client_already_loaded; +fdb_error_name(1042) -> + proxy_memory_limit_exceeded; +fdb_error_name(1101) -> + operation_cancelled; +fdb_error_name(1102) -> + future_released; +fdb_error_name(1500) -> + platform_error; +fdb_error_name(1501) -> + large_alloc_failed; +fdb_error_name(1502) -> + performance_counter_error; +fdb_error_name(1510) -> + io_error; +fdb_error_name(1511) -> + file_not_found; +fdb_error_name(1512) -> + bind_failed; +fdb_error_name(1513) -> + file_not_readable; +fdb_error_name(1514) -> + file_not_writable; +fdb_error_name(1515) -> + no_cluster_file_found; +fdb_error_name(1516) -> + file_too_large; +fdb_error_name(2000) -> + client_invalid_operation; +fdb_error_name(2002) -> + commit_read_incomplete; +fdb_error_name(2003) -> + test_specification_invalid; +fdb_error_name(2004) -> + key_outside_legal_range; +fdb_error_name(2005) -> + inverted_range; +fdb_error_name(2006) -> + invalid_option_value; +fdb_error_name(2007) -> + invalid_option; +fdb_error_name(2008) -> + network_not_setup; +fdb_error_name(2009) -> + network_already_setup; +fdb_error_name(2010) -> + read_version_already_set; +fdb_error_name(2011) -> + version_invalid; +fdb_error_name(2012) -> + range_limits_invalid; +fdb_error_name(2013) -> + invalid_database_name; +fdb_error_name(2014) -> + attribute_not_found; +fdb_error_name(2015) -> + future_not_set; +fdb_error_name(2016) -> + future_not_error; +fdb_error_name(2017) -> + used_during_commit; +fdb_error_name(2018) -> + invalid_mutation_type; +fdb_error_name(2020) -> + transaction_invalid_version; +fdb_error_name(2021) -> + no_commit_version; +fdb_error_name(2022) -> + environment_variable_network_option_failed; +fdb_error_name(2023) -> + transaction_read_only; +fdb_error_name(2100) -> + incompatible_protocol_version; +fdb_error_name(2101) -> + transaction_too_large; +fdb_error_name(2102) -> + key_too_large; +fdb_error_name(2103) -> + value_too_large; +fdb_error_name(2104) -> + connection_string_invalid; +fdb_error_name(2105) -> + address_in_use; +fdb_error_name(2106) -> + invalid_local_address; +fdb_error_name(2107) -> + tls_error; +fdb_error_name(2108) -> + unsupported_operation; +fdb_error_name(2200) -> + api_version_unset; +fdb_error_name(2201) -> + api_version_already_set; +fdb_error_name(2202) -> + api_version_invalid; +fdb_error_name(2203) -> + api_version_not_supported; +fdb_error_name(2210) -> + exact_mode_without_limits; +fdb_error_name(4000) -> + unknown_error; +fdb_error_name(4100) -> + internal_error. + + maybe_handle_error(Error) -> case chttpd_plugin:handle_error(Error) of {_Code, _Reason, _Description} = Result ->
