diff --git a/0001-postprocess-Add-envvar-option-and-detect-NFS-skip-os.patch b/0001-postprocess-Add-envvar-option-and-detect-NFS-skip-os.patch new file mode 100644 index 0000000..5c39876 --- /dev/null +++ b/0001-postprocess-Add-envvar-option-and-detect-NFS-skip-os.patch @@ -0,0 +1,119 @@ +From b5c8915ea23fae4dc8a5844444f34c7a00141f42 Mon Sep 17 00:00:00 2001 +From: Colin Walters +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 + #include + #include ++#include ++#include ++#include ++#include + #include + #include + #include +@@ -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 + diff --git a/rpm-ostree.spec b/rpm-ostree.spec index cd685d1..a6e301f 100644 --- a/rpm-ostree.spec +++ b/rpm-ostree.spec @@ -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 - 2017.10-3 +- Backport patch for NFS issues +- https://pagure.io/atomic-wg/issue/387 + * Sun Nov 14 2017 Jonathan Lebon - 2017.10-2 - Backport fix for --repo handling https://github.com/projectatomic/rpm-ostree/pull/1101