summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangph <jiangph@cn.ibm.com>2020-10-13 10:55:21 +0800
committerjiangph <jiangph@cn.ibm.com>2020-10-21 08:56:13 +0800
commit1469fb74754ebbff0632de69378b0e7406f0e0f3 (patch)
tree80227544c9527de898c30ebe15d00e264a80a091
parentbf82a3f3d9e9dda1fc15ad49bd3be98c96cd755c (diff)
downloadcouchdb-transaction_too_large-for-main.tar.gz
convert erlfdb_error 2101 to transaction_too_largearchive/transaction_too_large-for-maintransaction_too_large-for-main
-rw-r--r--src/chttpd/src/chttpd.erl5
-rw-r--r--test/elixir/test/bulk_docs_test.exs18
2 files changed, 23 insertions, 0 deletions
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