Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_fs_base/fs.c view on Meta::CPAN
the default will simply abort(). */
(*fs->warning)(fs->warning_baton, err);
svn_error_clear(err);
return SVN_ERR_FS_CLEANUP;
}
static svn_error_t *
base_bdb_set_errcall(svn_fs_t *fs,
void (*db_errcall_fcn)(const char *errpfx, char *msg))
{
base_fs_data_t *bfd = fs->fsap_data;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
bfd->bdb->error_info->user_callback = db_errcall_fcn;
return SVN_NO_ERROR;
}
/* Write the DB_CONFIG file. */
static svn_error_t *
bdb_write_config(svn_fs_t *fs)
{
const char *dbconfig_file_name =
svn_dirent_join(fs->path, BDB_CONFIG_FILE, fs->pool);
apr_file_t *dbconfig_file = NULL;
int i;
static const char dbconfig_contents[] =
"# This is the configuration file for the Berkeley DB environment\n"
"# used by your Subversion repository.\n"
"# You must run 'svnadmin recover' whenever you modify this file,\n"
"# for your changes to take effect.\n"
"\n"
"### Lock subsystem\n"
"#\n"
"# Make sure you read the documentation at:\n"
"#\n"
"# http://docs.oracle.com/cd/E17076_02/html/programmer_reference/lock_max.html\n"
"#\n"
"# before tweaking these values.\n"
"#\n"
"set_lk_max_locks 2000\n"
"set_lk_max_lockers 2000\n"
"set_lk_max_objects 2000\n"
"\n"
"### Log file subsystem\n"
"#\n"
"# Make sure you read the documentation at:\n"
"#\n"
"# http://docs.oracle.com/cd/E17076_02/html/api_reference/C/envset_lg_bsize.html\n"
"# http://docs.oracle.com/cd/E17076_02/html/api_reference/C/envset_lg_max.html\n"
"# http://docs.oracle.com/cd/E17076_02/html/programmer_reference/log_limits.html\n"
"#\n"
"# Increase the size of the in-memory log buffer from the default\n"
"# of 32 Kbytes to 256 Kbytes. Decrease the log file size from\n"
"# 10 Mbytes to 1 Mbyte. This will help reduce the amount of disk\n"
"# space required for hot backups. The size of the log file must be\n"
"# at least four times the size of the in-memory log buffer.\n"
"#\n"
"# Note: Decreasing the in-memory buffer size below 256 Kbytes will hurt\n"
"# hurt commit performance. For details, see:\n"
"#\n"
"# http://svn.haxx.se/dev/archive-2002-02/0141.shtml\n"
"#\n"
"set_lg_bsize 262144\n"
"set_lg_max 1048576\n"
"#\n"
"# If you see \"log region out of memory\" errors, bump lg_regionmax.\n"
"# For more information, see:\n"
"#\n"
"# http://docs.oracle.com/cd/E17076_02/html/programmer_reference/log_config.html\n"
"# http://svn.haxx.se/users/archive-2004-10/1000.shtml\n"
"#\n"
"set_lg_regionmax 131072\n"
"#\n"
/* ### Configure this with "svnadmin create --bdb-cache-size" */
"# The default cache size in BDB is only 256k. As explained in\n"
"# http://svn.haxx.se/dev/archive-2004-12/0368.shtml, this is too\n"
"# small for most applications. Bump this number if \"db_stat -m\"\n"
"# shows too many cache misses.\n"
"#\n"
"set_cachesize 0 1048576 1\n";
/* Run-time configurable options.
Each option set consists of a minimum required BDB version, a
config hash key, a header, an inactive form and an active
form. We always write the header; then, depending on the
run-time configuration and the BDB version we're compiling
against, we write either the active or inactive form of the
value. */
static const struct
{
int bdb_major;
int bdb_minor;
const char *config_key;
const char *header;
const char *inactive;
const char *active;
} dbconfig_options[] = {
/* Controlled by "svnadmin create --bdb-txn-nosync" */
{ 4, 0, SVN_FS_CONFIG_BDB_TXN_NOSYNC,
/* header */
"#\n"
"# Disable fsync of log files on transaction commit. Read the\n"
"# documentation about DB_TXN_NOSYNC at:\n"
"#\n"
"# http://docs.oracle.com/cd/E17076_02/html/programmer_reference/log_config.html\n"
"#\n"
"# [requires Berkeley DB 4.0]\n"
"#\n",
/* inactive */
"#set_flags DB_TXN_NOSYNC\n",
/* active */
"set_flags DB_TXN_NOSYNC\n" },
/* Controlled by "svnadmin create --bdb-log-keep" */
{ 4, 2, SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE,
/* header */
src/subversion/subversion/libsvn_fs_base/fs.c view on Meta::CPAN
We only care about the path. */
return bdb_recover(fs->path, FALSE, pool);
}
static svn_error_t *
base_bdb_pack(svn_fs_t *fs,
const char *path,
svn_fs_pack_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel,
void *cancel_baton,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
/* Packing is currently a no op for BDB. */
return SVN_NO_ERROR;
}
/* Running the 'archive' command on a Berkeley DB-based filesystem. */
static svn_error_t *
base_bdb_logfiles(apr_array_header_t **logfiles,
const char *path,
svn_boolean_t only_unused,
apr_pool_t *pool)
{
bdb_env_baton_t *bdb;
char **filelist;
char **filename;
u_int32_t flags = only_unused ? 0 : DB_ARCH_LOG;
*logfiles = apr_array_make(pool, 4, sizeof(const char *));
SVN_ERR(svn_fs_bdb__open(&bdb, path,
SVN_BDB_STANDARD_ENV_FLAGS,
0666, pool));
SVN_BDB_ERR(bdb, bdb->env->log_archive(bdb->env, &filelist, flags));
if (filelist == NULL)
return svn_fs_bdb__close(bdb);
for (filename = filelist; *filename != NULL; ++filename)
{
APR_ARRAY_PUSH(*logfiles, const char *) = apr_pstrdup(pool, *filename);
}
free(filelist);
return svn_fs_bdb__close(bdb);
}
/* Copying a live Berkeley DB-base filesystem. */
/**
* Delete all unused log files from DBD enviroment at @a live_path that exist
* in @a backup_path.
*/
static svn_error_t *
svn_fs_base__clean_logs(const char *live_path,
const char *backup_path,
apr_pool_t *pool)
{
apr_array_header_t *logfiles;
SVN_ERR(base_bdb_logfiles(&logfiles,
live_path,
TRUE, /* Only unused logs */
pool));
{ /* Process unused logs from live area */
int idx;
apr_pool_t *sub_pool = svn_pool_create(pool);
/* Process log files. */
for (idx = 0; idx < logfiles->nelts; idx++)
{
const char *log_file = APR_ARRAY_IDX(logfiles, idx, const char *);
const char *live_log_path;
const char *backup_log_path;
svn_pool_clear(sub_pool);
live_log_path = svn_dirent_join(live_path, log_file, sub_pool);
backup_log_path = svn_dirent_join(backup_path, log_file, sub_pool);
{ /* Compare files. No point in using MD5 and wasting CPU cycles as we
got full copies of both logs */
svn_boolean_t files_match = FALSE;
svn_node_kind_t kind;
/* Check to see if there is a corresponding log file in the backup
directory */
SVN_ERR(svn_io_check_path(backup_log_path, &kind, pool));
/* If the copy of the log exists, compare them */
if (kind == svn_node_file)
SVN_ERR(svn_io_files_contents_same_p(&files_match,
live_log_path,
backup_log_path,
sub_pool));
/* If log files do not match, go to the next log file. */
if (!files_match)
continue;
}
SVN_ERR(svn_io_remove_file2(live_log_path, FALSE, sub_pool));
}
svn_pool_destroy(sub_pool);
}
return SVN_NO_ERROR;
}
/* DB_ENV->get_flags() and DB->get_pagesize() don't exist prior to
Berkeley DB 4.2. */
#if SVN_BDB_VERSION_AT_LEAST(4, 2)
/* Open the BDB environment at PATH and compare its configuration
flags with FLAGS. If every flag in FLAGS is set in the
environment, then set *MATCH to true. Else set *MATCH to false. */
static svn_error_t *
check_env_flags(svn_boolean_t *match,
u_int32_t flags,
const char *path,
apr_pool_t *pool)
{
bdb_env_baton_t *bdb;
#if SVN_BDB_VERSION_AT_LEAST(4, 7)
int flag_state;
#else
u_int32_t envflags;
#endif
SVN_ERR(svn_fs_bdb__open(&bdb, path,
SVN_BDB_STANDARD_ENV_FLAGS,
0666, pool));
#if SVN_BDB_VERSION_AT_LEAST(4, 7)
SVN_BDB_ERR(bdb, bdb->env->log_get_config(bdb->env, flags, &flag_state));
#else
SVN_BDB_ERR(bdb, bdb->env->get_flags(bdb->env, &envflags));
#endif
SVN_ERR(svn_fs_bdb__close(bdb));
#if SVN_BDB_VERSION_AT_LEAST(4, 7)
if (flag_state == 0)
#else
if (flags & envflags)
#endif
*match = TRUE;
else
*match = FALSE;
return SVN_NO_ERROR;
}
( run in 0.890 second using v1.01-cache-2.11-cpan-97f6503c9c8 )