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