##// END OF EJS Templates
help: align description of 'base rev' with reality [issue5488]...
Kim Alvefur -
r31214:167b69cc default
parent child Browse files
Show More
@@ -1,215 +1,215 b''
1 1 Revision logs - or *revlogs* - are an append only data structure for
2 2 storing discrete entries, or *revisions*. They are the primary storage
3 3 mechanism of repository data.
4 4
5 5 Revlogs effectively model a directed acyclic graph (DAG). Each node
6 6 has edges to 1 or 2 *parent* nodes. Each node contains metadata and
7 7 the raw value for that node.
8 8
9 9 Revlogs consist of entries which have metadata and revision data.
10 10 Metadata includes the hash of the revision's content, sizes, and
11 11 links to its *parent* entries. The collective metadata is referred
12 12 to as the *index* and the revision data is the *data*.
13 13
14 14 Revision data is stored as a series of compressed deltas against previous
15 15 revisions.
16 16
17 17 Revlogs are written in an append-only fashion. We never need to rewrite
18 18 a file to insert nor do we need to remove data. Rolling back in-progress
19 19 writes can be performed by truncating files. Read locks can be avoided
20 20 using simple techniques. This means that references to other data in
21 21 the same revlog *always* refer to a previous entry.
22 22
23 23 Revlogs can be modeled as 0-indexed arrays. The first revision is
24 24 revision #0 and the second is revision #1. The revision -1 is typically
25 25 used to mean *does not exist* or *not defined*.
26 26
27 27 File Format
28 28 ===========
29 29
30 30 A revlog begins with a 32-bit big endian integer holding version info
31 31 and feature flags. This integer is shared with the first revision
32 32 entry.
33 33
34 34 This integer is logically divided into 2 16-bit shorts. The least
35 35 significant half of the integer is the format/version short. The other
36 36 short holds feature flags that dictate behavior of the revlog.
37 37
38 38 Only 1 bit of the format/version short is currently used. Remaining
39 39 bits are reserved for future use.
40 40
41 41 The following values for the format/version short are defined:
42 42
43 43 0
44 44 The original revlog version.
45 45 1
46 46 RevlogNG (*next generation*). It replaced version 0 when it was
47 47 implemented in 2006.
48 48
49 49 The feature flags short consists of bit flags. Where 0 is the least
50 50 significant bit, the following bit offsets define flags:
51 51
52 52 0
53 53 Store revision data inline.
54 54 1
55 55 Generaldelta encoding.
56 56
57 57 2-15
58 58 Reserved for future use.
59 59
60 60 The following header values are common:
61 61
62 62 00 00 00 01
63 63 RevlogNG
64 64 00 01 00 01
65 65 RevlogNG + inline
66 66 00 02 00 01
67 67 RevlogNG + generaldelta
68 68 00 03 00 01
69 69 RevlogNG + inline + generaldelta
70 70
71 71 Following the 32-bit header is the remainder of the first index entry.
72 72 Following that are remaining *index* data. Inlined revision data is
73 73 possibly located between index entries. More on this layout is described
74 74 below.
75 75
76 76 RevlogNG Format
77 77 ===============
78 78
79 79 RevlogNG (version 1) begins with an index describing the revisions in
80 80 the revlog. If the ``inline`` flag is set, revision data is stored inline,
81 81 or between index entries (as opposed to in a separate container).
82 82
83 83 Each index entry is 64 bytes. The byte layout of each entry is as
84 84 follows, with byte 0 being the first byte (all data stored as big endian):
85 85
86 86 0-3 (4 bytes) (rev 0 only)
87 87 Revlog header
88 88
89 89 0-5 (6 bytes)
90 90 Absolute offset of revision data from beginning of revlog.
91 91
92 92 6-7 (2 bytes)
93 93 Bit flags impacting revision behavior. The following bit offsets define:
94 94
95 95 0: REVIDX_ISCENSORED revision has censor metadata, must be verified.
96 96
97 97 1: REVIDX_ELLIPSIS revision hash does not match its data. Used by
98 98 narrowhg
99 99
100 100 2: REVIDX_EXTSTORED revision data is stored externally.
101 101
102 102 8-11 (4 bytes)
103 103 Compressed length of revision data / chunk as stored in revlog.
104 104
105 105 12-15 (4 bytes)
106 106 Uncompressed length of revision data. This is the size of the full
107 107 revision data, not the size of the chunk post decompression.
108 108
109 109 16-19 (4 bytes)
110 110 Base or previous revision this revision's delta was produced against.
111 -1 means this revision holds full text (as opposed to a delta).
112 For generaldelta repos, this is the previous revision in the delta
113 chain. For non-generaldelta repos, this is the base or first
111 This revision holds full text (as opposed to a delta) if it points to
112 itself. For generaldelta repos, this is the previous revision in the
113 delta chain. For non-generaldelta repos, this is the base or first
114 114 revision in the delta chain.
115 115
116 116 20-23 (4 bytes)
117 117 A revision this revision is *linked* to. This allows a revision in
118 118 one revlog to be forever associated with a revision in another
119 119 revlog. For example, a file's revlog may point to the changelog
120 120 revision that introduced it.
121 121
122 122 24-27 (4 bytes)
123 123 Revision of 1st parent. -1 indicates no parent.
124 124
125 125 28-31 (4 bytes)
126 126 Revision of 2nd parent. -1 indicates no 2nd parent.
127 127
128 128 32-63 (32 bytes)
129 129 Hash of revision's full text. Currently, SHA-1 is used and only
130 130 the first 20 bytes of this field are used. The rest of the bytes
131 131 are ignored and should be stored as \0.
132 132
133 133 If inline revision data is being stored, the compressed revision data
134 134 (of length from bytes offset 8-11 from the index entry) immediately
135 135 follows the index entry. There is no header on the revision data. There
136 136 is no padding between it and the index entries before and after.
137 137
138 138 If revision data is not inline, then raw revision data is stored in a
139 139 separate byte container. The offsets from bytes 0-5 and the compressed
140 140 length from bytes 8-11 define how to access this data.
141 141
142 142 The first 4 bytes of the revlog are shared between the revlog header
143 143 and the 6 byte absolute offset field from the first revlog entry.
144 144
145 145 Delta Chains
146 146 ============
147 147
148 148 Revision data is encoded as a chain of *chunks*. Each chain begins with
149 149 the compressed original full text for that revision. Each subsequent
150 150 *chunk* is a *delta* against the previous revision. We therefore call
151 151 these chains of chunks/deltas *delta chains*.
152 152
153 153 The full text for a revision is reconstructed by loading the original
154 154 full text for the base revision of a *delta chain* and then applying
155 155 *deltas* until the target revision is reconstructed.
156 156
157 157 *Delta chains* are limited in length so lookup time is bound. They are
158 158 limited to ~2x the length of the revision's data. The linear distance
159 159 between the base chunk and the final chunk is also limited so the
160 160 amount of read I/O to load all chunks in the delta chain is bound.
161 161
162 162 Deltas and delta chains are either computed against the previous
163 163 revision in the revlog or another revision (almost certainly one of
164 164 the parents of the revision). Historically, deltas were computed against
165 165 the previous revision. The *generaldelta* revlog feature flag (enabled
166 166 by default in Mercurial 3.7) activates the mode where deltas are
167 167 computed against an arbitrary revision (almost certainly a parent revision).
168 168
169 169 File Storage
170 170 ============
171 171
172 172 Revlogs logically consist of an index (metadata of entries) and
173 173 revision data. This data may be stored together in a single file or in
174 174 separate files. The mechanism used is indicated by the ``inline`` feature
175 175 flag on the revlog.
176 176
177 177 Mercurial's behavior is to use inline storage until a revlog reaches a
178 178 certain size, at which point it will be converted to non-inline. The
179 179 reason there is a size limit on inline storage is to establish an upper
180 180 bound on how much data must be read to load the index. It would be a waste
181 181 to read tens or hundreds of extra megabytes of data just to access the
182 182 index data.
183 183
184 184 The actual layout of revlog files on disk is governed by the repository's
185 185 *store format*. Typically, a ``.i`` file represents the index revlog
186 186 (possibly containing inline data) and a ``.d`` file holds the revision data.
187 187
188 188 Revision Entries
189 189 ================
190 190
191 191 Revision entries consist of an optional 1 byte header followed by an
192 192 encoding of the revision data. The headers are as follows:
193 193
194 194 \0 (0x00)
195 195 Revision data is the entirety of the entry, including this header.
196 196 u (0x75)
197 197 Raw revision data follows.
198 198 x (0x78)
199 199 zlib (RFC 1950) data.
200 200
201 201 The 0x78 value is actually the first byte of the zlib header (CMF byte).
202 202
203 203 Hash Computation
204 204 ================
205 205
206 206 The hash of the revision is stored in the index and is used both as a primary
207 207 key and for data integrity verification.
208 208
209 209 Currently, SHA-1 is the only supported hashing algorithm. To obtain the SHA-1
210 210 hash of a revision:
211 211
212 212 1. Hash the parent nodes
213 213 2. Hash the fulltext of the revision
214 214
215 215 The 20 byte node ids of the parents are fed into the hasher in ascending order.
General Comments 0
You need to be logged in to leave comments. Login now