THIS IS A TEST INSTANCE ONLY! REPOSITORIES CAN BE DELETED AT ANY TIME!

Git Source Code Mirror - This is a publish-only repository and all pull requests are ignored. Please follow Documentation/SubmittingPatches procedure for any of your improvements.
git
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

443 lignes
12KB

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