repo: Optimize bare-user content object reads a bit

`perf record ostree checkout ...` for a bare-user repo was telling
me we were spending a good 13% of our time in the depchain of `ot_lgexattrat()`.
The problem here is that traversing the `/proc` path turns out to be
somewhat expensive - there are LSM (SELinux) checks, etc.

For regular files, opening and just getting the xattr, then closing is still
quite cheap. For symlinks, we'll always need to open anyways.

This appears to shave about ~0.1 seconds off of a checkout of
`fedora-atomic/25/x86_64/docker-host` on my workstation.

Oh, and this was the last user of `ot_lgexattrat()` so we can kill it, which is
nice - the xattr code should really live in libglnx.

Closes: #796
Approved by: jlebon
This commit is contained in:
Colin Walters authored and Atomic Bot committed 2017-04-19 15:00:08 +00:00
1 parent 0d8cd2f077
commit 49a525f6a5
3 files changed
+12 -96

No files matched your search

+12 -17
View File
@@ -2770,8 +2770,18 @@ ostree_repo_load_file (OstreeRepo *self,
g_autoptr(GBytes) bytes = NULL;
glnx_fd_close int fd = -1;
bytes = ot_lgetxattrat (self->objects_dir_fd, loose_path_buf,
"user.ostreemeta", error);
/* In bare-user, symlinks are stored as regular files, so we just
* always do an open, then query the user.ostreemeta xattr for
* more information.
*/
fd = openat (self->objects_dir_fd, loose_path_buf, O_RDONLY | O_CLOEXEC);
if (fd < 0)
{
glnx_set_error_from_errno (error);
goto out;
}
bytes = glnx_fgetxattr_bytes (fd, "user.ostreemeta", error);
if (bytes == NULL)
goto out;
@@ -2783,21 +2793,6 @@ ostree_repo_load_file (OstreeRepo *self,
mode = g_file_info_get_attribute_uint32 (ret_file_info, "unix::mode");
/* Optimize this so that we only open the file if we
* need to; symlinks contain their content, and we only
* open regular files if the caller has requested an
* input stream.
*/
if (S_ISLNK (mode) || out_input)
{
fd = openat (self->objects_dir_fd, loose_path_buf, O_RDONLY | O_CLOEXEC);
if (fd < 0)
{
glnx_set_error_from_errno (error);
goto out;
}
}
if (S_ISREG (mode) && out_input)
{
g_assert (fd != -1);