summaryrefslogtreecommitdiff
path: root/subversion/include/private/svn_fs_fs_private.h
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/include/private/svn_fs_fs_private.h')
-rw-r--r--subversion/include/private/svn_fs_fs_private.h355
1 files changed, 355 insertions, 0 deletions
diff --git a/subversion/include/private/svn_fs_fs_private.h b/subversion/include/private/svn_fs_fs_private.h
new file mode 100644
index 0000000..59aede1
--- /dev/null
+++ b/subversion/include/private/svn_fs_fs_private.h
@@ -0,0 +1,355 @@
+/**
+ * @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;
+} 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;
+
+
+/* Scan all contents of the repository FS and return statistics in *STATS,
+ * allocated in RESULT_POOL. Report progress through PROGRESS_FUNC with
+ * PROGRESS_BATON, if PROGRESS_FUNC is not NULL.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__get_stats(svn_fs_fs__stats_t **stats,
+ svn_fs_t *fs,
+ svn_fs_progress_notify_func_t progress_func,
+ void *progress_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Node-revision IDs in FSFS consist of 3 of 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_offset for in-revision IDs. This struct the
+ * data structure used for each of those parts.
+ */
+typedef struct svn_fs_fs__id_part_t
+{
+ /* SVN_INVALID_REVNUM for txns -> not a txn, COUNTER must be 0.
+ SVN_INVALID_REVNUM for others -> not assigned to a revision, yet.
+ 0 for others -> 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);
+
+/* Read the P2L index for the rev / pack file containing REVISION in FS.
+ * For each index entry, invoke CALLBACK_FUNC with CALLBACK_BATON.
+ * If not NULL, call CANCEL_FUNC with CANCEL_BATON from time to time.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__dump_index(svn_fs_t *fs,
+ svn_revnum_t revision,
+ svn_fs_fs__dump_index_func_t callback_func,
+ void *callback_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+
+/* Rewrite the respective index information of the rev / pack file in FS
+ * containing REVISION and use the svn_fs_fs__p2l_entry_t * array ENTRIES
+ * as the new index contents. Allocate temporaries from SCRATCH_POOL.
+ *
+ * Note that this becomes a no-op if ENTRIES is empty. You may use a zero-
+ * sized empty entry instead.
+ */
+svn_error_t *
+svn_fs_fs__load_index(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_array_header_t *entries,
+ apr_pool_t *scratch_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_FS_FS_PRIVATE_H */