From 1469fb74754ebbff0632de69378b0e7406f0e0f3 Mon Sep 17 00:00:00 2001 From: jiangph Date: Tue, 13 Oct 2020 10:55:21 +0800 Subject: convert erlfdb_error 2101 to transaction_too_large --- src/chttpd/src/chttpd.erl | 5 +++++ test/elixir/test/bulk_docs_test.exs | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl index 3962c8601..ebfbd04ab 100644 --- a/src/chttpd/src/chttpd.erl +++ b/src/chttpd/src/chttpd.erl @@ -351,6 +351,8 @@ catch_error(HttpReq, throw, Error) -> send_error(HttpReq, Error); catch_error(HttpReq, error, database_does_not_exist) -> send_error(HttpReq, database_does_not_exist); +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 @@ -983,6 +985,9 @@ error_info({request_entity_too_large, {attachment, AttName}}) -> {413, <<"attachment_too_large">>, AttName}; 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 -- cgit v1.2.1