t2024: mark test using "checkout -p" with PERL prerequisite
[git] / pack-objects.h
1 #ifndef PACK_OBJECTS_H
2 #define PACK_OBJECTS_H
3
4 #include "object-store.h"
5
6 #define DEFAULT_DELTA_CACHE_SIZE (256 * 1024 * 1024)
7
8 #define OE_DFS_STATE_BITS       2
9 #define OE_DEPTH_BITS           12
10 #define OE_IN_PACK_BITS         10
11 #define OE_Z_DELTA_BITS         20
12 /*
13  * Note that oe_set_size() becomes expensive when the given size is
14  * above this limit. Don't lower it too much.
15  */
16 #define OE_SIZE_BITS            31
17 #define OE_DELTA_SIZE_BITS      20
18
19 /*
20  * State flags for depth-first search used for analyzing delta cycles.
21  *
22  * The depth is measured in delta-links to the base (so if A is a delta
23  * against B, then A has a depth of 1, and B a depth of 0).
24  */
25 enum dfs_state {
26         DFS_NONE = 0,
27         DFS_ACTIVE,
28         DFS_DONE,
29         DFS_NUM_STATES
30 };
31
32 /*
33  * The size of struct nearly determines pack-objects's memory
34  * consumption. This struct is packed tight for that reason. When you
35  * add or reorder something in this struct, think a bit about this.
36  *
37  * basic object info
38  * -----------------
39  * idx.oid is filled up before delta searching starts. idx.crc32 is
40  * only valid after the object is written out and will be used for
41  * generating the index. idx.offset will be both gradually set and
42  * used in writing phase (base objects get offset first, then deltas
43  * refer to them)
44  *
45  * "size" is the uncompressed object size. Compressed size of the raw
46  * data for an object in a pack is not stored anywhere but is computed
47  * and made available when reverse .idx is made. Note that when a
48  * delta is reused, "size" is the uncompressed _delta_ size, not the
49  * canonical one after the delta has been applied.
50  *
51  * "hash" contains a path name hash which is used for sorting the
52  * delta list and also during delta searching. Once prepare_pack()
53  * returns it's no longer needed.
54  *
55  * source pack info
56  * ----------------
57  * The (in_pack, in_pack_offset) tuple contains the location of the
58  * object in the source pack. in_pack_header_size allows quickly
59  * skipping the header and going straight to the zlib stream.
60  *
61  * "type" and "in_pack_type" both describe object type. in_pack_type
62  * may contain a delta type, while type is always the canonical type.
63  *
64  * deltas
65  * ------
66  * Delta links (delta, delta_child and delta_sibling) are created to
67  * reflect that delta graph from the source pack then updated or added
68  * during delta searching phase when we find better deltas.
69  *
70  * delta_child and delta_sibling are last needed in
71  * compute_write_order(). "delta" and "delta_size" must remain valid
72  * at object writing phase in case the delta is not cached.
73  *
74  * If a delta is cached in memory and is compressed, delta_data points
75  * to the data and z_delta_size contains the compressed size. If it's
76  * uncompressed [1], z_delta_size must be zero. delta_size is always
77  * the uncompressed size and must be valid even if the delta is not
78  * cached.
79  *
80  * [1] during try_delta phase we don't bother with compressing because
81  * the delta could be quickly replaced with a better one.
82  */
83 struct object_entry {
84         struct pack_idx_entry idx;
85         void *delta_data;       /* cached delta (uncompressed) */
86         off_t in_pack_offset;
87         uint32_t hash;                  /* name hint hash */
88         unsigned size_:OE_SIZE_BITS;
89         unsigned size_valid:1;
90         uint32_t delta_idx;     /* delta base object */
91         uint32_t delta_child_idx; /* deltified objects who bases me */
92         uint32_t delta_sibling_idx; /* other deltified objects who
93                                      * uses the same base as me
94                                      */
95         unsigned delta_size_:OE_DELTA_SIZE_BITS; /* delta data size (uncompressed) */
96         unsigned delta_size_valid:1;
97         unsigned in_pack_idx:OE_IN_PACK_BITS;   /* already in pack */
98         unsigned z_delta_size:OE_Z_DELTA_BITS;
99         unsigned type_valid:1;
100         unsigned type_:TYPE_BITS;
101         unsigned no_try_delta:1;
102         unsigned in_pack_type:TYPE_BITS; /* could be delta */
103         unsigned preferred_base:1; /*
104                                     * we do not pack this, but is available
105                                     * to be used as the base object to delta
106                                     * objects against.
107                                     */
108         unsigned tagged:1; /* near the very tip of refs */
109         unsigned filled:1; /* assigned write-order */
110         unsigned dfs_state:OE_DFS_STATE_BITS;
111         unsigned char in_pack_header_size;
112         unsigned depth:OE_DEPTH_BITS;
113
114         /*
115          * pahole results on 64-bit linux (gcc and clang)
116          *
117          *   size: 80, bit_padding: 20 bits, holes: 8 bits
118          *
119          * and on 32-bit (gcc)
120          *
121          *   size: 76, bit_padding: 20 bits, holes: 8 bits
122          */
123 };
124
125 struct packing_data {
126         struct object_entry *objects;
127         uint32_t nr_objects, nr_alloc;
128
129         int32_t *index;
130         uint32_t index_size;
131
132         unsigned int *in_pack_pos;
133
134         /*
135          * Only one of these can be non-NULL and they have different
136          * sizes. if in_pack_by_idx is allocated, oe_in_pack() returns
137          * the pack of an object using in_pack_idx field. If not,
138          * in_pack[] array is used the same way as in_pack_pos[]
139          */
140         struct packed_git **in_pack_by_idx;
141         struct packed_git **in_pack;
142
143         uintmax_t oe_size_limit;
144 };
145
146 void prepare_packing_data(struct packing_data *pdata);
147 struct object_entry *packlist_alloc(struct packing_data *pdata,
148                                     const unsigned char *sha1,
149                                     uint32_t index_pos);
150
151 struct object_entry *packlist_find(struct packing_data *pdata,
152                                    const unsigned char *sha1,
153                                    uint32_t *index_pos);
154
155 static inline uint32_t pack_name_hash(const char *name)
156 {
157         uint32_t c, hash = 0;
158
159         if (!name)
160                 return 0;
161
162         /*
163          * This effectively just creates a sortable number from the
164          * last sixteen non-whitespace characters. Last characters
165          * count "most", so things that end in ".c" sort together.
166          */
167         while ((c = *name++) != 0) {
168                 if (isspace(c))
169                         continue;
170                 hash = (hash >> 2) + (c << 24);
171         }
172         return hash;
173 }
174
175 static inline enum object_type oe_type(const struct object_entry *e)
176 {
177         return e->type_valid ? e->type_ : OBJ_BAD;
178 }
179
180 static inline void oe_set_type(struct object_entry *e,
181                                enum object_type type)
182 {
183         if (type >= OBJ_ANY)
184                 BUG("OBJ_ANY cannot be set in pack-objects code");
185
186         e->type_valid = type >= OBJ_NONE;
187         e->type_ = (unsigned)type;
188 }
189
190 static inline unsigned int oe_in_pack_pos(const struct packing_data *pack,
191                                           const struct object_entry *e)
192 {
193         return pack->in_pack_pos[e - pack->objects];
194 }
195
196 static inline void oe_set_in_pack_pos(const struct packing_data *pack,
197                                       const struct object_entry *e,
198                                       unsigned int pos)
199 {
200         pack->in_pack_pos[e - pack->objects] = pos;
201 }
202
203 static inline struct packed_git *oe_in_pack(const struct packing_data *pack,
204                                             const struct object_entry *e)
205 {
206         if (pack->in_pack_by_idx)
207                 return pack->in_pack_by_idx[e->in_pack_idx];
208         else
209                 return pack->in_pack[e - pack->objects];
210 }
211
212 void oe_map_new_pack(struct packing_data *pack,
213                      struct packed_git *p);
214 static inline void oe_set_in_pack(struct packing_data *pack,
215                                   struct object_entry *e,
216                                   struct packed_git *p)
217 {
218         if (!p->index)
219                 oe_map_new_pack(pack, p);
220         if (pack->in_pack_by_idx)
221                 e->in_pack_idx = p->index;
222         else
223                 pack->in_pack[e - pack->objects] = p;
224 }
225
226 static inline struct object_entry *oe_delta(
227                 const struct packing_data *pack,
228                 const struct object_entry *e)
229 {
230         if (e->delta_idx)
231                 return &pack->objects[e->delta_idx - 1];
232         return NULL;
233 }
234
235 static inline void oe_set_delta(struct packing_data *pack,
236                                 struct object_entry *e,
237                                 struct object_entry *delta)
238 {
239         if (delta)
240                 e->delta_idx = (delta - pack->objects) + 1;
241         else
242                 e->delta_idx = 0;
243 }
244
245 static inline struct object_entry *oe_delta_child(
246                 const struct packing_data *pack,
247                 const struct object_entry *e)
248 {
249         if (e->delta_child_idx)
250                 return &pack->objects[e->delta_child_idx - 1];
251         return NULL;
252 }
253
254 static inline void oe_set_delta_child(struct packing_data *pack,
255                                       struct object_entry *e,
256                                       struct object_entry *delta)
257 {
258         if (delta)
259                 e->delta_child_idx = (delta - pack->objects) + 1;
260         else
261                 e->delta_child_idx = 0;
262 }
263
264 static inline struct object_entry *oe_delta_sibling(
265                 const struct packing_data *pack,
266                 const struct object_entry *e)
267 {
268         if (e->delta_sibling_idx)
269                 return &pack->objects[e->delta_sibling_idx - 1];
270         return NULL;
271 }
272
273 static inline void oe_set_delta_sibling(struct packing_data *pack,
274                                         struct object_entry *e,
275                                         struct object_entry *delta)
276 {
277         if (delta)
278                 e->delta_sibling_idx = (delta - pack->objects) + 1;
279         else
280                 e->delta_sibling_idx = 0;
281 }
282
283 unsigned long oe_get_size_slow(struct packing_data *pack,
284                                const struct object_entry *e);
285 static inline unsigned long oe_size(struct packing_data *pack,
286                                     const struct object_entry *e)
287 {
288         if (e->size_valid)
289                 return e->size_;
290
291         return oe_get_size_slow(pack, e);
292 }
293
294 static inline int oe_size_less_than(struct packing_data *pack,
295                                     const struct object_entry *lhs,
296                                     unsigned long rhs)
297 {
298         if (lhs->size_valid)
299                 return lhs->size_ < rhs;
300         if (rhs < pack->oe_size_limit) /* rhs < 2^x <= lhs ? */
301                 return 0;
302         return oe_get_size_slow(pack, lhs) < rhs;
303 }
304
305 static inline int oe_size_greater_than(struct packing_data *pack,
306                                        const struct object_entry *lhs,
307                                        unsigned long rhs)
308 {
309         if (lhs->size_valid)
310                 return lhs->size_ > rhs;
311         if (rhs < pack->oe_size_limit) /* rhs < 2^x <= lhs ? */
312                 return 1;
313         return oe_get_size_slow(pack, lhs) > rhs;
314 }
315
316 static inline void oe_set_size(struct packing_data *pack,
317                                struct object_entry *e,
318                                unsigned long size)
319 {
320         if (size < pack->oe_size_limit) {
321                 e->size_ = size;
322                 e->size_valid = 1;
323         } else {
324                 e->size_valid = 0;
325                 if (oe_get_size_slow(pack, e) != size)
326                         BUG("'size' is supposed to be the object size!");
327         }
328 }
329
330 static inline unsigned long oe_delta_size(struct packing_data *pack,
331                                           const struct object_entry *e)
332 {
333         if (e->delta_size_valid)
334                 return e->delta_size_;
335         return oe_size(pack, e);
336 }
337
338 static inline void oe_set_delta_size(struct packing_data *pack,
339                                      struct object_entry *e,
340                                      unsigned long size)
341 {
342         e->delta_size_ = size;
343         e->delta_size_valid = e->delta_size_ == size;
344         if (!e->delta_size_valid && size != oe_size(pack, e))
345                 BUG("this can only happen in check_object() "
346                     "where delta size is the same as entry size");
347 }
348
349 #endif