blob: 2ca61e4cf8c1879d9e4a0c9891e3dedbac73751d [file] [log] [blame]
/**
* @copyright
* ====================================================================
* 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.
* ====================================================================
* @endcopyright
*
* @file svn_fs_fs_private.h
* @brief Private API for tools that access FSFS internals and can't use
* the svn_fs_t API for that.
*/
#ifndef SVN_FS_FS_PRIVATE_H
#define SVN_FS_FS_PRIVATE_H
#include <apr_pools.h>
#include <apr_hash.h>
#include "svn_types.h"
#include "svn_error.h"
#include "svn_fs.h"
#include "svn_iter.h"
#include "svn_config.h"
#include "svn_string.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Description of one large representation. It's content will be reused /
* overwritten when it gets replaced by an even larger representation.
*/
typedef struct svn_fs_fs__large_change_info_t
{
/* size of the (deltified) representation */
apr_uint64_t size;
/* Revision of the representation. SVN_INVALID_REVNUM for unused entries.
*/
svn_revnum_t revision;
/* node path. "" for unused instances */
svn_stringbuf_t *path;
} svn_fs_fs__large_change_info_t;
/* Container for the largest representations found so far. The capacity
* is fixed and entries will be inserted by reusing the last one and
* reshuffling the entry pointers.
*/
typedef struct svn_fs_fs__largest_changes_t
{
/* number of entries allocated in CHANGES */
apr_size_t count;
/* size of the smallest change */
apr_uint64_t min_size;
/* changes kept in this struct */
svn_fs_fs__large_change_info_t **changes;
} svn_fs_fs__largest_changes_t;
/* Information we gather per size bracket.
*/
typedef struct svn_fs_fs__histogram_line_t
{
/* number of item that fall into this bracket */
apr_uint64_t count;
/* sum of values in this bracket */
apr_uint64_t sum;
} svn_fs_fs__histogram_line_t;
/* A histogram of 64 bit integer values.
*/
typedef struct svn_fs_fs__histogram_t
{
/* total sum over all brackets */
svn_fs_fs__histogram_line_t total;
/* one bracket per binary step.
* line[i] is the 2^(i-1) <= x < 2^i bracket */
svn_fs_fs__histogram_line_t lines[64];
} svn_fs_fs__histogram_t;
/* Information we collect per file ending.
*/
typedef struct svn_fs_fs__extension_info_t
{
/* file extension, including leading "."
* "(none)" in the container for files w/o extension. */
const char *extension;
/* histogram of representation sizes */
svn_fs_fs__histogram_t rep_histogram;
/* histogram of sizes of changed files */
svn_fs_fs__histogram_t node_histogram;
} svn_fs_fs__extension_info_t;
/* Compression statistics we collect over a given set of representations.
*/
typedef struct svn_fs_fs__rep_pack_stats_t
{
/* number of representations */
apr_uint64_t count;
/* total size after deltification (i.e. on disk size) */
apr_uint64_t packed_size;
/* total size after de-deltification (i.e. plain text size) */
apr_uint64_t expanded_size;
/* total on-disk header size */
apr_uint64_t overhead_size;
} svn_fs_fs__rep_pack_stats_t;
/* Statistics we collect over a given set of representations.
* We group them into shared and non-shared ("unique") reps.
*/
typedef struct svn_fs_fs__representation_stats_t
{
/* stats over all representations */
svn_fs_fs__rep_pack_stats_t total;
/* stats over those representations with ref_count == 1 */
svn_fs_fs__rep_pack_stats_t uniques;
/* stats over those representations with ref_count > 1 */
svn_fs_fs__rep_pack_stats_t shared;
/* sum of all ref_counts */
apr_uint64_t references;
/* sum of ref_count * expanded_size,
* i.e. total plaintext content if there was no rep sharing */
apr_uint64_t expanded_size;
/* sum of all representation delta chain lengths */
apr_uint64_t chain_len;
} svn_fs_fs__representation_stats_t;
/* Basic statistics we collect over a given set of noderevs.
*/
typedef struct svn_fs_fs__node_stats_t
{
/* number of noderev structs */
apr_uint64_t count;
/* their total size on disk (structs only) */
apr_uint64_t size;
} svn_fs_fs__node_stats_t;
/* Comprises all the information needed to create the output of the
* 'svnfsfs stats' command.
*/
typedef struct svn_fs_fs__stats_t
{
/* sum total of all rev / pack file sizes in bytes */
apr_uint64_t total_size;
/* number of revisions in the repository */
apr_uint64_t revision_count;
/* total number of changed paths */
apr_uint64_t change_count;
/* sum of all changed path list sizes on disk in bytes */
apr_uint64_t change_len;
/* stats on all representations */
svn_fs_fs__representation_stats_t total_rep_stats;
/* stats on all file text representations */
svn_fs_fs__representation_stats_t file_rep_stats;
/* stats on all directory text representations */
svn_fs_fs__representation_stats_t dir_rep_stats;
/* stats on all file prop representations */
svn_fs_fs__representation_stats_t file_prop_rep_stats;
/* stats on all directory prop representations */
svn_fs_fs__representation_stats_t dir_prop_rep_stats;
/* size and count summary over all noderevs */
svn_fs_fs__node_stats_t total_node_stats;
/* size and count summary over all file noderevs */
svn_fs_fs__node_stats_t file_node_stats;
/* size and count summary over all directory noderevs */
svn_fs_fs__node_stats_t dir_node_stats;
/* the biggest single contributors to repo size */
svn_fs_fs__largest_changes_t *largest_changes;
/* histogram of representation sizes */
svn_fs_fs__histogram_t rep_size_histogram;
/* histogram of sizes of changed nodes */
svn_fs_fs__histogram_t node_size_histogram;
/* histogram of representation sizes */
svn_fs_fs__histogram_t added_rep_size_histogram;
/* histogram of sizes of changed nodes */
svn_fs_fs__histogram_t added_node_size_histogram;
/* histogram of unused representations */
svn_fs_fs__histogram_t unused_rep_histogram;
/* histogram of sizes of changed files */
svn_fs_fs__histogram_t file_histogram;
/* histogram of sizes of file representations */
svn_fs_fs__histogram_t file_rep_histogram;
/* histogram of sizes of changed file property sets */
svn_fs_fs__histogram_t file_prop_histogram;
/* histogram of sizes of file property representations */
svn_fs_fs__histogram_t file_prop_rep_histogram;
/* histogram of sizes of changed directories (in bytes) */
svn_fs_fs__histogram_t dir_histogram;
/* histogram of sizes of directories representations */
svn_fs_fs__histogram_t dir_rep_histogram;
/* histogram of sizes of changed directories property sets */
svn_fs_fs__histogram_t dir_prop_histogram;
/* histogram of sizes of directories property representations */
svn_fs_fs__histogram_t dir_prop_rep_histogram;
/* extension -> svn_fs_fs__extension_info_t* map */
apr_hash_t *by_extension;
} svn_fs_fs__stats_t;
/* A node-revision ID in FSFS consists of 3 sub-IDs ("parts") that consist
* of a creation REVISION number and some revision- / transaction-local
* counter value (NUMBER). Old-style ID parts use global counter values.
*
* The parts are: node_id, copy_id and txn_id for in-txn IDs as well as
* node_id, copy_id and rev_item for in-revision IDs. This struct is the
* data structure used for each of those parts.
*/
typedef struct svn_fs_fs__id_part_t
{
/* SVN_INVALID_REVNUM for txn_id part -> not a txn, NUMBER must be 0.
SVN_INVALID_REVNUM for other parts -> not assigned to a revision, yet.
0 for other parts -> old-style ID or the root in rev 0.
*/
svn_revnum_t revision;
/* sub-id value relative to REVISION. Its interpretation depends on
the part itself. In rev_item, it is the index_index value, in others
it represents a unique counter value. */
apr_uint64_t number;
} svn_fs_fs__id_part_t;
/* (user visible) entry in the phys-to-log index. It describes a section
* of some packed / non-packed rev file as containing a specific item.
* There must be no overlapping / conflicting entries.
*/
typedef struct svn_fs_fs__p2l_entry_t
{
/* offset of the first byte that belongs to the item */
apr_off_t offset;
/* length of the item in bytes */
apr_off_t size;
/* type of the item (see SVN_FS_FS__ITEM_TYPE_*) defines */
apr_uint32_t type;
/* modified FNV-1a checksum. 0 if unknown checksum */
apr_uint32_t fnv1_checksum;
/* item in that block */
svn_fs_fs__id_part_t item;
} svn_fs_fs__p2l_entry_t;
/* Callback function type receiving a single P2L index ENTRY, a user
* provided BATON and a SCRATCH_POOL for temporary allocations.
* ENTRY's lifetime may end when the callback returns.
*/
typedef svn_error_t *
(*svn_fs_fs__dump_index_func_t)(const svn_fs_fs__p2l_entry_t *entry,
void *baton,
apr_pool_t *scratch_pool);
typedef struct svn_fs_fs__ioctl_get_stats_input_t
{
svn_fs_progress_notify_func_t progress_func;
void *progress_baton;
} svn_fs_fs__ioctl_get_stats_input_t;
typedef struct svn_fs_fs__ioctl_get_stats_output_t
{
svn_fs_fs__stats_t *stats;
} svn_fs_fs__ioctl_get_stats_output_t;
SVN_FS_DECLARE_IOCTL_CODE(SVN_FS_FS__IOCTL_GET_STATS, SVN_FS_TYPE_FSFS, 1000);
typedef struct svn_fs_fs__ioctl_dump_index_input_t
{
svn_revnum_t revision;
svn_fs_fs__dump_index_func_t callback_func;
void *callback_baton;
} svn_fs_fs__ioctl_dump_index_input_t;
SVN_FS_DECLARE_IOCTL_CODE(SVN_FS_FS__IOCTL_DUMP_INDEX, SVN_FS_TYPE_FSFS, 1001);
typedef struct svn_fs_fs__ioctl_load_index_input_t
{
svn_revnum_t revision;
/* Array of svn_fs_fs__p2l_entry_t * entries. */
apr_array_header_t *entries;
} svn_fs_fs__ioctl_load_index_input_t;
SVN_FS_DECLARE_IOCTL_CODE(SVN_FS_FS__IOCTL_LOAD_INDEX, SVN_FS_TYPE_FSFS, 1002);
typedef struct svn_fs_fs__ioctl_revision_size_input_t
{
svn_revnum_t revision;
} svn_fs_fs__ioctl_revision_size_input_t;
typedef struct svn_fs_fs__ioctl_revision_size_output_t
{
apr_off_t rev_size;
} svn_fs_fs__ioctl_revision_size_output_t;
/* See svn_fs_fs__revision_size(). */
SVN_FS_DECLARE_IOCTL_CODE(SVN_FS_FS__IOCTL_REVISION_SIZE, SVN_FS_TYPE_FSFS, 1003);
typedef struct svn_fs_fs__ioctl_build_rep_cache_input_t
{
svn_revnum_t start_rev;
svn_revnum_t end_rev;
svn_fs_progress_notify_func_t progress_func;
void *progress_baton;
} svn_fs_fs__ioctl_build_rep_cache_input_t;
/* See svn_fs_fs__build_rep_cache(). */
SVN_FS_DECLARE_IOCTL_CODE(SVN_FS_FS__IOCTL_BUILD_REP_CACHE, SVN_FS_TYPE_FSFS, 1004);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SVN_FS_FS_PRIVATE_H */