ec8e7760ac
When an on-disk reverse index exists, there is no need to generate one in memory. In fact, doing so can be slow, and require large amounts of the heap. Let's make sure that we treat the on-disk reverse index with precedence (i.e., that when it exists, we don't bother trying to generate an equivalent one in memory) by teaching Git how to conditionally die() when generating a reverse index in memory. Then, add a test to ensure that when (a) an on-disk reverse index exists, and (b) when setting GIT_TEST_REV_INDEX_DIE_IN_MEMORY, that we do not die, implying that we read from the on-disk one. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
75 lines
2.5 KiB
C
75 lines
2.5 KiB
C
#ifndef PACK_REVINDEX_H
|
|
#define PACK_REVINDEX_H
|
|
|
|
/**
|
|
* A revindex allows converting efficiently between three properties
|
|
* of an object within a pack:
|
|
*
|
|
* - index position: the numeric position within the list of sorted object ids
|
|
* found in the .idx file
|
|
*
|
|
* - pack position: the numeric position within the list of objects in their
|
|
* order within the actual .pack file (i.e., 0 is the first object in the
|
|
* .pack, 1 is the second, and so on)
|
|
*
|
|
* - offset: the byte offset within the .pack file at which the object contents
|
|
* can be found
|
|
*/
|
|
|
|
|
|
#define RIDX_SIGNATURE 0x52494458 /* "RIDX" */
|
|
#define RIDX_VERSION 1
|
|
|
|
#define GIT_TEST_WRITE_REV_INDEX "GIT_TEST_WRITE_REV_INDEX"
|
|
#define GIT_TEST_REV_INDEX_DIE_IN_MEMORY "GIT_TEST_REV_INDEX_DIE_IN_MEMORY"
|
|
|
|
struct packed_git;
|
|
|
|
/*
|
|
* load_pack_revindex populates the revindex's internal data-structures for the
|
|
* given pack, returning zero on success and a negative value otherwise.
|
|
*
|
|
* If a '.rev' file is present it is mmap'd, and pointers are assigned into it
|
|
* (instead of using the in-memory variant).
|
|
*/
|
|
int load_pack_revindex(struct packed_git *p);
|
|
|
|
/*
|
|
* offset_to_pack_pos converts an object offset to a pack position. This
|
|
* function returns zero on success, and a negative number otherwise. The
|
|
* parameter 'pos' is usable only on success.
|
|
*
|
|
* If the reverse index has not yet been loaded, this function loads it lazily,
|
|
* and returns an negative number if an error was encountered.
|
|
*
|
|
* This function runs in time O(log N) with the number of objects in the pack.
|
|
*/
|
|
int offset_to_pack_pos(struct packed_git *p, off_t ofs, uint32_t *pos);
|
|
|
|
/*
|
|
* pack_pos_to_index converts the given pack-relative position 'pos' by
|
|
* returning an index-relative position.
|
|
*
|
|
* If the reverse index has not yet been loaded, or the position is out of
|
|
* bounds, this function aborts.
|
|
*
|
|
* This function runs in constant time.
|
|
*/
|
|
uint32_t pack_pos_to_index(struct packed_git *p, uint32_t pos);
|
|
|
|
/*
|
|
* pack_pos_to_offset converts the given pack-relative position 'pos' into a
|
|
* pack offset. For a pack with 'N' objects, asking for position 'N' will return
|
|
* the total size (in bytes) of the pack.
|
|
*
|
|
* If the reverse index has not yet been loaded, or the position is out of
|
|
* bounds, this function aborts.
|
|
*
|
|
* This function runs in constant time under both in-memory and on-disk reverse
|
|
* indexes, but an additional step is taken to consult the corresponding .idx
|
|
* file when using the on-disk format.
|
|
*/
|
|
off_t pack_pos_to_offset(struct packed_git *p, uint32_t pos);
|
|
|
|
#endif
|