summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2017-11-28 09:33:17 -0500
committerAtomic Bot <atomic-devel@projectatomic.io>2017-12-01 19:00:18 +0000
commit870b614f37b17c9e2583e24ebae7467687015b20 (patch)
tree0d4292b89ba6a28def1d27f934f47bb141e05fe5
parent72304a272c7df7870ce1cafb5e97b611fa2114a7 (diff)
downloadostree-870b614f37b17c9e2583e24ebae7467687015b20.tar.gz
lib/commit: Minor refactoring of tmpdir cleanup code
Prep for future work here; let's cleanly separate the path for cleaning up the txn staging directories from the code that cleans up "other stuff". Currently only the former case uses the `GLnxLockFile` etc. Closes: #1352 Approved by: dbnicholson
-rw-r--r--src/libostree/ostree-repo-commit.c93
1 files changed, 53 insertions, 40 deletions
diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c
index aaea0a06..85e2e891 100644
--- a/src/libostree/ostree-repo-commit.c
+++ b/src/libostree/ostree-repo-commit.c
@@ -1441,6 +1441,41 @@ rename_pending_loose_objects (OstreeRepo *self,
return TRUE;
}
+/* Try to lock a transaction stage directory created by
+ * ostree_repo_prepare_transaction().
+ */
+static gboolean
+cleanup_txn_dir (OstreeRepo *self,
+ int dfd,
+ const char *path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_auto(GLnxLockFile) lockfile = { 0, };
+ gboolean did_lock;
+
+ /* Try to lock, but if we don't get it, move on */
+ if (!_ostree_repo_try_lock_tmpdir (dfd, path, &lockfile, &did_lock, error))
+ return FALSE;
+ if (!did_lock)
+ return TRUE; /* Note early return */
+
+ /* If however this is the staging directory for the *current*
+ * boot, then don't delete it now - we may end up reusing it, as
+ * is the point.
+ */
+ if (g_str_has_prefix (path, self->stagedir_prefix))
+ return TRUE; /* Note early return */
+
+ /* But, crucially we can now clean up staging directories
+ * from *other* boots.
+ */
+ if (!glnx_shutil_rm_rf_at (dfd, path, cancellable, error))
+ return glnx_prefix_error (error, "Removing %s", path);
+
+ return TRUE;
+}
+
/* Look in repo/tmp and delete files that are older than a day (by default).
* This used to be primarily used by the libsoup fetcher which stored partially
* written objects. In practice now that that isn't done anymore, we should
@@ -1461,15 +1496,9 @@ cleanup_tmpdir (OstreeRepo *self,
while (TRUE)
{
- guint64 delta;
struct dirent *dent;
- struct stat stbuf;
- g_auto(GLnxLockFile) lockfile = { 0, };
- gboolean did_lock;
-
if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
return FALSE;
-
if (dent == NULL)
break;
@@ -1479,56 +1508,40 @@ cleanup_tmpdir (OstreeRepo *self,
if (strcmp (dent->d_name, "cache") == 0)
continue;
+ struct stat stbuf;
if (!glnx_fstatat_allow_noent (dfd_iter.fd, dent->d_name, &stbuf, AT_SYMLINK_NOFOLLOW, error))
return FALSE;
if (errno == ENOENT) /* Did another cleanup win? */
continue;
- /* First, if it's a directory which needs locking, but it's
- * busy, skip it.
- */
+ /* Handle transaction tmpdirs */
if (_ostree_repo_is_locked_tmpdir (dent->d_name))
{
- if (!_ostree_repo_try_lock_tmpdir (dfd_iter.fd, dent->d_name,
- &lockfile, &did_lock, error))
+ if (!cleanup_txn_dir (self, dfd_iter.fd, dent->d_name, cancellable, error))
return FALSE;
- if (!did_lock)
- continue;
+ continue; /* We've handled this, move on */
}
- /* If however this is the staging directory for the *current*
- * boot, then don't delete it now - we may end up reusing it, as
- * is the point.
+ /* At this point we're looking at an unknown-origin file or directory in
+ * the tmpdir. This could be something like a temporary checkout dir (used
+ * by rpm-ostree), or (from older versions of libostree) a tempfile if we
+ * don't have O_TMPFILE for commits.
*/
- if (g_str_has_prefix (dent->d_name, self->stagedir_prefix))
+
+ /* Ignore files from the future */
+ if (stbuf.st_mtime > curtime_secs)
continue;
- else if (g_str_has_prefix (dent->d_name, OSTREE_REPO_TMPDIR_STAGING))
+
+ /* We're pruning content based on the expiry, which
+ * defaults to a day. That's what we were doing before we
+ * had locking...but in future we can be smarter here.
+ */
+ guint64 delta = curtime_secs - stbuf.st_mtime;
+ if (delta > self->tmp_expiry_seconds)
{
- /* But, crucially we can now clean up staging directories
- * from *other* boots
- */
if (!glnx_shutil_rm_rf_at (dfd_iter.fd, dent->d_name, cancellable, error))
return glnx_prefix_error (error, "Removing %s", dent->d_name);
}
- else
- {
- /* Now we do time-based cleanup. Ignore it if it's somehow
- * in the future...
- */
- if (stbuf.st_mtime > curtime_secs)
- continue;
-
- /* Now, we're pruning content based on the expiry, which
- * defaults to a day. That's what we were doing before we
- * had locking...but in future we can be smarter here.
- */
- delta = curtime_secs - stbuf.st_mtime;
- if (delta > self->tmp_expiry_seconds)
- {
- if (!glnx_shutil_rm_rf_at (dfd_iter.fd, dent->d_name, cancellable, error))
- return glnx_prefix_error (error, "Removing %s", dent->d_name);
- }
- }
}
return TRUE;