You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2015/12/15 23:27:33 UTC

svn commit: r1720260 - /subversion/branches/parallel-put/subversion/tests/libsvn_fs/fs-test.c

Author: ivan
Date: Tue Dec 15 22:27:33 2015
New Revision: 1720260

URL: http://svn.apache.org/viewvc?rev=1720260&view=rev
Log:
On 'parallel-put' branch: Add specialized test for concurrent write to TXN.

* subversion/tests/libsvn_fs/fs-test.c
  (test_concurrent_txn_write): New test.
  (test_funcs): Add test_concurrent_txn_write() to list.

Modified:
    subversion/branches/parallel-put/subversion/tests/libsvn_fs/fs-test.c

Modified: subversion/branches/parallel-put/subversion/tests/libsvn_fs/fs-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/parallel-put/subversion/tests/libsvn_fs/fs-test.c?rev=1720260&r1=1720259&r2=1720260&view=diff
==============================================================================
--- subversion/branches/parallel-put/subversion/tests/libsvn_fs/fs-test.c (original)
+++ subversion/branches/parallel-put/subversion/tests/libsvn_fs/fs-test.c Tue Dec 15 22:27:33 2015
@@ -7039,6 +7039,103 @@ freeze_and_commit(const svn_test_opts_t
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_concurrent_txn_write(const svn_test_opts_t *opts,
+                          apr_pool_t *pool)
+{
+  svn_fs_t *fs;
+  svn_fs_txn_t *txn;
+  svn_fs_root_t *txn_root;
+  svn_fs_root_t *rev_root;
+  svn_stream_t *foo_contents;
+  svn_stream_t *bar_contents;
+  svn_stringbuf_t *expected_foo;
+  svn_stringbuf_t *expected_bar;
+  svn_stringbuf_t *actual_foo;
+  svn_stringbuf_t *actual_bar;
+  svn_revnum_t new_rev;
+  int i;
+
+  /* Create a new repo. */
+  SVN_ERR(svn_test__create_fs(&fs, "test-repo-concurrent-txn-write",
+                              opts, pool));
+
+  /* Bail (with success) on known-untestable scenarios */
+  if (!svn_fs_supports_concurrent_writes(fs, pool))
+    return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+                            "concurrent write is not supported by FS");
+
+  /* Create a TXN_ROOT referencing FS. */
+  SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+
+  /* Make file /foo and open for writing.*/
+  SVN_ERR(svn_fs_make_file(txn_root, "/foo", pool));
+  SVN_ERR(svn_fs_apply_text(&foo_contents, txn_root, "/foo", NULL, pool));
+
+  /* Make file /bar and open for writing.*/
+  SVN_ERR(svn_fs_make_file(txn_root, "/bar", pool));
+  SVN_ERR(svn_fs_apply_text(&bar_contents, txn_root, "/bar", NULL, pool));
+
+  expected_foo = svn_stringbuf_create_ensure(256 * 1024, pool);
+  expected_bar = svn_stringbuf_create_ensure(256 * 1024, pool);
+  /* Write random contents of two files in parallel. */
+  for (i = 0; i < 256 * 1024; i++)
+    {
+      apr_size_t len;
+      char c;
+
+      len = 1;
+      c = (char) rand();
+      SVN_ERR(svn_stream_write(foo_contents, &c, &len));
+      svn_stringbuf_appendbyte(expected_foo, c);
+
+      len = 1;
+      c = (char) rand();
+      SVN_ERR(svn_stream_write(bar_contents, &c, &len));
+      svn_stringbuf_appendbyte(expected_bar, c);
+    }
+
+  /* Close file '/bar'. */
+  SVN_ERR(svn_stream_close(bar_contents));
+
+  /* Close file '/foo'. */
+  SVN_ERR(svn_stream_close(foo_contents));
+
+  /* Compare contents of files in TXN root. */
+  SVN_ERR(svn_fs_file_contents(&foo_contents, txn_root, "/foo", pool));
+  SVN_ERR(svn_stringbuf_from_stream(&actual_foo, foo_contents,
+                                    256 * 1024, pool));
+  SVN_ERR(svn_stream_close(foo_contents));
+  SVN_TEST_ASSERT(svn_stringbuf_compare(actual_foo, expected_foo));
+
+  SVN_ERR(svn_fs_file_contents(&bar_contents, txn_root, "/bar", pool));
+  SVN_ERR(svn_stringbuf_from_stream(&actual_bar, bar_contents,
+                                    256 * 1024, pool));
+  SVN_ERR(svn_stream_close(bar_contents));
+  SVN_TEST_ASSERT(svn_stringbuf_compare(actual_bar, expected_bar));
+
+  /* Commit txn. */
+  SVN_ERR(test_commit_txn(&new_rev, txn, NULL, pool));
+
+  SVN_ERR(svn_fs_revision_root(&rev_root, fs, new_rev, pool));
+
+  /* Compare contents of files in revision root. */
+  SVN_ERR(svn_fs_file_contents(&foo_contents, rev_root, "/foo", pool));
+  SVN_ERR(svn_stringbuf_from_stream(&actual_foo, foo_contents,
+                                    256 * 1024, pool));
+  SVN_ERR(svn_stream_close(foo_contents));
+  SVN_TEST_ASSERT(svn_stringbuf_compare(actual_foo, expected_foo));
+
+  SVN_ERR(svn_fs_file_contents(&bar_contents, rev_root, "/bar", pool));
+  SVN_ERR(svn_stringbuf_from_stream(&actual_bar, bar_contents,
+                                    256 * 1024, pool));
+  SVN_ERR(svn_stream_close(bar_contents));
+  SVN_TEST_ASSERT(svn_stringbuf_compare(actual_bar, expected_bar));
+
+  return SVN_NO_ERROR;
+}
+
 /* ------------------------------------------------------------------------ */
 
 /* The test table.  */
@@ -7173,6 +7270,8 @@ static struct svn_test_descriptor_t test
                        "test svn_fs_check_related for transactions"),
     SVN_TEST_OPTS_PASS(freeze_and_commit,
                        "freeze and commit"),
+    SVN_TEST_OPTS_PASS(test_concurrent_txn_write,
+                       "test concurrent write to txn"),
     SVN_TEST_NULL
   };