diff options
author | Robert Newson <rnewson@apache.org> | 2021-02-08 09:55:52 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-08 09:55:52 +0000 |
commit | 0b488defdfd4808fa9843961b588b29e7ed8fc6a (patch) | |
tree | b4dd6c60ab10577a87ec8b6c404a5496c51f171f | |
parent | 94df4bb2379eac40c9888a2ca8fb295242d023d6 (diff) | |
download | couchdb-0b488defdfd4808fa9843961b588b29e7ed8fc6a.tar.gz |
Handle all erlfdb error codes (#3355)
-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 |