diff options
author | Peng Hui Jiang <jiangph@cn.ibm.com> | 2020-10-21 11:14:57 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-21 11:14:57 +0800 |
commit | ab70b753b77804ab3bedf13d1cdbfc5692235d55 (patch) | |
tree | b86ca862c12543a19268b3dd925c44fea8e0e2ee | |
parent | bfda16348f5c61e274ad5087e4a6407fa8306e0d (diff) | |
download | couchdb-ab70b753b77804ab3bedf13d1cdbfc5692235d55.tar.gz |
convert erlfdb_error 2101 to transaction_too_large (#3222)
-rw-r--r-- | src/chttpd/src/chttpd.erl | 5 | ||||
-rw-r--r-- | test/elixir/test/bulk_docs_test.exs | 18 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl index 3100694ff..dc9a30fd7 100644 --- a/src/chttpd/src/chttpd.erl +++ b/src/chttpd/src/chttpd.erl @@ -362,6 +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, Tag, Error) -> Stack = erlang:get_stacktrace(), % TODO improve logging and metrics collection for client disconnects @@ -1009,6 +1011,9 @@ 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 cbbc53340..41690fe12 100644 --- a/test/elixir/test/bulk_docs_test.exs +++ b/test/elixir/test/bulk_docs_test.exs @@ -130,6 +130,17 @@ 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}) @@ -152,4 +163,11 @@ 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 |