You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ga...@apache.org on 2018/08/14 11:00:50 UTC
[couchdb] branch elixir-suite updated: Port compact.js (#1492)
This is an automated email from the ASF dual-hosted git repository.
garren pushed a commit to branch elixir-suite
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/elixir-suite by this push:
new 8dca38a Port compact.js (#1492)
8dca38a is described below
commit 8dca38addf54c6dc306f791affeda185da75611a
Author: Jay Doane <ja...@gmail.com>
AuthorDate: Tue Aug 14 04:00:46 2018 -0700
Port compact.js (#1492)
---
test/elixir/test/compact_test.exs | 97 +++++++++++++++++++++++++++++++++++++++
1 file changed, 97 insertions(+)
diff --git a/test/elixir/test/compact_test.exs b/test/elixir/test/compact_test.exs
new file mode 100644
index 0000000..05fd2ff
--- /dev/null
+++ b/test/elixir/test/compact_test.exs
@@ -0,0 +1,97 @@
+defmodule CompactTest do
+ use CouchTestCase
+
+ @moduletag :compact
+
+ @moduledoc """
+ Test CouchDB compaction
+ This is a port of compact.js
+ """
+
+ @att_doc_id "att_doc"
+ @att_name "foo.txt"
+ @att_plaintext "This is plain text"
+
+ @tag :with_db
+ test "compaction reduces size of deleted docs", context do
+ db = context[:db_name]
+ docs = populate(db)
+ info = get_info(db)
+ orig_data_size = info["data_size"]
+ orig_disk_size = info["disk_size"]
+ start_time = info["instance_start_time"]
+ assert is_integer(orig_data_size) and is_integer(orig_disk_size)
+ assert orig_data_size < orig_disk_size
+
+ delete(db, docs)
+ deleted_data_size = get_info(db)["data_size"]
+ assert deleted_data_size > orig_data_size
+
+ compact(db)
+ assert get_info(db)["instance_start_time"] == start_time
+ assert_attachment_available(db)
+ info = get_info(db)
+ final_data_size = info["data_size"]
+ final_disk_size = info["disk_size"]
+ assert final_data_size < final_disk_size
+ assert is_integer(final_data_size) and is_integer(final_disk_size)
+ assert final_data_size < deleted_data_size
+ end
+
+
+ defp assert_attachment_available(db) do
+ resp = Couch.get("/#{db}/#{@att_doc_id}/#{@att_name}")
+ assert resp.body == @att_plaintext
+ assert resp.headers["content-type"] == "text/plain"
+ assert Couch.get("/#{db}").body["doc_count"] == 1
+ end
+
+ defp populate(db) do
+ docs = create_docs(0..19)
+ resp = Couch.post("/#{db}/_bulk_docs", [body: %{docs: docs}])
+ assert resp.status_code == 201
+ docs = rev(docs, resp.body)
+ doc = %{
+ _id: "#{@att_doc_id}",
+ _attachments: %{
+ "#{@att_name}": %{
+ content_type: "text/plain",
+ data: Base.encode64(@att_plaintext)}}}
+ resp = Couch.put("/#{db}/#{doc._id}", [body: doc])
+ assert resp.status_code == 201
+ docs
+ end
+
+ defp delete(db, docs) do
+ docs = Enum.map(docs, &Map.put(&1, :_deleted, true))
+ resp = Couch.post("/#{db}/_bulk_docs", [body: %{docs: docs}])
+ assert resp.status_code == 201
+ assert Couch.post("/#{db}/_ensure_full_commit").body["ok"] == true
+ end
+
+ defp compact(db) do
+ assert Couch.post("/#{db}/_compact").status_code == 202
+ retry_until(fn() ->
+ Couch.get("/#{db}").body["compact_running"] == false
+ end, 200, 20_000)
+ end
+
+ defp get_info(db) do
+ Couch.get("/#{db}").body
+ end
+
+ defp rev(doc = %{_id: id}, %{"id" => id, "rev" => rev}) do
+ Map.put(doc, :_rev, rev)
+ end
+
+ defp rev(docs, rows) do
+ for {doc, row} <- Enum.zip(docs, rows), do: rev(doc, row)
+ end
+
+ def create_docs(id_range) do
+ for id <- id_range, str_id = Integer.to_string(id) do
+ %{_id: str_id, integer: id, string: str_id}
+ end
+ end
+
+end