1 /* fs.h : interface to Subversion filesystem, private to libsvn_fs
3 * ====================================================================
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
20 * ====================================================================
23 #ifndef SVN_LIBSVN_FS_FS_H
24 #define SVN_LIBSVN_FS_FS_H
26 #include <apr_pools.h>
28 #include <apr_network_io.h>
33 #include "svn_config.h"
34 #include "private/svn_atomic.h"
35 #include "private/svn_cache.h"
36 #include "private/svn_fs_private.h"
37 #include "private/svn_sqlite.h"
38 #include "private/svn_mutex.h"
44 #endif /* __cplusplus */
47 /*** The filesystem structure. ***/
49 /* Following are defines that specify the textual elements of the
50 native filesystem directories and revision files. */
52 /* Names of special files in the fs_fs filesystem. */
53 #define PATH_FORMAT "format" /* Contains format number */
54 #define PATH_UUID "uuid" /* Contains UUID */
55 #define PATH_CURRENT "current" /* Youngest revision */
56 #define PATH_LOCK_FILE "write-lock" /* Revision lock file */
57 #define PATH_PACK_LOCK_FILE "pack-lock" /* Pack lock file */
58 #define PATH_REVS_DIR "revs" /* Directory of revisions */
59 #define PATH_REVPROPS_DIR "revprops" /* Directory of revprops */
60 #define PATH_TXNS_DIR "transactions" /* Directory of transactions in
61 repos w/o log addressing */
62 #define PATH_NODE_ORIGINS_DIR "node-origins" /* Lazy node-origin cache */
63 #define PATH_TXN_PROTOS_DIR "txn-protorevs" /* Directory of proto-revs */
64 #define PATH_TXN_CURRENT "txn-current" /* File with next txn key */
65 #define PATH_TXN_CURRENT_LOCK "txn-current-lock" /* Lock for txn-current */
66 #define PATH_LOCKS_DIR "locks" /* Directory of locks */
67 #define PATH_MIN_UNPACKED_REV "min-unpacked-rev" /* Oldest revision which
68 has not been packed. */
69 #define PATH_REVPROP_GENERATION "revprop-generation"
70 /* Current revprop generation*/
71 #define PATH_MANIFEST "manifest" /* Manifest file name */
72 #define PATH_PACKED "pack" /* Packed revision data file */
73 #define PATH_EXT_PACKED_SHARD ".pack" /* Extension for packed
75 #define PATH_EXT_L2P_INDEX ".l2p" /* extension of the log-
77 #define PATH_EXT_P2L_INDEX ".p2l" /* extension of the phys-
79 /* If you change this, look at tests/svn_test_fs.c(maybe_install_fsfs_conf) */
80 #define PATH_CONFIG "fsfs.conf" /* Configuration */
82 /* Names of special files and file extensions for transactions */
83 #define PATH_CHANGES "changes" /* Records changes made so far */
84 #define PATH_TXN_PROPS "props" /* Transaction properties */
85 #define PATH_NEXT_IDS "next-ids" /* Next temporary ID assignments */
86 #define PATH_PREFIX_NODE "node." /* Prefix for node filename */
87 #define PATH_EXT_TXN ".txn" /* Extension of txn dir */
88 #define PATH_EXT_CHILDREN ".children" /* Extension for dir contents */
89 #define PATH_EXT_PROPS ".props" /* Extension for node props */
90 #define PATH_EXT_REV ".rev" /* Extension of protorev file */
91 #define PATH_EXT_REV_LOCK ".rev-lock" /* Extension of protorev lock file */
92 #define PATH_TXN_ITEM_INDEX "itemidx" /* File containing the current item
94 #define PATH_INDEX "index" /* name of index files w/o ext */
96 /* Names of files in legacy FS formats */
97 #define PATH_REV "rev" /* Proto rev file */
98 #define PATH_REV_LOCK "rev-lock" /* Proto rev (write) lock file */
100 /* Names of sections and options in fsfs.conf. */
101 #define CONFIG_SECTION_CACHES "caches"
102 #define CONFIG_OPTION_FAIL_STOP "fail-stop"
103 #define CONFIG_SECTION_REP_SHARING "rep-sharing"
104 #define CONFIG_OPTION_ENABLE_REP_SHARING "enable-rep-sharing"
105 #define CONFIG_SECTION_DELTIFICATION "deltification"
106 #define CONFIG_OPTION_ENABLE_DIR_DELTIFICATION "enable-dir-deltification"
107 #define CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION "enable-props-deltification"
108 #define CONFIG_OPTION_MAX_DELTIFICATION_WALK "max-deltification-walk"
109 #define CONFIG_OPTION_MAX_LINEAR_DELTIFICATION "max-linear-deltification"
110 #define CONFIG_OPTION_COMPRESSION_LEVEL "compression-level"
111 #define CONFIG_SECTION_PACKED_REVPROPS "packed-revprops"
112 #define CONFIG_OPTION_REVPROP_PACK_SIZE "revprop-pack-size"
113 #define CONFIG_OPTION_COMPRESS_PACKED_REVPROPS "compress-packed-revprops"
114 #define CONFIG_SECTION_IO "io"
115 #define CONFIG_OPTION_BLOCK_SIZE "block-size"
116 #define CONFIG_OPTION_L2P_PAGE_SIZE "l2p-page-size"
117 #define CONFIG_OPTION_P2L_PAGE_SIZE "p2l-page-size"
118 #define CONFIG_SECTION_DEBUG "debug"
119 #define CONFIG_OPTION_PACK_AFTER_COMMIT "pack-after-commit"
120 #define CONFIG_OPTION_VERIFY_BEFORE_COMMIT "verify-before-commit"
121 #define CONFIG_OPTION_COMPRESSION "compression"
123 /* The format number of this filesystem.
124 This is independent of the repository format number, and
125 independent of any other FS back ends.
127 Note: If you bump this, please update the switch statement in
128 svn_fs_fs__create() as well.
130 #define SVN_FS_FS__FORMAT_NUMBER 8
132 /* The minimum format number that supports svndiff version 1. */
133 #define SVN_FS_FS__MIN_SVNDIFF1_FORMAT 2
135 /* The minimum format number that supports transaction ID generation
136 using a transaction sequence in the txn-current file. */
137 #define SVN_FS_FS__MIN_TXN_CURRENT_FORMAT 3
139 /* The minimum format number that supports the "layout" filesystem
141 #define SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT 3
143 /* The minimum format number that stores protorevs in a separate directory. */
144 #define SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT 3
146 /* The minimum format number that doesn't keep node and copy ID counters. */
147 #define SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT 3
149 /* The minimum format number that maintains minfo-here and minfo-count
151 #define SVN_FS_FS__MIN_MERGEINFO_FORMAT 3
153 /* The minimum format number that allows rep sharing. */
154 #define SVN_FS_FS__MIN_REP_SHARING_FORMAT 4
156 /* The minimum format number that supports packed shards. */
157 #define SVN_FS_FS__MIN_PACKED_FORMAT 4
159 /* The minimum format number that stores node kinds in changed-paths lists. */
160 #define SVN_FS_FS__MIN_KIND_IN_CHANGED_FORMAT 4
162 /* 1.8 deltification options should work with any FSFS repo but to avoid
163 * issues with very old servers, restrict those options to the 1.6+ format*/
164 #define SVN_FS_FS__MIN_DELTIFICATION_FORMAT 4
166 /* The minimum format number that supports a configuration file (fsfs.conf) */
167 #define SVN_FS_FS__MIN_CONFIG_FILE 4
169 /* The 1.7-dev format, never released, that packed revprops into SQLite
171 #define SVN_FS_FS__PACKED_REVPROP_SQLITE_DEV_FORMAT 5
173 /* The minimum format number that supports packed revprops. */
174 #define SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT 6
176 /* The minimum format number that supports packed revprops. */
177 #define SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT 7
179 /* Minimum format number that providing a separate lock file for pack ops */
180 #define SVN_FS_FS__MIN_PACK_LOCK_FORMAT 7
182 /* Minimum format number that stores mergeinfo-mode flag in changed paths */
183 #define SVN_FS_FS__MIN_MERGEINFO_IN_CHANGED_FORMAT 7
185 /* Minimum format number that supports per-instance filesystem IDs. */
186 #define SVN_FS_FS__MIN_INSTANCE_ID_FORMAT 7
188 /* The minimum format number that supports svndiff version 2. */
189 #define SVN_FS_FS__MIN_SVNDIFF2_FORMAT 8
191 /* The minimum format number that supports the special notation ("-")
192 for optional values that are not present in the representation strings,
193 such as SHA1 or the uniquifier. For example:
195 15 0 563 7809 28ef320a82e7bd11eebdf3502d69e608 - 14-g/_5
197 #define SVN_FS_FS__MIN_REP_STRING_OPTIONAL_VALUES_FORMAT 8
199 /* The minimum format number that supports V2 schema of the rep-cache.db
201 #define SVN_FS_FS__MIN_REP_CACHE_SCHEMA_V2_FORMAT 8
203 /* On most operating systems apr implements file locks per process, not
204 per file. On Windows apr implements the locking as per file handle
205 locks, so we don't have to add our own mutex for just in-process
207 #if APR_HAS_THREADS && !defined(WIN32)
208 #define SVN_FS_FS__USE_LOCK_MUTEX 1
210 #define SVN_FS_FS__USE_LOCK_MUTEX 0
213 /* Maximum number of changes we deliver per request when listing the
214 changed paths for a given revision. Anything > 0 will do.
215 At 100..300 bytes per entry, this limits the allocation to ~30kB. */
216 #define SVN_FS_FS__CHANGES_BLOCK_SIZE 100
218 /* Private FSFS-specific data shared between all svn_txn_t objects that
219 relate to a particular transaction in a filesystem (as identified
220 by transaction id and filesystem UUID). Objects of this type are
221 allocated in their own subpool of the common pool. */
222 typedef struct fs_fs_shared_txn_data_t
224 /* The next transaction in the list, or NULL if there is no following
226 struct fs_fs_shared_txn_data_t *next;
228 /* ID of this transaction. */
229 svn_fs_fs__id_part_t txn_id;
231 /* Whether the transaction's prototype revision file is locked for
232 writing by any thread in this process (including the current
233 thread; recursive locks are not permitted). This is effectively
234 a non-recursive mutex. */
235 svn_boolean_t being_written;
237 /* The pool in which this object has been allocated; a subpool of the
240 } fs_fs_shared_txn_data_t;
242 /* Private FSFS-specific data shared between all svn_fs_t objects that
243 relate to a particular filesystem, as identified by filesystem UUID.
244 Objects of this type are allocated in the common pool. */
245 typedef struct fs_fs_shared_data_t
247 /* A list of shared transaction objects for each transaction that is
248 currently active, or NULL if none are. All access to this list,
249 including the contents of the objects stored in it, is synchronised
250 under TXN_LIST_LOCK. */
251 fs_fs_shared_txn_data_t *txns;
253 /* A free transaction object, or NULL if there is no free object.
254 Access to this object is synchronised under TXN_LIST_LOCK. */
255 fs_fs_shared_txn_data_t *free_txn;
257 /* The following lock must be taken out in reverse order of their
258 declaration here. Any subset may be acquired and held at any given
259 time but their relative acquisition order must not change.
261 (lock 'txn-current' before 'pack' before 'write' before 'txn-list') */
263 /* A lock for intra-process synchronization when accessing the TXNS list. */
264 svn_mutex__t *txn_list_lock;
266 /* A lock for intra-process synchronization when grabbing the
267 repository write lock. */
268 svn_mutex__t *fs_write_lock;
270 /* A lock for intra-process synchronization when grabbing the
271 repository pack operation lock. */
272 svn_mutex__t *fs_pack_lock;
274 /* A lock for intra-process synchronization when locking the
276 svn_mutex__t *txn_current_lock;
278 /* The common pool, under which this object is allocated, subpools
279 of which are used to allocate the transaction objects. */
280 apr_pool_t *common_pool;
281 } fs_fs_shared_data_t;
283 /* Data structure for the 1st level DAG node cache. */
284 typedef struct fs_fs_dag_cache_t fs_fs_dag_cache_t;
286 /* Key type for all caches that use revision + offset / counter as key.
288 Note: Cache keys should be 16 bytes for best performance and there
289 should be no padding. */
290 typedef struct pair_cache_key_t
292 /* The object's revision. Use the 64 data type to prevent padding. */
293 apr_int64_t revision;
295 /* Sub-address: item index, revprop generation, packed flag, etc. */
299 /* Key type that identifies a txdelta window.
301 Note: Cache keys should require no padding. */
302 typedef struct window_cache_key_t
304 /* The object's revision. Use the 64 data type to prevent padding. */
305 apr_int64_t revision;
307 /* Window number within that representation. */
308 apr_int64_t chunk_index;
310 /* Item index of the representation */
311 apr_uint64_t item_index;
312 } window_cache_key_t;
314 typedef enum compression_type_t
316 compression_type_none,
317 compression_type_zlib,
319 } compression_type_t;
321 /* Private (non-shared) FSFS-specific data for each svn_fs_t object.
322 Any caches in here may be NULL. */
323 typedef struct fs_fs_data_t
325 /* The format number of this FS. */
328 /* The maximum number of files to store per directory (for sharded
329 layouts) or zero (for linear layouts). */
330 int max_files_per_dir;
332 /* If set, this FS is using logical addressing. Otherwise, it is using
333 physical addressing. */
334 svn_boolean_t use_log_addressing;
336 /* Rev / pack file read granularity in bytes. */
337 apr_int64_t block_size;
339 /* Capacity in entries of log-to-phys index pages */
340 apr_int64_t l2p_page_size;
342 /* Rev / pack file granularity (in bytes) covered by a single phys-to-log
344 apr_int64_t p2l_page_size;
346 /* If set, parse and cache *all* data of each block that we read
347 * (not just the one bit that we need, atm). */
348 svn_boolean_t use_block_read;
350 /* The revision that was youngest, last time we checked. */
351 svn_revnum_t youngest_rev_cache;
353 /* Caches of immutable data. (Note that these may be shared between
354 multiple svn_fs_t's for the same filesystem.) */
356 /* Access to the configured memcached instances. May be NULL. */
357 svn_memcache_t *memcache;
359 /* If TRUE, don't ignore any cache-related errors. If FALSE, errors from
360 e.g. memcached may be ignored as caching is an optional feature. */
361 svn_boolean_t fail_stop;
363 /* A cache of revision root IDs, mapping from (svn_revnum_t *) to
364 (svn_fs_id_t *). (Not threadsafe.) */
365 svn_cache__t *rev_root_id_cache;
367 /* Caches native dag_node_t* instances and acts as a 1st level cache */
368 fs_fs_dag_cache_t *dag_node_cache;
370 /* DAG node cache for immutable nodes. Maps (revision, fspath)
371 to (dag_node_t *). This is the 2nd level cache for DAG nodes. */
372 svn_cache__t *rev_node_cache;
374 /* A cache of the contents of immutable directories; maps from
375 unparsed FS ID to a apr_hash_t * mapping (const char *) dirent
376 names to (svn_fs_dirent_t *). */
377 svn_cache__t *dir_cache;
379 /* Fulltext cache; currently only used with memcached. Maps from
380 rep key (revision/offset) to svn_stringbuf_t. */
381 svn_cache__t *fulltext_cache;
383 /* The current prefix to be used for revprop cache entries.
384 If this is 0, a new unique prefix must be chosen. */
385 apr_uint64_t revprop_prefix;
387 /* Revision property cache. Maps from (rev,prefix) to apr_hash_t.
388 Unparsed svn_string_t representations of the serialized hash
389 will be written to the cache but the getter returns apr_hash_t. */
390 svn_cache__t *revprop_cache;
392 /* Node properties cache. Maps from rep key to apr_hash_t. */
393 svn_cache__t *properties_cache;
395 /* Pack manifest cache; a cache mapping (svn_revnum_t) shard number to
396 a manifest; and a manifest is a mapping from (svn_revnum_t) revision
397 number offset within a shard to (apr_off_t) byte-offset in the
398 respective pack file. */
399 svn_cache__t *packed_offset_cache;
401 /* Cache for svn_fs_fs__raw_cached_window_t objects; the key is
402 window_cache_key_t. */
403 svn_cache__t *raw_window_cache;
405 /* Cache for txdelta_window_t objects; the key is window_cache_key_t */
406 svn_cache__t *txdelta_window_cache;
408 /* Cache for combined windows as svn_stringbuf_t objects;
409 the key is window_cache_key_t */
410 svn_cache__t *combined_window_cache;
412 /* Cache for node_revision_t objects; the key is (revision, item_index) */
413 svn_cache__t *node_revision_cache;
415 /* Cache for change lists n blocks as svn_fs_fs__changes_list_t * objects;
416 the key is the (revision, first-element-in-block) pair. */
417 svn_cache__t *changes_cache;
419 /* Cache for svn_fs_fs__rep_header_t objects; the key is a
420 (revision, item index) pair */
421 svn_cache__t *rep_header_cache;
423 /* Cache for svn_mergeinfo_t objects; the key is a combination of
424 revision, inheritance flags and path. */
425 svn_cache__t *mergeinfo_cache;
427 /* Cache for presence of svn_mergeinfo_t on a noderev; the key is a
428 combination of revision, inheritance flags and path; value is "1"
429 if the node has mergeinfo, "0" if it doesn't. */
430 svn_cache__t *mergeinfo_existence_cache;
432 /* Cache for l2p_header_t objects; the key is (revision, is-packed).
433 Will be NULL for pre-format7 repos */
434 svn_cache__t *l2p_header_cache;
436 /* Cache for l2p_page_t objects; the key is svn_fs_fs__page_cache_key_t.
437 Will be NULL for pre-format7 repos */
438 svn_cache__t *l2p_page_cache;
440 /* Cache for p2l_header_t objects; the key is (revision, is-packed).
441 Will be NULL for pre-format7 repos */
442 svn_cache__t *p2l_header_cache;
444 /* Cache for apr_array_header_t objects containing svn_fs_fs__p2l_entry_t
445 elements; the key is svn_fs_fs__page_cache_key_t.
446 Will be NULL for pre-format7 repos */
447 svn_cache__t *p2l_page_cache;
449 /* TRUE while the we hold a lock on the write lock file. */
450 svn_boolean_t has_write_lock;
452 /* If set, there are or have been more than one concurrent transaction */
453 svn_boolean_t concurrent_transactions;
455 /* Temporary cache for changed directories yet to be committed; maps from
456 unparsed FS ID to ###x. NULL outside transactions. */
457 svn_cache__t *txn_dir_cache;
459 /* Data shared between all svn_fs_t objects for a given filesystem. */
460 fs_fs_shared_data_t *shared;
462 /* The sqlite database used for rep caching. */
463 svn_sqlite__db_t *rep_cache_db;
465 /* Thread-safe boolean */
466 svn_atomic_t rep_cache_db_opened;
468 /* The oldest revision not in a pack file. It also applies to revprops
469 * if revprop packing has been enabled by the FSFS format version. */
470 svn_revnum_t min_unpacked_rev;
472 /* Whether rep-sharing is supported by the filesystem
473 * and allowed by the configuration. */
474 svn_boolean_t rep_sharing_allowed;
476 /* File size limit in bytes up to which multiple revprops shall be packed
477 * into a single file. */
478 apr_int64_t revprop_pack_size;
480 /* Whether packed revprop files shall be compressed. */
481 svn_boolean_t compress_packed_revprops;
483 /* Whether directory nodes shall be deltified just like file nodes. */
484 svn_boolean_t deltify_directories;
486 /* Whether nodes properties shall be deltified. */
487 svn_boolean_t deltify_properties;
489 /* Restart deltification histories after each multiple of this value */
490 apr_int64_t max_deltification_walk;
492 /* Maximum number of length of the linear part at the top of the
493 * deltification history after which skip deltas will be used. */
494 apr_int64_t max_linear_deltification;
496 /* Compression type to use with txdelta storage format in new revs. */
497 compression_type_t delta_compression_type;
499 /* Compression level (currently, only used with compression_type_zlib). */
500 int delta_compression_level;
502 /* Pack after every commit. */
503 svn_boolean_t pack_after_commit;
505 /* Verify each new revision before commit. */
506 svn_boolean_t verify_before_commit;
508 /* Per-instance filesystem ID, which provides an additional level of
509 uniqueness for filesystems that share the same UUID, but should
510 still be distinguishable (e.g. backups produced by svn_fs_hotcopy()
511 or dump / load cycles). */
512 const char *instance_id;
514 /* Ensure that all filesystem changes are written to disk. */
515 svn_boolean_t flush_to_disk;
517 /* Pointer to svn_fs_open. */
518 svn_error_t *(*svn_fs_open_)(svn_fs_t **, const char *, apr_hash_t *,
519 apr_pool_t *, apr_pool_t *);
523 /*** Filesystem Transaction ***/
524 typedef struct transaction_t
526 /* node revision id of the root node. */
527 const svn_fs_id_t *root_id;
529 /* node revision id of the node which is the root of the revision
530 upon which this txn is base. (unfinished only) */
531 const svn_fs_id_t *base_id;
533 /* copies list (const char * copy_ids), or NULL if there have been
534 no copies in this transaction. */
535 apr_array_header_t *copies;
540 /*** Representation ***/
541 /* If you add fields to this, check to see if you need to change
542 * svn_fs_fs__rep_copy. */
543 typedef struct representation_t
545 /* Checksums digests for the contents produced by this representation.
546 This checksum is for the contents the rep shows to consumers,
547 regardless of how the rep stores the data under the hood. It is
548 independent of the storage (fulltext, delta, whatever).
550 If has_sha1 is FALSE, then for compatibility behave as though this
551 checksum matches the expected checksum.
553 The md5 checksum is always filled, unless this is rep which was
554 retrieved from the rep-cache. The sha1 checksum is only computed on
555 a write, for use with rep-sharing. */
556 svn_boolean_t has_sha1;
557 unsigned char sha1_digest[APR_SHA1_DIGESTSIZE];
558 unsigned char md5_digest[APR_MD5_DIGESTSIZE];
560 /* Revision where this representation is located. */
561 svn_revnum_t revision;
563 /* Item index with the revision. */
564 apr_uint64_t item_index;
566 /* The size of the representation in bytes as seen in the revision
570 /* The size of the fulltext of the representation. If this is 0,
571 * for a plain rep, the real fulltext size is equal to the SIZE field.
572 * For a delta rep, this field is always the real fulltext size.
574 * Note that svn_fs_fs__fixup_expanded_size() checks for these special
575 * cases and ensures that this field contains the actual value. We call
576 * it early after reading a representation struct, so most code does not
577 * have to worry about it.
579 svn_filesize_t expanded_size;
581 /* Is this a representation (still) within a transaction? */
582 svn_fs_fs__id_part_t txn_id;
584 /* For rep-sharing, we need a way of uniquifying node-revs which share the
585 same representation (see svn_fs_fs__noderev_same_rep_key() ). So, we
586 store the original txn of the node rev (not the rep!), along with some
587 intra-node uniqification content. */
590 /* unique context, i.e. txn ID, in which the noderev (!) got created */
591 svn_fs_fs__id_part_t noderev_txn_id;
593 /* unique value within that txn */
599 /*** Node-Revision ***/
600 /* If you add fields to this, check to see if you need to change
601 * copy_node_revision in dag.c. */
602 typedef struct node_revision_t
605 svn_node_kind_t kind;
607 /* The node-id for this node-rev. */
608 const svn_fs_id_t *id;
610 /* predecessor node revision id, or NULL if there is no predecessor
611 for this node revision */
612 const svn_fs_id_t *predecessor_id;
614 /* If this node-rev is a copy, where was it copied from? */
615 const char *copyfrom_path;
616 svn_revnum_t copyfrom_rev;
618 /* Helper for history tracing, root of the parent tree from whence
619 this node-rev was copied. */
620 svn_revnum_t copyroot_rev;
621 const char *copyroot_path;
623 /* Number of predecessors this node revision has (recursively).
624 A difference from the BDB backend is that it cannot be -1. */
625 int predecessor_count;
627 /* representation key for this node's properties. may be NULL if
628 there are no properties. */
629 representation_t *prop_rep;
631 /* representation for this node's data. may be NULL if there is
633 representation_t *data_rep;
635 /* path at which this node first came into existence. */
636 const char *created_path;
638 /* is this the unmodified root of a transaction? */
639 svn_boolean_t is_fresh_txn_root;
641 /* Number of nodes with svn:mergeinfo properties that are
642 descendants of this node (including it itself) */
643 apr_int64_t mergeinfo_count;
645 /* Does this node itself have svn:mergeinfo? */
646 svn_boolean_t has_mergeinfo;
652 typedef struct change_t
654 /* Path of the change. */
657 /* API compatible change description */
658 svn_fs_path_change2_t info;
662 /*** Context for reading changed paths lists iteratively. */
663 typedef struct svn_fs_fs__changes_context_t
665 /* Repository to fetch from. */
668 /* Revision that we read from. */
669 svn_revnum_t revision;
671 /* Revision file object to use when needed. NULL until the first access. */
672 svn_fs_fs__revision_file_t *revision_file;
674 /* Pool to create REVISION_FILE in. */
675 apr_pool_t *rev_file_pool;
677 /* Index of the next change to fetch. */
680 /* Offset, within the changed paths list on disk, of the next change to
682 apr_off_t next_offset;
684 /* Has the end of the list been reached? */
687 } svn_fs_fs__changes_context_t;
689 /*** Directory (only used at the cache interface) ***/
690 typedef struct svn_fs_fs__dir_data_t
692 /* Contents, i.e. all directory entries, sorted by name. */
693 apr_array_header_t *entries;
695 /* SVN_INVALID_FILESIZE for committed data, otherwise the length of the
696 * in-txn on-disk representation of that directory. */
697 svn_filesize_t txn_filesize;
698 } svn_fs_fs__dir_data_t;
703 #endif /* __cplusplus */
705 #endif /* SVN_LIBSVN_FS_FS_H */