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

Reply via email to