diff options
author | Robert Newson <rnewson@apache.org> | 2021-01-27 15:15:21 +0000 |
---|---|---|
committer | Robert Newson <rnewson@apache.org> | 2021-02-07 12:09:48 +0000 |
commit | 3a26da17b8a045b201041f43e04df9b1713a5a06 (patch) | |
tree | 33406873740cbac6d14ea26cc1325c8d1aacc6cc | |
parent | 46b346e30b96d3774f83ee2d366e12dc1ce50749 (diff) | |
download | couchdb-fdb-error-handling.tar.gz |
Handle all erlfdb error codesfdb-error-handling
-rw-r--r-- | src/chttpd/src/chttpd.erl | 16 | ||||
-rw-r--r-- | test/elixir/test/bulk_docs_test.exs | 18 |
2 files changed, 6 insertions, 28 deletions
diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl index 0c5e27259..b1243755c 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,10 @@ buffer_response(Req) -> end. +error_info({erlfdb_error, ErrorCode}) -> + ErrorDesc = erlfdb:get_error_string(ErrorCode), + Reason = ?l2b(io_lib:format("code: ~B, desc: ~s", [ErrorCode, ErrorDesc])), + {500, erlfdb_error, Reason}; error_info({Error, Reason}) when is_list(Reason) -> error_info({Error, couch_util:to_binary(Reason)}); error_info(bad_request) -> @@ -1001,9 +1003,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 +1015,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.">>}; diff --git a/test/elixir/test/bulk_docs_test.exs b/test/elixir/test/bulk_docs_test.exs index 41690fe12..cbbc53340 100644 --- a/test/elixir/test/bulk_docs_test.exs +++ b/test/elixir/test/bulk_docs_test.exs @@ -130,17 +130,6 @@ defmodule BulkDocsTest do assert Enum.at(rows, 2)["error"] == "conflict" end - @tag :with_db - test "bulk docs raises transaction_too_large error for transaction larger than 10MB", ctx do - docs = [%{_id: "0", a: random_string(16_000_000)}] - old_size = Couch.get("/_node/node1@127.0.0.1/_config/couchdb/max_document_size").body - set_config_raw("couchdb", "max_document_size", "67108864") # 64M - resp = Couch.post("/#{ctx[:db_name]}/_bulk_docs", body: %{docs: docs}) - set_config_raw("couchdb", "max_document_size", old_size) # set back - assert resp.status_code == 413 - assert resp.body["error"] == "transaction_too_large" - end - defp bulk_post(docs, db) do retry_until(fn -> resp = Couch.post("/#{db}/_bulk_docs", body: %{docs: docs}) @@ -163,11 +152,4 @@ defmodule BulkDocsTest do assert resp.body["error"] == "bad_request" assert resp.body["reason"] == reason end - - defp random_string(length) do - raw = :crypto.strong_rand_bytes(length) - raw - |> Base.url_encode64 - |> binary_part(0, length) - end end |