Return-Path: X-Original-To: apmail-subversion-commits-archive@minotaur.apache.org Delivered-To: apmail-subversion-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7E829182D4 for ; Wed, 21 Oct 2015 14:47:12 +0000 (UTC) Received: (qmail 86647 invoked by uid 500); 21 Oct 2015 14:47:12 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 86612 invoked by uid 500); 21 Oct 2015 14:47:12 -0000 Mailing-List: contact commits-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@subversion.apache.org Delivered-To: mailing list commits@subversion.apache.org Received: (qmail 86602 invoked by uid 99); 21 Oct 2015 14:47:12 -0000 Received: from Unknown (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Oct 2015 14:47:12 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id DC22DC3F9C for ; Wed, 21 Oct 2015 14:47:11 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.801 X-Spam-Level: * X-Spam-Status: No, score=1.801 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RP_MATCHES_RCVD=0.001] autolearn=disabled Received: from mx1-us-east.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id Dh9Fr33-iRZg for ; Wed, 21 Oct 2015 14:47:10 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-us-east.apache.org (ASF Mail Server at mx1-us-east.apache.org) with ESMTP id D67D0428E4 for ; Wed, 21 Oct 2015 14:47:09 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 6C392E0718 for ; Wed, 21 Oct 2015 14:47:09 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 64DA73A0337 for ; Wed, 21 Oct 2015 14:47:09 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1709856 - in /subversion/trunk/subversion/libsvn_fs_x: ./ fs.c fs_x.h hotcopy.c hotcopy.h pack.c Date: Wed, 21 Oct 2015 14:47:09 -0000 To: commits@subversion.apache.org From: stefan2@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20151021144709.64DA73A0337@svn01-us-west.apache.org> Author: stefan2 Date: Wed Oct 21 14:47:09 2015 New Revision: 1709856 URL: http://svn.apache.org/viewvc?rev=1709856&view=rev Log: Merge the hotcopy changes from FSFS to FSX, resolve text conflicts and use proper svn_fs_x__* identifiers. This merges revisions r1686542, 1686554, 1686557, 1687070-1687071, 1687074 and 1687078-1687079 from FSFS to FSX. Modified: subversion/trunk/subversion/libsvn_fs_x/ (props changed) subversion/trunk/subversion/libsvn_fs_x/fs.c subversion/trunk/subversion/libsvn_fs_x/fs_x.h subversion/trunk/subversion/libsvn_fs_x/hotcopy.c subversion/trunk/subversion/libsvn_fs_x/hotcopy.h subversion/trunk/subversion/libsvn_fs_x/pack.c Propchange: subversion/trunk/subversion/libsvn_fs_x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Oct 21 14:47:09 2015 @@ -93,5 +93,5 @@ /subversion/branches/verify-at-commit/subversion/libsvn_fs_x:1462039-1462408 /subversion/branches/verify-keep-going/subversion/libsvn_fs_x:1439280-1492639,1546002-1546110 /subversion/branches/wc-collate-path/subversion/libsvn_fs_x:1402685-1480384 -/subversion/trunk/subversion/libsvn_fs_fs:1415133-1596500,1596567,1597414,1597989,1598273,1599140,1600872,1601633,1603485-1603487,1603499,1603605,1604128,1604188,1604413-1604414,1604416-1604417,1604421,1604442,1604700,1604717,1604720,1604726,1604755,1604794,1604802,1604824,1604836,1604844,1604902-1604903,1604911,1604925,1604933,1604947,1605059-1605060,1605064-1605065,1605068,1605071-1605073,1605075,1605123,1605188-1605189,1605191,1605197,1605444,1605633,1606132,1606142,1606144,1606514,1606526,1606528,1606551,1606554,1606564,1606598-1606599,1606656,1606658,1606662,1606744,1606840,1607085,1607572,1612407,1612810,1613339,1613872,1614611,1615348,1615351-1615352,1615356,1616338-1616339,1616613,1617586,1617688,1618138,1618151,1618153,1618226,1618641,1618653,1618662,1619068,1619358,1619413,1619769,1619774,1620602,1620909,1620912,1620928,1620930,1621275,1621635,1622931,1622937,1622942,1622946,1622959-1622960,1622963,1622987,1623007,1623368,1623373,1623377,1623379,1623381,1623398,1623402,162 4011,1624265,1624512,1626246,1626871,1626873,1626886,1627497-1627498,1627502,1627947-1627949,1627966,1628083,1628093,1628158-1628159,1628161,1628392-1628393,1628415,1628427,1628676,1628738,1628762,1628764,1629854-1629855,1629857,1629865,1629873,1629875,1629879,1630067,1630070,1631049-1631051,1631075,1631115,1631171,1631180,1631185-1631186,1631196-1631197,1631239-1631240,1631548,1631550,1631563,1631567,1631588,1631598,1632646,1632776,1632849,1632851-1632853,1632856-1632857,1632868,1632908,1632926,1633232,1633617-1633618,1634872,1634875,1634879-1634880,1634920,1636478,1636483,1636629,1636644,1637184,1637186,1637330,1637358,1637363,1637393,1639319,1639322,1639335,1639348,1639352,1639355,1639358,1639414,1639419,1639426,1639430,1639436,1639440,1639549,1640061-1640062,1640197,1640915,1640966,1641013,1643139,1643233,1645567,1646021,1646712,1646716,1647537,1647540-1647541,1647820,1647905,1648230,1648238,1648241-1648243,1648253,1648272,1648532,1648537-1648539,1648542,1648591,1648612,1649590, 1651567,1652068,1652076,1652441,1653608,1654932,1654934,1654937,1655635,1655664,1657525,1657972,1657978,1658482,1659212,1659217,1659314,1659509,1662668,1665318,1665854,1665894,1667090,1667101,1667538,1669743,1669746,1669749,1669945,1670139,1670953,1673170,1673445,1673454,1673685,1673689,1673875,1674165,1674341,1674400,1674404,1674631,1674669,1674673,1675396,1676667,1677431,1678151,1678718,1678725,1679169,1679907,1679920-1679924,1679926,1680347,1681949,1681966,1682008,1682076,1682739,1682864,1683311,1683553,1684047,1686232,1686546,1687061,1687064,1688425,1692650,1693886,1694489,1694848,1696171,1696185,1696627-1696628,1696630,1696758,1697372,1697381,1697387,1697393,1697403,1697405,1701017,1702600,1702922,1703142,1703237,1703240,1705266,1705638,1705643,1705724,1705730,1705739,1706617,1706619,1706675-1706676,1706679,1707308,1707971-1707973,1707986,1707988-1707989,1708004 +/subversion/trunk/subversion/libsvn_fs_fs:1415133-1596500,1596567,1597414,1597989,1598273,1599140,1600872,1601633,1603485-1603487,1603499,1603605,1604128,1604188,1604413-1604414,1604416-1604417,1604421,1604442,1604700,1604717,1604720,1604726,1604755,1604794,1604802,1604824,1604836,1604844,1604902-1604903,1604911,1604925,1604933,1604947,1605059-1605060,1605064-1605065,1605068,1605071-1605073,1605075,1605123,1605188-1605189,1605191,1605197,1605444,1605633,1606132,1606142,1606144,1606514,1606526,1606528,1606551,1606554,1606564,1606598-1606599,1606656,1606658,1606662,1606744,1606840,1607085,1607572,1612407,1612810,1613339,1613872,1614611,1615348,1615351-1615352,1615356,1616338-1616339,1616613,1617586,1617688,1618138,1618151,1618153,1618226,1618641,1618653,1618662,1619068,1619358,1619413,1619769,1619774,1620602,1620909,1620912,1620928,1620930,1621275,1621635,1622931,1622937,1622942,1622946,1622959-1622960,1622963,1622987,1623007,1623368,1623373,1623377,1623379,1623381,1623398,1623402,162 4011,1624265,1624512,1626246,1626871,1626873,1626886,1627497-1627498,1627502,1627947-1627949,1627966,1628083,1628093,1628158-1628159,1628161,1628392-1628393,1628415,1628427,1628676,1628738,1628762,1628764,1629854-1629855,1629857,1629865,1629873,1629875,1629879,1630067,1630070,1631049-1631051,1631075,1631115,1631171,1631180,1631185-1631186,1631196-1631197,1631239-1631240,1631548,1631550,1631563,1631567,1631588,1631598,1632646,1632776,1632849,1632851-1632853,1632856-1632857,1632868,1632908,1632926,1633232,1633617-1633618,1634872,1634875,1634879-1634880,1634920,1636478,1636483,1636629,1636644,1637184,1637186,1637330,1637358,1637363,1637393,1639319,1639322,1639335,1639348,1639352,1639355,1639358,1639414,1639419,1639426,1639430,1639436,1639440,1639549,1640061-1640062,1640197,1640915,1640966,1641013,1643139,1643233,1645567,1646021,1646712,1646716,1647537,1647540-1647541,1647820,1647905,1648230,1648238,1648241-1648243,1648253,1648272,1648532,1648537-1648539,1648542,1648591,1648612,1649590, 1651567,1652068,1652076,1652441,1653608,1654932,1654934,1654937,1655635,1655664,1657525,1657972,1657978,1658482,1659212,1659217,1659314,1659509,1662668,1665318,1665854,1665894,1667090,1667101,1667538,1669743,1669746,1669749,1669945,1670139,1670953,1673170,1673445,1673454,1673685,1673689,1673875,1674165,1674341,1674400,1674404,1674631,1674669,1674673,1675396,1676667,1677431,1678151,1678718,1678725,1679169,1679907,1679920-1679924,1679926,1680347,1681949,1681966,1682008,1682076,1682739,1682864,1683311,1683553,1684047,1686232,1686542,1686546,1686554,1686557,1687061,1687064,1687070-1687071,1687074,1687078-1687079,1688425,1692650,1693886,1694489,1694848,1696171,1696185,1696627-1696628,1696630,1696758,1697372,1697381,1697387,1697393,1697403,1697405,1701017,1702600,1702922,1703142,1703237,1703240,1705266,1705638,1705643,1705724,1705730,1705739,1706617,1706619,1706675-1706676,1706679,1707308,1707971-1707973,1707986,1707988-1707989,1708004 /subversion/trunk/subversion/libsvn_fs_x:1414756-1509914 Modified: subversion/trunk/subversion/libsvn_fs_x/fs.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs.c?rev=1709856&r1=1709855&r2=1709856&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_x/fs.c (original) +++ subversion/trunk/subversion/libsvn_fs_x/fs.c Wed Oct 21 14:47:09 2015 @@ -137,6 +137,18 @@ x_serialized_init(svn_fs_t *fs, return SVN_NO_ERROR; } +svn_error_t * +svn_fs_x__initialize_shared_data(svn_fs_t *fs, + svn_mutex__t *common_pool_lock, + apr_pool_t *scratch_pool, + apr_pool_t *common_pool) +{ + SVN_MUTEX__WITH_LOCK(common_pool_lock, + x_serialized_init(fs, common_pool, scratch_pool)); + + return SVN_NO_ERROR; +} + /* This function is provided for Subversion 1.0.x compatibility. It @@ -530,24 +542,17 @@ x_hotcopy(svn_fs_t *src_fs, if (cancel_func) SVN_ERR(cancel_func(cancel_baton)); - /* Test target repo when in INCREMENTAL mode, initialize it when not. - * For this, we need our FS internal data structures to be temporarily - * available. */ + SVN_ERR(svn_fs__check_fs(dst_fs, FALSE)); SVN_ERR(initialize_fs_struct(dst_fs)); - SVN_ERR(svn_fs_x__hotcopy_prepare_target(src_fs, dst_fs, dst_path, - incremental, scratch_pool)); - uninitialize_fs_struct(dst_fs); - - /* Now, the destination repo should open just fine. */ - SVN_ERR(x_open(dst_fs, dst_path, common_pool_lock, scratch_pool, - common_pool)); - if (cancel_func) - SVN_ERR(cancel_func(cancel_baton)); - /* Now, we may copy data as needed ... */ - return svn_fs_x__hotcopy(src_fs, dst_fs, incremental, - notify_func, notify_baton, - cancel_func, cancel_baton, scratch_pool); + /* In INCREMENTAL mode, svn_fs_x__hotcopy() will open DST_FS. + Otherwise, it's not an FS yet --- possibly just an empty dir --- so + can't be opened. + */ + return svn_fs_x__hotcopy(src_fs, dst_fs, src_path, dst_path, + incremental, notify_func, notify_baton, + cancel_func, cancel_baton, common_pool_lock, + scratch_pool, common_pool); } Modified: subversion/trunk/subversion/libsvn_fs_x/fs_x.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs_x.h?rev=1709856&r1=1709855&r2=1709856&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_x/fs_x.h (original) +++ subversion/trunk/subversion/libsvn_fs_x/fs_x.h Wed Oct 21 14:47:09 2015 @@ -41,6 +41,16 @@ svn_fs_x__open(svn_fs_t *fs, const char *path, apr_pool_t *scratch_pool); +/* Initialize parts of the FS data that are being shared across multiple + filesystem objects. Use COMMON_POOL for process-wide and SCRATCH_POOL + for temporary allocations. Use COMMON_POOL_LOCK to ensure that the + initialization is serialized. */ +svn_error_t * +svn_fs_x__initialize_shared_data(svn_fs_t *fs, + svn_mutex__t *common_pool_lock, + apr_pool_t *scratch_pool, + apr_pool_t *common_pool); + /* Upgrade the fsx filesystem FS. Indicate progress via the optional * NOTIFY_FUNC callback using NOTIFY_BATON. The optional CANCEL_FUNC * will periodically be called with CANCEL_BATON to allow for preemption. Modified: subversion/trunk/subversion/libsvn_fs_x/hotcopy.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/hotcopy.c?rev=1709856&r1=1709855&r2=1709856&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_x/hotcopy.c (original) +++ subversion/trunk/subversion/libsvn_fs_x/hotcopy.c Wed Oct 21 14:47:09 2015 @@ -326,6 +326,19 @@ hotcopy_copy_packed_shard(svn_boolean_t return SVN_NO_ERROR; } +/* Remove file PATH, if it exists - even if it is read-only. + * Use SCRATCH_POOL for temporary allocations. */ +static svn_error_t * +hotcopy_remove_file(const char *path, + apr_pool_t *scratch_pool) +{ + /* Make the rev file writable and remove it. */ + SVN_ERR(svn_io_set_file_read_write(path, TRUE, scratch_pool)); + SVN_ERR(svn_io_remove_file2(path, TRUE, scratch_pool)); + + return SVN_NO_ERROR; +} + /* Verify that DST_FS is a suitable destination for an incremental * hotcopy from SRC_FS. */ static svn_error_t * @@ -651,6 +664,10 @@ hotcopy_body(void *baton, /* Copy the rep cache and then remove entries for revisions * that did not make it into the destination. */ SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, scratch_pool)); + + /* The source might have r/o flags set on it - which would be + carried over to the copy. */ + SVN_ERR(svn_io_set_file_read_write(dst_subdir, FALSE, scratch_pool)); SVN_ERR(svn_fs_x__del_rep_reference(dst_fs, src_youngest, scratch_pool)); } @@ -665,64 +682,33 @@ hotcopy_body(void *baton, * used for the named atomics implementation. */ SVN_ERR(svn_fs_x__reset_revprop_generation_file(dst_fs, scratch_pool)); - return SVN_NO_ERROR; -} - -/* Wrapper around hotcopy_body taking out all necessary source repository - * locks. - */ -static svn_error_t * -hotcopy_locking_src_body(void *baton, - apr_pool_t *scratch_pool) -{ - hotcopy_body_baton_t *hbb = baton; + /* Hotcopied FS is complete. Stamp it with a format file. */ + SVN_ERR(svn_fs_x__write_format(dst_fs, TRUE, scratch_pool)); - return svn_error_trace(svn_fs_x__with_pack_lock(hbb->src_fs, hotcopy_body, - baton, scratch_pool)); + return SVN_NO_ERROR; } -/* Create an empty filesystem at DST_FS at DST_PATH with the same - * configuration as SRC_FS (uuid, format, and other parameters). - * After creation DST_FS has no revisions, not even revision zero. */ -static svn_error_t * -hotcopy_create_empty_dest(svn_fs_t *src_fs, - svn_fs_t *dst_fs, - const char *dst_path, - apr_pool_t *scratch_pool) +svn_error_t * +svn_fs_x__hotcopy(svn_fs_t *src_fs, + svn_fs_t *dst_fs, + const char *src_path, + const char *dst_path, + svn_boolean_t incremental, + svn_fs_hotcopy_notify_t notify_func, + void *notify_baton, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_mutex__t *common_pool_lock, + apr_pool_t *scratch_pool, + apr_pool_t *common_pool) { - svn_fs_x__data_t *src_ffd = src_fs->fsap_data; - - /* Create the DST_FS repository with the same layout as SRC_FS. */ - SVN_ERR(svn_fs_x__create_file_tree(dst_fs, dst_path, src_ffd->format, - src_ffd->max_files_per_dir, - scratch_pool)); + hotcopy_body_baton_t hbb; - /* Copy the UUID. Hotcopy destination receives a new instance ID, but - * has the same filesystem UUID as the source. */ - SVN_ERR(svn_fs_x__set_uuid(dst_fs, src_fs->uuid, NULL, scratch_pool)); - - /* Remove revision 0 contents. Otherwise, it may not get overwritten - * due to having a newer timestamp. */ - SVN_ERR(svn_io_remove_file2(svn_fs_x__path_rev(dst_fs, 0, scratch_pool), - FALSE, scratch_pool)); - SVN_ERR(svn_io_remove_file2(svn_fs_x__path_revprops(dst_fs, 0, - scratch_pool), - FALSE, scratch_pool)); - - /* This filesystem is ready. Stamp it with a format number. Fail if - * the 'format' file should already exist. */ - SVN_ERR(svn_fs_x__write_format(dst_fs, FALSE, scratch_pool)); + if (cancel_func) + SVN_ERR(cancel_func(cancel_baton)); - return SVN_NO_ERROR; -} + SVN_ERR(svn_fs_x__open(src_fs, src_path, scratch_pool)); -svn_error_t * -svn_fs_x__hotcopy_prepare_target(svn_fs_t *src_fs, - svn_fs_t *dst_fs, - const char *dst_path, - svn_boolean_t incremental, - apr_pool_t *scratch_pool) -{ if (incremental) { const char *dst_format_abspath; @@ -736,40 +722,52 @@ svn_fs_x__hotcopy_prepare_target(svn_fs_ scratch_pool)); if (dst_format_kind == svn_node_none) { - /* Destination doesn't exist yet. Perform a normal hotcopy to a - * empty destination using the same configuration as the source. */ - SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, - scratch_pool)); - } - else - { - /* Check the existing repository. */ - SVN_ERR(svn_fs_x__open(dst_fs, dst_path, scratch_pool)); - SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs)); + /* No destination? Fallback to a non-incremental hotcopy. */ + incremental = FALSE; } } + + if (incremental) + { + /* Check the existing repository. */ + SVN_ERR(svn_fs_x__open(dst_fs, dst_path, scratch_pool)); + SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs)); + + SVN_ERR(svn_fs_x__initialize_shared_data(dst_fs, common_pool_lock, + scratch_pool, common_pool)); + SVN_ERR(svn_fs_x__initialize_caches(dst_fs, scratch_pool)); + } else { /* Start out with an empty destination using the same configuration * as the source. */ - SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, - scratch_pool)); - } + svn_fs_x__data_t *src_ffd = src_fs->fsap_data; - return SVN_NO_ERROR; -} + /* Create the DST_FS repository with the same layout as SRC_FS. */ + SVN_ERR(svn_fs_x__create_file_tree(dst_fs, dst_path, src_ffd->format, + src_ffd->max_files_per_dir, + scratch_pool)); + + /* Copy the UUID. Hotcopy destination receives a new instance ID, but + * has the same filesystem UUID as the source. */ + SVN_ERR(svn_fs_x__set_uuid(dst_fs, src_fs->uuid, NULL, scratch_pool)); + + /* Remove revision 0 contents. Otherwise, it may not get overwritten + * due to having a newer timestamp. */ + SVN_ERR(hotcopy_remove_file(svn_fs_x__path_rev(dst_fs, 0, + scratch_pool), + scratch_pool)); + SVN_ERR(hotcopy_remove_file(svn_fs_x__path_revprops(dst_fs, 0, + scratch_pool), + scratch_pool)); + + SVN_ERR(svn_fs_x__initialize_shared_data(dst_fs, common_pool_lock, + scratch_pool, common_pool)); + SVN_ERR(svn_fs_x__initialize_caches(dst_fs, scratch_pool)); + } -svn_error_t * -svn_fs_x__hotcopy(svn_fs_t *src_fs, - svn_fs_t *dst_fs, - svn_boolean_t incremental, - svn_fs_hotcopy_notify_t notify_func, - void *notify_baton, - svn_cancel_func_t cancel_func, - void *cancel_baton, - apr_pool_t *scratch_pool) -{ - hotcopy_body_baton_t hbb; + if (cancel_func) + SVN_ERR(cancel_func(cancel_baton)); hbb.src_fs = src_fs; hbb.dst_fs = dst_fs; @@ -778,8 +776,16 @@ svn_fs_x__hotcopy(svn_fs_t *src_fs, hbb.notify_baton = notify_baton; hbb.cancel_func = cancel_func; hbb.cancel_baton = cancel_baton; - SVN_ERR(svn_fs_x__with_all_locks(dst_fs, hotcopy_locking_src_body, &hbb, - scratch_pool)); + + /* Lock the destination in the incremental mode. For a non-incremental + * hotcopy, don't take any locks. In that case the destination cannot be + * opened until the hotcopy finishes, and we don't have to worry about + * concurrency. */ + if (incremental) + SVN_ERR(svn_fs_x__with_all_locks(dst_fs, hotcopy_body, &hbb, + scratch_pool)); + else + SVN_ERR(hotcopy_body(&hbb, scratch_pool)); return SVN_NO_ERROR; } Modified: subversion/trunk/subversion/libsvn_fs_x/hotcopy.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/hotcopy.h?rev=1709856&r1=1709855&r2=1709856&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_x/hotcopy.h (original) +++ subversion/trunk/subversion/libsvn_fs_x/hotcopy.h Wed Oct 21 14:47:09 2015 @@ -25,29 +25,24 @@ #include "fs.h" -/* Create an empty copy of the fsfs filesystem SRC_FS into a new DST_FS at - * DST_PATH. If INCREMENTAL is TRUE, perform a few pre-checks only if - * a repo already exists at DST_PATH. - * Use SCRATCH_POOL for temporary allocations. */ -svn_error_t * -svn_fs_x__hotcopy_prepare_target(svn_fs_t *src_fs, - svn_fs_t *dst_fs, - const char *dst_path, - svn_boolean_t incremental, - apr_pool_t *scratch_pool); - -/* Copy the fsfs filesystem SRC_FS into DST_FS. If INCREMENTAL is TRUE, do - * not re-copy data which already exists in DST_FS. Indicate progress via - * the optional NOTIFY_FUNC callback using NOTIFY_BATON. - * Use SCRATCH_POOL for temporary allocations. */ +/* Copy the fsfs filesystem SRC_FS at SRC_PATH into a new copy DST_FS at + * DST_PATH. If INCREMENTAL is TRUE, do not re-copy data which already + * exists in DST_FS. Indicate progress via the optional NOTIFY_FUNC + * callback using NOTIFY_BATON. Use COMMON_POOL for process-wide and + * SCRATCH_POOL for temporary allocations. Use COMMON_POOL_LOCK to ensure + * that the initialization of the shared data is serialized. */ svn_error_t * svn_fs_x__hotcopy(svn_fs_t *src_fs, svn_fs_t *dst_fs, + const char *src_path, + const char *dst_path, svn_boolean_t incremental, svn_fs_hotcopy_notify_t notify_func, void *notify_baton, svn_cancel_func_t cancel_func, void *cancel_baton, - apr_pool_t *scratch_pool); + svn_mutex__t *common_pool_lock, + apr_pool_t *scratch_pool, + apr_pool_t *common_pool); #endif Modified: subversion/trunk/subversion/libsvn_fs_x/pack.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/pack.c?rev=1709856&r1=1709855&r2=1709856&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_x/pack.c (original) +++ subversion/trunk/subversion/libsvn_fs_x/pack.c Wed Oct 21 14:47:09 2015 @@ -2142,6 +2142,34 @@ pack_shard(const char *dir, return SVN_NO_ERROR; } +/* Read the youngest rev and the first non-packed rev info for FS from disk. + Set *FULLY_PACKED when there is no completed unpacked shard. + Use SCRATCH_POOL for temporary allocations. + */ +static svn_error_t * +get_pack_status(svn_boolean_t *fully_packed, + svn_fs_t *fs, + apr_pool_t *scratch_pool) +{ + svn_fs_x__data_t *ffd = fs->fsap_data; + apr_int64_t completed_shards; + svn_revnum_t youngest; + + SVN_ERR(svn_fs_x__read_min_unpacked_rev(&ffd->min_unpacked_rev, fs, + scratch_pool)); + + SVN_ERR(svn_fs_x__youngest_rev(&youngest, fs, scratch_pool)); + completed_shards = (youngest + 1) / ffd->max_files_per_dir; + + /* See if we've already completed all possible shards thus far. */ + if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir)) + *fully_packed = TRUE; + else + *fully_packed = FALSE; + + return SVN_NO_ERROR; +} + typedef struct pack_baton_t { svn_fs_t *fs; @@ -2174,21 +2202,17 @@ pack_body(void *baton, svn_fs_x__data_t *ffd = pb->fs->fsap_data; apr_int64_t completed_shards; apr_int64_t i; - svn_revnum_t youngest; apr_pool_t *iterpool; const char *data_path; + svn_boolean_t fully_packed; - /* If we aren't using sharding, we can't do any packing, so quit. */ - SVN_ERR(svn_fs_x__read_min_unpacked_rev(&ffd->min_unpacked_rev, pb->fs, - scratch_pool)); - - SVN_ERR(svn_fs_x__youngest_rev(&youngest, pb->fs, scratch_pool)); - completed_shards = (youngest + 1) / ffd->max_files_per_dir; - - /* See if we've already completed all possible shards thus far. */ - if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir)) + /* Since another process might have already packed the repo, + we need to re-read the pack status. */ + SVN_ERR(get_pack_status(&fully_packed, pb->fs, scratch_pool)); + if (fully_packed) return SVN_NO_ERROR; + completed_shards = (ffd->youngest_rev_cache + 1) / ffd->max_files_per_dir; data_path = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, scratch_pool); iterpool = svn_pool_create(scratch_pool); @@ -2224,6 +2248,14 @@ svn_fs_x__pack(svn_fs_t *fs, apr_pool_t *scratch_pool) { pack_baton_t pb = { 0 }; + svn_boolean_t fully_packed; + + /* Is there we even anything to do?. */ + SVN_ERR(get_pack_status(&fully_packed, fs, scratch_pool)); + if (fully_packed) + return SVN_NO_ERROR; + + /* Lock the repo and start the pack process. */ pb.fs = fs; pb.notify_func = notify_func; pb.notify_baton = notify_baton;