summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2021-01-27 15:15:21 +0000
committerRobert Newson <rnewson@apache.org>2021-02-07 12:09:48 +0000
commit3a26da17b8a045b201041f43e04df9b1713a5a06 (patch)
tree33406873740cbac6d14ea26cc1325c8d1aacc6cc
parent46b346e30b96d3774f83ee2d366e12dc1ce50749 (diff)
downloadcouchdb-fdb-error-handling.tar.gz
Handle all erlfdb error codesfdb-error-handling
-rw-r--r--src/chttpd/src/chttpd.erl16
-rw-r--r--test/elixir/test/bulk_docs_test.exs18
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