Backport patch for NFS issues

This commit is contained in:
Colin Walters 2017-11-22 11:43:17 -05:00
parent 774cabbaaa
commit b1f1a8a384
2 changed files with 125 additions and 1 deletions

View File

@ -0,0 +1,119 @@
From b5c8915ea23fae4dc8a5844444f34c7a00141f42 Mon Sep 17 00:00:00 2001
From: Colin Walters <walters@verbum.org>
Date: Wed, 22 Nov 2017 10:46:27 -0500
Subject: [PATCH] postprocess: Add envvar option, and detect NFS, skip ostree
txn
This is for: https://pagure.io/atomic-wg/issue/387
Right now the way libostree stages objects into `${repo}/tmp` is basically an
anti-pattern for (possibly concurrent) operations on NFS. Having multiple
processes try to clean the tmpdir invites races, and there's really no reason to
"stage" all of the content.
(Unfortunately unless NFS supports `O_TMPFILE` we still need temp files,
but that's a separate issue)
In this patch we auto-detect NFS which should make the Fedora pungi runs "just
work", but I also added an environment variable to opt-in.
Closes: #1111
Approved by: jlebon
---
src/libpriv/rpmostree-postprocess.c | 58 +++++++++++++++++++++++++++++--------
1 file changed, 46 insertions(+), 12 deletions(-)
diff --git a/src/libpriv/rpmostree-postprocess.c b/src/libpriv/rpmostree-postprocess.c
index 03a22173..4827ebed 100644
--- a/src/libpriv/rpmostree-postprocess.c
+++ b/src/libpriv/rpmostree-postprocess.c
@@ -29,6 +29,10 @@
#include <utime.h>
#include <err.h>
#include <sys/types.h>
+#include <sys/statvfs.h>
+#include <sys/vfs.h>
+#include <sys/stat.h>
+#include <linux/magic.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
@@ -1872,6 +1876,17 @@ on_progress_timeout (gpointer datap)
return TRUE;
}
+/* https://pagure.io/atomic-wg/issue/387 */
+static gboolean
+repo_is_on_netfs (OstreeRepo *repo)
+{
+ int dfd = ostree_repo_get_dfd (repo);
+ struct statfs stbuf;
+ if (fstatfs (dfd, &stbuf) != 0)
+ return FALSE;
+ return stbuf.f_type == NFS_SUPER_MAGIC;
+}
+
gboolean
rpmostree_commit (int rootfs_fd,
OstreeRepo *repo,
@@ -1893,8 +1908,15 @@ rpmostree_commit (int rootfs_fd,
return FALSE;
}
- if (!ostree_repo_prepare_transaction (repo, NULL, cancellable, error))
- return FALSE;
+ /* See comment above */
+ const gboolean use_txn = (getenv ("RPMOSTREE_COMMIT_NO_TXN") == NULL &&
+ !repo_is_on_netfs (repo));
+
+ if (use_txn)
+ {
+ if (!ostree_repo_prepare_transaction (repo, NULL, cancellable, error))
+ return FALSE;
+ }
g_autoptr(OstreeMutableTree) mtree = ostree_mutable_tree_new ();
/* We may make this configurable if someone complains about including some
@@ -1986,17 +2008,29 @@ rpmostree_commit (int rootfs_fd,
return glnx_prefix_error (error, "While writing to '%s'", write_commitid_to);
}
else if (refname)
- ostree_repo_transaction_set_ref (repo, NULL, refname, new_revision);
-
- OstreeRepoTransactionStats stats = { 0, };
- if (!ostree_repo_commit_transaction (repo, &stats, cancellable, error))
- return glnx_prefix_error (error, "Commit");
+ {
+ if (use_txn)
+ ostree_repo_transaction_set_ref (repo, NULL, refname, new_revision);
+ else
+ {
+ if (!ostree_repo_set_ref_immediate (repo, NULL, refname, new_revision,
+ cancellable, error))
+ return FALSE;
+ }
+ }
- g_print ("Metadata Total: %u\n", stats.metadata_objects_total);
- g_print ("Metadata Written: %u\n", stats.metadata_objects_written);
- g_print ("Content Total: %u\n", stats.content_objects_total);
- g_print ("Content Written: %u\n", stats.content_objects_written);
- g_print ("Content Bytes Written: %" G_GUINT64_FORMAT "\n", stats.content_bytes_written);
+ if (use_txn)
+ {
+ OstreeRepoTransactionStats stats = { 0, };
+ if (!ostree_repo_commit_transaction (repo, &stats, cancellable, error))
+ return glnx_prefix_error (error, "Commit");
+
+ g_print ("Metadata Total: %u\n", stats.metadata_objects_total);
+ g_print ("Metadata Written: %u\n", stats.metadata_objects_written);
+ g_print ("Content Total: %u\n", stats.content_objects_total);
+ g_print ("Content Written: %u\n", stats.content_objects_written);
+ g_print ("Content Bytes Written: %" G_GUINT64_FORMAT "\n", stats.content_bytes_written);
+ }
if (out_new_revision)
*out_new_revision = g_steal_pointer (&new_revision);
return TRUE;
--
2.14.2

View File

@ -1,7 +1,7 @@
Summary: Hybrid image/package system
Name: rpm-ostree
Version: 2017.10
Release: 2%{?dist}
Release: 3%{?dist}
#VCS: https://github.com/cgwalters/rpm-ostree
# This tarball is generated via "make -f Makefile.dist-packaging dist-snapshot"
Source0: rpm-ostree-%{version}.tar.xz
@ -9,6 +9,7 @@ License: LGPLv2+
URL: https://github.com/projectatomic/rpm-ostree
Patch0: 0001-compose-CLI-fix-repo-consuming-two-arguments.patch
Patch1: 0001-postprocess-Add-envvar-option-and-detect-NFS-skip-os.patch
# We always run autogen.sh
BuildRequires: autoconf automake libtool git
@ -152,6 +153,10 @@ python autofiles.py > files.devel \
%files devel -f files.devel
%changelog
* Wed Nov 22 2017 Colin Walters <walters@verbum.org> - 2017.10-3
- Backport patch for NFS issues
- https://pagure.io/atomic-wg/issue/387
* Sun Nov 14 2017 Jonathan Lebon <jlebon@redhat.com> - 2017.10-2
- Backport fix for --repo handling
https://github.com/projectatomic/rpm-ostree/pull/1101