FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

indexer: Avoid one `mmap(2)`/`munmap(2)` pair per `git_indexer_append` call by lhchavez · Pull Request #6039 · libgit2/libgit2 · GitHub

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension .c  (1) All 1 file type selected
Viewed files
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Unified
Split
Hide whitespace
Diff view
Unified
Split
Hide whitespace
40 changes: 37 additions & 3 deletions src/indexer.c
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -601,9 +601,10 @@ static void hash_partially(git_indexer *idx, const uint8_t *data, size_t size)
idx->inbuf_len += size - to_expell;
}

#if defined(NO_MMAP) || !defined(GIT_WIN32)

static int write_at(git_indexer *idx, const void *data, off64_t offset, size_t size)
{
#ifdef NO_MMAP
size_t remaining_size = size;
const char *ptr = (const char *)data;

Expand All @@ -619,7 +620,31 @@ static int write_at(git_indexer *idx, const void *data, off64_t offset, size_t s
offset += nb;
remaining_size -= nb;
}

return 0;
}

static int append_to_pack(git_indexer *idx, const void *data, size_t size)
{
if (write_at(idx, data, idx->pack->mwf.size, size) < 0) {
git_error_set(GIT_ERROR_OS, "cannot extend packfile '%s'", idx->pack->pack_name);
return -1;
}

return 0;
}

#else

/*
* Windows may keep different views to a networked file for the mmap- and
* open-accessed versions of a file, so any writes done through
* `write(2)`/`pwrite(2)` may not be reflected on the data that `mmap(2)` is
* able to read.
*/

static int write_at(git_indexer *idx, const void *data, off64_t offset, size_t size)
{
git_file fd = idx->pack->mwf.fd;
size_t mmap_alignment;
size_t page_offset;
Expand All @@ -644,7 +669,6 @@ static int write_at(git_indexer *idx, const void *data, off64_t offset, size_t s
map_data = (unsigned char *)map.data;
memcpy(map_data + page_offset, data, size);
p_munmap(&map);
#endif

return 0;
}
Expand Down Expand Up @@ -680,6 +704,8 @@ static int append_to_pack(git_indexer *idx, const void *data, size_t size)
return write_at(idx, data, idx->pack->mwf.size, size);
}

#endif

static int read_stream_object(git_indexer *idx, git_indexer_progress *stats)
{
git_packfile_stream *stream = &idx->stream;
Expand Down Expand Up @@ -1279,11 +1305,19 @@ int git_indexer_commit(git_indexer *idx, git_indexer_progress *stats)
if (git_mwindow_free_all(&idx->pack->mwf) < 0)
goto on_error;

/* Truncate file to undo rounding up to next page_size in append_to_pack */
#if !defined(NO_MMAP) && defined(GIT_WIN32)
/*
* Some non-Windows remote filesystems fail when truncating files if the
* file permissions change after opening the file (done by p_mkstemp).
*
* Truncation is only needed when mmap is used to undo rounding up to next
* page_size in append_to_pack.
*/
if (p_ftruncate(idx->pack->mwf.fd, idx->pack->mwf.size) < 0) {
git_error_set(GIT_ERROR_OS, "failed to truncate pack file '%s'", idx->pack->pack_name);
return -1;
}
#endif

if (idx->do_fsync && p_fsync(idx->pack->mwf.fd) < 0) {
git_error_set(GIT_ERROR_OS, "failed to fsync packfile");
Expand Down

Back | FazBrowse Home | New Git URL