You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2010/04/14 15:05:57 UTC
svn commit: r933938 - in /subversion/trunk: build.conf
subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c
subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
Author: philip
Date: Wed Apr 14 13:05:56 2010
New Revision: 933938
URL: http://svn.apache.org/viewvc?rev=933938&view=rev
Log:
Partial fix for issue 3596 (hotcopy and SQLite databases).
* subversion/include/private/svn_sqlite.c (svn_sqlite__hotcopy): New.
* subversion/libsvn_subr/sqlite.c (svn_sqlite__hotcopy): New.
* subversion/libsvn_subr/sqlite.sql: New file.
* build.conf (subr_sqlite): New.
* subversion/libsvn_fs_fs/fs_fs.c
(svn_fs_fs__hotcopy): Hotcopy rep cache, do it before the rev files.
Added:
subversion/trunk/subversion/libsvn_subr/sqlite.sql
Modified:
subversion/trunk/build.conf
subversion/trunk/subversion/include/private/svn_sqlite.h
subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
subversion/trunk/subversion/libsvn_subr/sqlite.c
Modified: subversion/trunk/build.conf
URL: http://svn.apache.org/viewvc/subversion/trunk/build.conf?rev=933938&r1=933937&r2=933938&view=diff
==============================================================================
--- subversion/trunk/build.conf (original)
+++ subversion/trunk/build.conf Wed Apr 14 13:05:56 2010
@@ -380,6 +380,12 @@ type = sql-header
path = subversion/libsvn_wc
sources = wc-checks.sql
+[subr_sqlite]
+description = Subversion SQLite interface
+type = sql-header
+path = subversion/libsvn_subr
+sources = sqlite.sql
+
# ----------------------------------------------------------------------------
#
Modified: subversion/trunk/subversion/include/private/svn_sqlite.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_sqlite.h?rev=933938&r1=933937&r2=933938&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_sqlite.h (original)
+++ subversion/trunk/subversion/include/private/svn_sqlite.h Wed Apr 14 13:05:56 2010
@@ -310,6 +310,12 @@ svn_sqlite__with_transaction(svn_sqlite_
void *cb_baton, apr_pool_t *scratch_pool);
+/* Hotcopy an SQLite database from SRC_PATH to DST_PATH. */
+svn_error_t *
+svn_sqlite__hotcopy(const char *src_path,
+ const char *dst_path,
+ apr_pool_t *scratch_pool);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=933938&r1=933937&r2=933938&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Wed Apr 14 13:05:56 2010
@@ -1498,6 +1498,14 @@ svn_fs_fs__hotcopy(const char *src_path,
/* Copy the config. */
SVN_ERR(svn_io_dir_file_copy(src_path, dst_path, PATH_CONFIG, pool));
+ /* Copy the rep cache before copying the rev files to make sure all
+ cached references will be present in the copy. */
+ src_subdir = svn_dirent_join(src_path, REP_CACHE_DB_NAME, pool);
+ dst_subdir = svn_dirent_join(dst_path, REP_CACHE_DB_NAME, pool);
+ SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
+ if (kind == svn_node_file)
+ SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, pool));
+
/* Copy the min unpacked rev, and read its value. */
if (format >= SVN_FS_FS__MIN_PACKED_FORMAT)
{
@@ -1658,12 +1666,6 @@ svn_fs_fs__hotcopy(const char *src_path,
PATH_NODE_ORIGINS_DIR, TRUE, NULL,
NULL, pool));
- /* Now copy the rep cache. */
- src_subdir = svn_dirent_join(src_path, REP_CACHE_DB_NAME, pool);
- SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
- if (kind == svn_node_file)
- SVN_ERR(svn_io_dir_file_copy(src_path, dst_path, REP_CACHE_DB_NAME, pool));
-
/* Copy the txn-current file. */
if (format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
SVN_ERR(svn_io_dir_file_copy(src_path, dst_path, PATH_TXN_CURRENT, pool));
Modified: subversion/trunk/subversion/libsvn_subr/sqlite.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sqlite.c?rev=933938&r1=933937&r2=933938&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sqlite.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sqlite.c Wed Apr 14 13:05:56 2010
@@ -28,6 +28,7 @@
#include "svn_io.h"
#include "svn_dirent_uri.h"
#include "svn_checksum.h"
+#include "sqlite.h"
#include "private/svn_sqlite.h"
#include "svn_private_config.h"
@@ -48,6 +49,8 @@
#include <sqlite3.h>
#endif
+SQLITE_SQL_DECLARE_STATEMENTS(statements);
+
#ifdef SQLITE3_DEBUG
/* An sqlite query execution callback. */
static void
@@ -964,3 +967,28 @@ svn_sqlite__with_transaction(svn_sqlite_
return svn_error_return(exec_sql(db, "COMMIT TRANSACTION;"));
}
+
+svn_error_t *
+svn_sqlite__hotcopy(const char *src_path,
+ const char *dst_path,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__db_t *db;
+ svn_sqlite__stmt_t *stmt;
+
+ /* The SELECT takes a shared lock in the source database which
+ blocks writers and so ensures that the database won't change
+ during the copy.
+
+ We could use the SQLite backup interface (from 3.6.11 and still
+ experimental) and the copy would be done in chunks with the lock
+ released between chunks. */
+ SVN_ERR(svn_sqlite__open(&db, src_path, svn_sqlite__mode_readonly,
+ statements, 0, NULL, scratch_pool, scratch_pool));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, db, STMT_DUMMY_SELECT_FOR_BACKUP));
+ SVN_ERR(svn_sqlite__step_row(stmt));
+ SVN_ERR(svn_io_copy_file(src_path, dst_path, TRUE, scratch_pool));
+ SVN_ERR(svn_sqlite__close(db));
+
+ return SVN_NO_ERROR;
+}
Added: subversion/trunk/subversion/libsvn_subr/sqlite.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sqlite.sql?rev=933938&view=auto
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sqlite.sql (added)
+++ subversion/trunk/subversion/libsvn_subr/sqlite.sql Wed Apr 14 13:05:56 2010
@@ -0,0 +1,25 @@
+/* sqlite.sql -- queries used by the Subversion SQLite interface
+ * This is intended for use with SQLite 3
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ */
+
+-- STMT_DUMMY_SELECT_FOR_BACKUP
+SELECT * FROM SQLITE_MASTER;
Re: svn commit: r933938 - in /subversion/trunk: build.conf
subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c
subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
Posted by Greg Stein <gs...@gmail.com>.
On Wed, Apr 14, 2010 at 10:52, Philip Martin <ph...@wandisco.com> wrote:
> Greg Stein <gs...@gmail.com> writes:
>
>> I've got a patch coming up...
>
> Hmm...
>
> $ (cd ../src && ./gen-make.py)
> WARNING: "internal_statements.h" header not found, file subversion/libsvn_subr/sqlite.c
> $ (cd ../src && ./gen-make.py)
> $
>
> The first build-outputs.mk doesn't list internal_statements.h as a
> dependency of sqlite.lo. Can gen-make generate the sqlite headers
> before determining dependencies? If not should autogen.sh run
> gen-make twice?
Fixed in r933981
Re: svn commit: r933938 - in /subversion/trunk: build.conf subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
Posted by Philip Martin <ph...@wandisco.com>.
Greg Stein <gs...@gmail.com> writes:
> I've got a patch coming up...
Hmm...
$ (cd ../src && ./gen-make.py)
WARNING: "internal_statements.h" header not found, file subversion/libsvn_subr/sqlite.c
$ (cd ../src && ./gen-make.py)
$
The first build-outputs.mk doesn't list internal_statements.h as a
dependency of sqlite.lo. Can gen-make generate the sqlite headers
before determining dependencies? If not should autogen.sh run
gen-make twice?
--
Philip
Re: svn commit: r933938 - in /subversion/trunk: build.conf
subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c
subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
Posted by Greg Stein <gs...@gmail.com>.
Fixed in r933969
On Wed, Apr 14, 2010 at 10:27, Greg Stein <gs...@gmail.com> wrote:
> I've got a patch coming up...
>
> On Wed, Apr 14, 2010 at 10:26, Philip Martin <ph...@wandisco.com> wrote:
>> "Bert Huijben" <be...@qqmail.nl> writes:
>>
>>>> --- subversion/trunk/subversion/libsvn_subr/sqlite.c (original)
>>>> +++ subversion/trunk/subversion/libsvn_subr/sqlite.c Wed Apr 14 13:05:56
>>>> 2010
>>>> @@ -28,6 +28,7 @@
>>>> #include "svn_io.h"
>>>> #include "svn_dirent_uri.h"
>>>> #include "svn_checksum.h"
>>>> +#include "sqlite.h"
>>>
>>> Why did you add this include?
>>>
>>> A normal sqlite amalgamation has only sqlite3.c, sqlite3.h and sqlite3ext.h. This adds a dependency to another sqlite distribution format.
>>
>> It's the Subversion specific file generated from sqlite.sql. Perhaps
>> I should use a different name?
>>
>> --
>> Philip
>>
>
Re: svn commit: r933938 - in /subversion/trunk: build.conf
subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c
subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
Posted by Greg Stein <gs...@gmail.com>.
I've got a patch coming up...
On Wed, Apr 14, 2010 at 10:26, Philip Martin <ph...@wandisco.com> wrote:
> "Bert Huijben" <be...@qqmail.nl> writes:
>
>>> --- subversion/trunk/subversion/libsvn_subr/sqlite.c (original)
>>> +++ subversion/trunk/subversion/libsvn_subr/sqlite.c Wed Apr 14 13:05:56
>>> 2010
>>> @@ -28,6 +28,7 @@
>>> #include "svn_io.h"
>>> #include "svn_dirent_uri.h"
>>> #include "svn_checksum.h"
>>> +#include "sqlite.h"
>>
>> Why did you add this include?
>>
>> A normal sqlite amalgamation has only sqlite3.c, sqlite3.h and sqlite3ext.h. This adds a dependency to another sqlite distribution format.
>
> It's the Subversion specific file generated from sqlite.sql. Perhaps
> I should use a different name?
>
> --
> Philip
>
Re: svn commit: r933938 - in /subversion/trunk: build.conf subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
Posted by Philip Martin <ph...@wandisco.com>.
"Bert Huijben" <be...@qqmail.nl> writes:
>> --- subversion/trunk/subversion/libsvn_subr/sqlite.c (original)
>> +++ subversion/trunk/subversion/libsvn_subr/sqlite.c Wed Apr 14 13:05:56
>> 2010
>> @@ -28,6 +28,7 @@
>> #include "svn_io.h"
>> #include "svn_dirent_uri.h"
>> #include "svn_checksum.h"
>> +#include "sqlite.h"
>
> Why did you add this include?
>
> A normal sqlite amalgamation has only sqlite3.c, sqlite3.h and sqlite3ext.h. This adds a dependency to another sqlite distribution format.
It's the Subversion specific file generated from sqlite.sql. Perhaps
I should use a different name?
--
Philip
RE: svn commit: r933938 - in /subversion/trunk: build.conf subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
Posted by Bert Huijben <be...@qqmail.nl>.
> -----Original Message-----
> From: philip@apache.org [mailto:philip@apache.org]
> Sent: woensdag 14 april 2010 15:06
> To: commits@subversion.apache.org
> Subject: svn commit: r933938 - in /subversion/trunk: build.conf
> subversion/include/private/svn_sqlite.h subversion/libsvn_fs_fs/fs_fs.c
> subversion/libsvn_subr/sqlite.c subversion/libsvn_subr/sqlite.sql
>
> Author: philip
> Date: Wed Apr 14 13:05:56 2010
> New Revision: 933938
>
> URL: http://svn.apache.org/viewvc?rev=933938&view=rev
> Log:
> Partial fix for issue 3596 (hotcopy and SQLite databases).
>
> * subversion/include/private/svn_sqlite.c (svn_sqlite__hotcopy): New.
>
> * subversion/libsvn_subr/sqlite.c (svn_sqlite__hotcopy): New.
>
> * subversion/libsvn_subr/sqlite.sql: New file.
>
> * build.conf (subr_sqlite): New.
>
> * subversion/libsvn_fs_fs/fs_fs.c
> (svn_fs_fs__hotcopy): Hotcopy rep cache, do it before the rev files.
>
> Added:
> subversion/trunk/subversion/libsvn_subr/sqlite.sql
> Modified:
> subversion/trunk/build.conf
> subversion/trunk/subversion/include/private/svn_sqlite.h
> subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
> subversion/trunk/subversion/libsvn_subr/sqlite.c
>
> Modified: subversion/trunk/build.conf
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/build.conf?rev=933938&r1=
> 933937&r2=933938&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/build.conf (original)
> +++ subversion/trunk/build.conf Wed Apr 14 13:05:56 2010
> @@ -380,6 +380,12 @@ type = sql-header
> path = subversion/libsvn_wc
> sources = wc-checks.sql
>
> +[subr_sqlite]
> +description = Subversion SQLite interface
> +type = sql-header
> +path = subversion/libsvn_subr
> +sources = sqlite.sql
> +
>
> # ----------------------------------------------------------------------------
> #
>
> Modified: subversion/trunk/subversion/include/private/svn_sqlite.h
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private
> /svn_sqlite.h?rev=933938&r1=933937&r2=933938&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/include/private/svn_sqlite.h (original)
> +++ subversion/trunk/subversion/include/private/svn_sqlite.h Wed Apr 14
> 13:05:56 2010
> @@ -310,6 +310,12 @@ svn_sqlite__with_transaction(svn_sqlite_
> void *cb_baton, apr_pool_t *scratch_pool);
>
>
> +/* Hotcopy an SQLite database from SRC_PATH to DST_PATH. */
> +svn_error_t *
> +svn_sqlite__hotcopy(const char *src_path,
> + const char *dst_path,
> + apr_pool_t *scratch_pool);
> +
> #ifdef __cplusplus
> }
> #endif /* __cplusplus */
>
> Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs
> _fs.c?rev=933938&r1=933937&r2=933938&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
> +++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Wed Apr 14 13:05:56
> 2010
> @@ -1498,6 +1498,14 @@ svn_fs_fs__hotcopy(const char *src_path,
> /* Copy the config. */
> SVN_ERR(svn_io_dir_file_copy(src_path, dst_path, PATH_CONFIG, pool));
>
> + /* Copy the rep cache before copying the rev files to make sure all
> + cached references will be present in the copy. */
> + src_subdir = svn_dirent_join(src_path, REP_CACHE_DB_NAME, pool);
> + dst_subdir = svn_dirent_join(dst_path, REP_CACHE_DB_NAME, pool);
> + SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
> + if (kind == svn_node_file)
> + SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, pool));
> +
> /* Copy the min unpacked rev, and read its value. */
> if (format >= SVN_FS_FS__MIN_PACKED_FORMAT)
> {
> @@ -1658,12 +1666,6 @@ svn_fs_fs__hotcopy(const char *src_path,
> PATH_NODE_ORIGINS_DIR, TRUE, NULL,
> NULL, pool));
>
> - /* Now copy the rep cache. */
> - src_subdir = svn_dirent_join(src_path, REP_CACHE_DB_NAME, pool);
> - SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
> - if (kind == svn_node_file)
> - SVN_ERR(svn_io_dir_file_copy(src_path, dst_path,
> REP_CACHE_DB_NAME, pool));
> -
> /* Copy the txn-current file. */
> if (format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
> SVN_ERR(svn_io_dir_file_copy(src_path, dst_path, PATH_TXN_CURRENT,
> pool));
>
> Modified: subversion/trunk/subversion/libsvn_subr/sqlite.c
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sqli
> te.c?rev=933938&r1=933937&r2=933938&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/libsvn_subr/sqlite.c (original)
> +++ subversion/trunk/subversion/libsvn_subr/sqlite.c Wed Apr 14 13:05:56
> 2010
> @@ -28,6 +28,7 @@
> #include "svn_io.h"
> #include "svn_dirent_uri.h"
> #include "svn_checksum.h"
> +#include "sqlite.h"
Why did you add this include?
A normal sqlite amalgamation has only sqlite3.c, sqlite3.h and sqlite3ext.h. This adds a dependency to another sqlite distribution format.
Bert