Backport patch for NFS issues
This commit is contained in:
parent
774cabbaaa
commit
b1f1a8a384
119
0001-postprocess-Add-envvar-option-and-detect-NFS-skip-os.patch
Normal file
119
0001-postprocess-Add-envvar-option-and-detect-NFS-skip-os.patch
Normal 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
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
Summary: Hybrid image/package system
|
Summary: Hybrid image/package system
|
||||||
Name: rpm-ostree
|
Name: rpm-ostree
|
||||||
Version: 2017.10
|
Version: 2017.10
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
#VCS: https://github.com/cgwalters/rpm-ostree
|
#VCS: https://github.com/cgwalters/rpm-ostree
|
||||||
# This tarball is generated via "make -f Makefile.dist-packaging dist-snapshot"
|
# This tarball is generated via "make -f Makefile.dist-packaging dist-snapshot"
|
||||||
Source0: rpm-ostree-%{version}.tar.xz
|
Source0: rpm-ostree-%{version}.tar.xz
|
||||||
@ -9,6 +9,7 @@ License: LGPLv2+
|
|||||||
URL: https://github.com/projectatomic/rpm-ostree
|
URL: https://github.com/projectatomic/rpm-ostree
|
||||||
|
|
||||||
Patch0: 0001-compose-CLI-fix-repo-consuming-two-arguments.patch
|
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
|
# We always run autogen.sh
|
||||||
BuildRequires: autoconf automake libtool git
|
BuildRequires: autoconf automake libtool git
|
||||||
@ -152,6 +153,10 @@ python autofiles.py > files.devel \
|
|||||||
%files devel -f files.devel
|
%files devel -f files.devel
|
||||||
|
|
||||||
%changelog
|
%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
|
* Sun Nov 14 2017 Jonathan Lebon <jlebon@redhat.com> - 2017.10-2
|
||||||
- Backport fix for --repo handling
|
- Backport fix for --repo handling
|
||||||
https://github.com/projectatomic/rpm-ostree/pull/1101
|
https://github.com/projectatomic/rpm-ostree/pull/1101
|
||||||
|
Loading…
Reference in New Issue
Block a user