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