1289177Speter/** 2289177Speter * @copyright 3289177Speter * ==================================================================== 4289177Speter * Licensed to the Apache Software Foundation (ASF) under one 5289177Speter * or more contributor license agreements. See the NOTICE file 6289177Speter * distributed with this work for additional information 7289177Speter * regarding copyright ownership. The ASF licenses this file 8289177Speter * to you under the Apache License, Version 2.0 (the 9289177Speter * "License"); you may not use this file except in compliance 10289177Speter * with the License. You may obtain a copy of the License at 11289177Speter * 12289177Speter * http://www.apache.org/licenses/LICENSE-2.0 13289177Speter * 14289177Speter * Unless required by applicable law or agreed to in writing, 15289177Speter * software distributed under the License is distributed on an 16289177Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17289177Speter * KIND, either express or implied. See the License for the 18289177Speter * specific language governing permissions and limitations 19289177Speter * under the License. 20289177Speter * ==================================================================== 21289177Speter * @endcopyright 22289177Speter * 23289177Speter * @file svn_fs_fs_private.h 24289177Speter * @brief Private API for tools that access FSFS internals and can't use 25289177Speter * the svn_fs_t API for that. 26289177Speter */ 27289177Speter 28289177Speter 29289177Speter#ifndef SVN_FS_FS_PRIVATE_H 30289177Speter#define SVN_FS_FS_PRIVATE_H 31289177Speter 32289177Speter#include <apr_pools.h> 33289177Speter#include <apr_hash.h> 34289177Speter 35289177Speter#include "svn_types.h" 36289177Speter#include "svn_error.h" 37289177Speter#include "svn_fs.h" 38289177Speter#include "svn_iter.h" 39289177Speter#include "svn_config.h" 40289177Speter#include "svn_string.h" 41289177Speter 42289177Speter#ifdef __cplusplus 43289177Speterextern "C" { 44289177Speter#endif /* __cplusplus */ 45289177Speter 46289177Speter 47289177Speter 48289177Speter/* Description of one large representation. It's content will be reused / 49289177Speter * overwritten when it gets replaced by an even larger representation. 50289177Speter */ 51289177Spetertypedef struct svn_fs_fs__large_change_info_t 52289177Speter{ 53289177Speter /* size of the (deltified) representation */ 54289177Speter apr_uint64_t size; 55289177Speter 56289177Speter /* Revision of the representation. SVN_INVALID_REVNUM for unused entries. */ 57289177Speter svn_revnum_t revision; 58289177Speter 59289177Speter /* node path. "" for unused instances */ 60289177Speter svn_stringbuf_t *path; 61289177Speter} svn_fs_fs__large_change_info_t; 62289177Speter 63289177Speter/* Container for the largest representations found so far. The capacity 64289177Speter * is fixed and entries will be inserted by reusing the last one and 65289177Speter * reshuffling the entry pointers. 66289177Speter */ 67289177Spetertypedef struct svn_fs_fs__largest_changes_t 68289177Speter{ 69289177Speter /* number of entries allocated in CHANGES */ 70289177Speter apr_size_t count; 71289177Speter 72289177Speter /* size of the smallest change */ 73289177Speter apr_uint64_t min_size; 74289177Speter 75289177Speter /* changes kept in this struct */ 76289177Speter svn_fs_fs__large_change_info_t **changes; 77289177Speter} svn_fs_fs__largest_changes_t; 78289177Speter 79289177Speter/* Information we gather per size bracket. 80289177Speter */ 81289177Spetertypedef struct svn_fs_fs__histogram_line_t 82289177Speter{ 83289177Speter /* number of item that fall into this bracket */ 84289177Speter apr_uint64_t count; 85289177Speter 86289177Speter /* sum of values in this bracket */ 87289177Speter apr_uint64_t sum; 88289177Speter} svn_fs_fs__histogram_line_t; 89289177Speter 90289177Speter/* A histogram of 64 bit integer values. 91289177Speter */ 92289177Spetertypedef struct svn_fs_fs__histogram_t 93289177Speter{ 94289177Speter /* total sum over all brackets */ 95289177Speter svn_fs_fs__histogram_line_t total; 96289177Speter 97289177Speter /* one bracket per binary step. 98289177Speter * line[i] is the 2^(i-1) <= x < 2^i bracket */ 99289177Speter svn_fs_fs__histogram_line_t lines[64]; 100289177Speter} svn_fs_fs__histogram_t; 101289177Speter 102289177Speter/* Information we collect per file ending. 103289177Speter */ 104289177Spetertypedef struct svn_fs_fs__extension_info_t 105289177Speter{ 106289177Speter /* file extension, including leading "." 107289177Speter * "(none)" in the container for files w/o extension. */ 108289177Speter const char *extension; 109289177Speter 110289177Speter /* histogram of representation sizes */ 111289177Speter svn_fs_fs__histogram_t rep_histogram; 112289177Speter 113289177Speter /* histogram of sizes of changed files */ 114289177Speter svn_fs_fs__histogram_t node_histogram; 115289177Speter} svn_fs_fs__extension_info_t; 116289177Speter 117289177Speter/* Compression statistics we collect over a given set of representations. 118289177Speter */ 119289177Spetertypedef struct svn_fs_fs__rep_pack_stats_t 120289177Speter{ 121289177Speter /* number of representations */ 122289177Speter apr_uint64_t count; 123289177Speter 124289177Speter /* total size after deltification (i.e. on disk size) */ 125289177Speter apr_uint64_t packed_size; 126289177Speter 127289177Speter /* total size after de-deltification (i.e. plain text size) */ 128289177Speter apr_uint64_t expanded_size; 129289177Speter 130289177Speter /* total on-disk header size */ 131289177Speter apr_uint64_t overhead_size; 132289177Speter} svn_fs_fs__rep_pack_stats_t; 133289177Speter 134289177Speter/* Statistics we collect over a given set of representations. 135289177Speter * We group them into shared and non-shared ("unique") reps. 136289177Speter */ 137289177Spetertypedef struct svn_fs_fs__representation_stats_t 138289177Speter{ 139289177Speter /* stats over all representations */ 140289177Speter svn_fs_fs__rep_pack_stats_t total; 141289177Speter 142289177Speter /* stats over those representations with ref_count == 1 */ 143289177Speter svn_fs_fs__rep_pack_stats_t uniques; 144289177Speter 145289177Speter /* stats over those representations with ref_count > 1 */ 146289177Speter svn_fs_fs__rep_pack_stats_t shared; 147289177Speter 148289177Speter /* sum of all ref_counts */ 149289177Speter apr_uint64_t references; 150289177Speter 151289177Speter /* sum of ref_count * expanded_size, 152289177Speter * i.e. total plaintext content if there was no rep sharing */ 153289177Speter apr_uint64_t expanded_size; 154289177Speter} svn_fs_fs__representation_stats_t; 155289177Speter 156289177Speter/* Basic statistics we collect over a given set of noderevs. 157289177Speter */ 158289177Spetertypedef struct svn_fs_fs__node_stats_t 159289177Speter{ 160289177Speter /* number of noderev structs */ 161289177Speter apr_uint64_t count; 162289177Speter 163289177Speter /* their total size on disk (structs only) */ 164289177Speter apr_uint64_t size; 165289177Speter} svn_fs_fs__node_stats_t; 166289177Speter 167289177Speter/* Comprises all the information needed to create the output of the 168289177Speter * 'svnfsfs stats' command. 169289177Speter */ 170289177Spetertypedef struct svn_fs_fs__stats_t 171289177Speter{ 172289177Speter /* sum total of all rev / pack file sizes in bytes */ 173289177Speter apr_uint64_t total_size; 174289177Speter 175289177Speter /* number of revisions in the repository */ 176289177Speter apr_uint64_t revision_count; 177289177Speter 178289177Speter /* total number of changed paths */ 179289177Speter apr_uint64_t change_count; 180289177Speter 181289177Speter /* sum of all changed path list sizes on disk in bytes */ 182289177Speter apr_uint64_t change_len; 183289177Speter 184289177Speter /* stats on all representations */ 185289177Speter svn_fs_fs__representation_stats_t total_rep_stats; 186289177Speter 187289177Speter /* stats on all file text representations */ 188289177Speter svn_fs_fs__representation_stats_t file_rep_stats; 189289177Speter 190289177Speter /* stats on all directory text representations */ 191289177Speter svn_fs_fs__representation_stats_t dir_rep_stats; 192289177Speter 193289177Speter /* stats on all file prop representations */ 194289177Speter svn_fs_fs__representation_stats_t file_prop_rep_stats; 195289177Speter 196289177Speter /* stats on all directory prop representations */ 197289177Speter svn_fs_fs__representation_stats_t dir_prop_rep_stats; 198289177Speter 199289177Speter /* size and count summary over all noderevs */ 200289177Speter svn_fs_fs__node_stats_t total_node_stats; 201289177Speter 202289177Speter /* size and count summary over all file noderevs */ 203289177Speter svn_fs_fs__node_stats_t file_node_stats; 204289177Speter 205289177Speter /* size and count summary over all directory noderevs */ 206289177Speter svn_fs_fs__node_stats_t dir_node_stats; 207289177Speter 208289177Speter /* the biggest single contributors to repo size */ 209289177Speter svn_fs_fs__largest_changes_t *largest_changes; 210289177Speter 211289177Speter /* histogram of representation sizes */ 212289177Speter svn_fs_fs__histogram_t rep_size_histogram; 213289177Speter 214289177Speter /* histogram of sizes of changed nodes */ 215289177Speter svn_fs_fs__histogram_t node_size_histogram; 216289177Speter 217289177Speter /* histogram of representation sizes */ 218289177Speter svn_fs_fs__histogram_t added_rep_size_histogram; 219289177Speter 220289177Speter /* histogram of sizes of changed nodes */ 221289177Speter svn_fs_fs__histogram_t added_node_size_histogram; 222289177Speter 223289177Speter /* histogram of unused representations */ 224289177Speter svn_fs_fs__histogram_t unused_rep_histogram; 225289177Speter 226289177Speter /* histogram of sizes of changed files */ 227289177Speter svn_fs_fs__histogram_t file_histogram; 228289177Speter 229289177Speter /* histogram of sizes of file representations */ 230289177Speter svn_fs_fs__histogram_t file_rep_histogram; 231289177Speter 232289177Speter /* histogram of sizes of changed file property sets */ 233289177Speter svn_fs_fs__histogram_t file_prop_histogram; 234289177Speter 235289177Speter /* histogram of sizes of file property representations */ 236289177Speter svn_fs_fs__histogram_t file_prop_rep_histogram; 237289177Speter 238289177Speter /* histogram of sizes of changed directories (in bytes) */ 239289177Speter svn_fs_fs__histogram_t dir_histogram; 240289177Speter 241289177Speter /* histogram of sizes of directories representations */ 242289177Speter svn_fs_fs__histogram_t dir_rep_histogram; 243289177Speter 244289177Speter /* histogram of sizes of changed directories property sets */ 245289177Speter svn_fs_fs__histogram_t dir_prop_histogram; 246289177Speter 247289177Speter /* histogram of sizes of directories property representations */ 248289177Speter svn_fs_fs__histogram_t dir_prop_rep_histogram; 249289177Speter 250289177Speter /* extension -> svn_fs_fs__extension_info_t* map */ 251289177Speter apr_hash_t *by_extension; 252289177Speter} svn_fs_fs__stats_t; 253289177Speter 254289177Speter 255289177Speter/* Scan all contents of the repository FS and return statistics in *STATS, 256289177Speter * allocated in RESULT_POOL. Report progress through PROGRESS_FUNC with 257289177Speter * PROGRESS_BATON, if PROGRESS_FUNC is not NULL. 258289177Speter * Use SCRATCH_POOL for temporary allocations. 259289177Speter */ 260289177Spetersvn_error_t * 261289177Spetersvn_fs_fs__get_stats(svn_fs_fs__stats_t **stats, 262289177Speter svn_fs_t *fs, 263289177Speter svn_fs_progress_notify_func_t progress_func, 264289177Speter void *progress_baton, 265289177Speter svn_cancel_func_t cancel_func, 266289177Speter void *cancel_baton, 267289177Speter apr_pool_t *result_pool, 268289177Speter apr_pool_t *scratch_pool); 269289177Speter 270289177Speter/* Node-revision IDs in FSFS consist of 3 of sub-IDs ("parts") that consist 271289177Speter * of a creation REVISION number and some revision- / transaction-local 272289177Speter * counter value (NUMBER). Old-style ID parts use global counter values. 273289177Speter * 274289177Speter * The parts are: node_id, copy_id and txn_id for in-txn IDs as well as 275289177Speter * node_id, copy_id and rev_offset for in-revision IDs. This struct the 276289177Speter * data structure used for each of those parts. 277289177Speter */ 278289177Spetertypedef struct svn_fs_fs__id_part_t 279289177Speter{ 280289177Speter /* SVN_INVALID_REVNUM for txns -> not a txn, COUNTER must be 0. 281289177Speter SVN_INVALID_REVNUM for others -> not assigned to a revision, yet. 282289177Speter 0 for others -> old-style ID or the root in rev 0. */ 283289177Speter svn_revnum_t revision; 284289177Speter 285289177Speter /* sub-id value relative to REVISION. Its interpretation depends on 286289177Speter the part itself. In rev_item, it is the index_index value, in others 287289177Speter it represents a unique counter value. */ 288289177Speter apr_uint64_t number; 289289177Speter} svn_fs_fs__id_part_t; 290289177Speter 291289177Speter/* (user visible) entry in the phys-to-log index. It describes a section 292289177Speter * of some packed / non-packed rev file as containing a specific item. 293289177Speter * There must be no overlapping / conflicting entries. 294289177Speter */ 295289177Spetertypedef struct svn_fs_fs__p2l_entry_t 296289177Speter{ 297289177Speter /* offset of the first byte that belongs to the item */ 298289177Speter apr_off_t offset; 299289177Speter 300289177Speter /* length of the item in bytes */ 301289177Speter apr_off_t size; 302289177Speter 303289177Speter /* type of the item (see SVN_FS_FS__ITEM_TYPE_*) defines */ 304289177Speter apr_uint32_t type; 305289177Speter 306289177Speter /* modified FNV-1a checksum. 0 if unknown checksum */ 307289177Speter apr_uint32_t fnv1_checksum; 308289177Speter 309289177Speter /* item in that block */ 310289177Speter svn_fs_fs__id_part_t item; 311289177Speter} svn_fs_fs__p2l_entry_t; 312289177Speter 313289177Speter 314289177Speter/* Callback function type receiving a single P2L index ENTRY, a user 315289177Speter * provided BATON and a SCRATCH_POOL for temporary allocations. 316289177Speter * ENTRY's lifetime may end when the callback returns. 317289177Speter */ 318289177Spetertypedef svn_error_t * 319289177Speter(*svn_fs_fs__dump_index_func_t)(const svn_fs_fs__p2l_entry_t *entry, 320289177Speter void *baton, 321289177Speter apr_pool_t *scratch_pool); 322289177Speter 323289177Speter/* Read the P2L index for the rev / pack file containing REVISION in FS. 324289177Speter * For each index entry, invoke CALLBACK_FUNC with CALLBACK_BATON. 325289177Speter * If not NULL, call CANCEL_FUNC with CANCEL_BATON from time to time. 326289177Speter * Use SCRATCH_POOL for temporary allocations. 327289177Speter */ 328289177Spetersvn_error_t * 329289177Spetersvn_fs_fs__dump_index(svn_fs_t *fs, 330289177Speter svn_revnum_t revision, 331289177Speter svn_fs_fs__dump_index_func_t callback_func, 332289177Speter void *callback_baton, 333289177Speter svn_cancel_func_t cancel_func, 334289177Speter void *cancel_baton, 335289177Speter apr_pool_t *scratch_pool); 336289177Speter 337289177Speter 338289177Speter/* Rewrite the respective index information of the rev / pack file in FS 339289177Speter * containing REVISION and use the svn_fs_fs__p2l_entry_t * array ENTRIES 340289177Speter * as the new index contents. Allocate temporaries from SCRATCH_POOL. 341289177Speter * 342289177Speter * Note that this becomes a no-op if ENTRIES is empty. You may use a zero- 343289177Speter * sized empty entry instead. 344289177Speter */ 345289177Spetersvn_error_t * 346289177Spetersvn_fs_fs__load_index(svn_fs_t *fs, 347289177Speter svn_revnum_t revision, 348289177Speter apr_array_header_t *entries, 349289177Speter apr_pool_t *scratch_pool); 350289177Speter 351289177Speter#ifdef __cplusplus 352289177Speter} 353289177Speter#endif /* __cplusplus */ 354289177Speter 355289177Speter#endif /* SVN_FS_FS_PRIVATE_H */ 356