[ostree: 62/70] Add cache_dir_fd to OstreeRepo



commit b787fce6128d53eee627fea8d49b1363efd15251
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Apr 11 10:25:40 2016 +0200

    Add cache_dir_fd to OstreeRepo
    
    This will allow us later to easily swap out the cache dir.
    
    Closes: #250
    Approved by: cgwalters

 src/libostree/ostree-repo-private.h |    4 +++-
 src/libostree/ostree-repo-prune.c   |    5 ++++-
 src/libostree/ostree-repo-pull.c    |   26 ++++++++++++++++----------
 src/libostree/ostree-repo.c         |   32 ++++++++++++++++++++++++++++++++
 4 files changed, 55 insertions(+), 12 deletions(-)
---
diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h
index c60ab24..1cf99ea 100644
--- a/src/libostree/ostree-repo-private.h
+++ b/src/libostree/ostree-repo-private.h
@@ -33,7 +33,8 @@ G_BEGIN_DECLS
 
 #define _OSTREE_OBJECT_SIZES_ENTRY_SIGNATURE "ay"
 
-#define _OSTREE_SUMMARY_CACHE_PATH "tmp/cache/summaries"
+#define _OSTREE_SUMMARY_CACHE_DIR "summaries"
+#define _OSTREE_CACHE_DIR "cache"
 
 /**
  * OstreeRepo:
@@ -52,6 +53,7 @@ struct OstreeRepo {
   int    repo_dir_fd;
   GFile *tmp_dir;
   int    tmp_dir_fd;
+  int    cache_dir_fd;
   GFile *objects_dir;
   GFile *state_dir;
   int objects_dir_fd;
diff --git a/src/libostree/ostree-repo-prune.c b/src/libostree/ostree-repo-prune.c
index 9aed0ac..8c5d13e 100644
--- a/src/libostree/ostree-repo-prune.c
+++ b/src/libostree/ostree-repo-prune.c
@@ -125,7 +125,10 @@ _ostree_repo_prune_tmp (OstreeRepo *self,
   g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
   glnx_fd_close int fd = -1;
 
-  fd = glnx_opendirat_with_errno (self->repo_dir_fd, _OSTREE_SUMMARY_CACHE_PATH, FALSE);
+  if (self->cache_dir_fd == -1)
+    return TRUE;
+
+  fd = glnx_opendirat_with_errno (self->cache_dir_fd, _OSTREE_SUMMARY_CACHE_DIR, FALSE);
   if (fd < 0)
     {
       if (errno == ENOENT)
diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c
index f292951..eef5f03 100644
--- a/src/libostree/ostree-repo-pull.c
+++ b/src/libostree/ostree-repo-pull.c
@@ -1783,12 +1783,15 @@ _ostree_repo_load_cache_summary_if_same_sig (OstreeRepo        *self,
                                              GError           **error)
 {
   gboolean ret = FALSE;
-  const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_PATH, "/", remote, ".sig");
+  const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote, ".sig");
 
   glnx_fd_close int prev_fd = -1;
   g_autoptr(GBytes) old_sig_contents = NULL;
 
-  if (!ot_openat_ignore_enoent (self->repo_dir_fd, summary_cache_sig_file, &prev_fd, error))
+  if (self->cache_dir_fd == -1)
+    return TRUE;
+
+  if (!ot_openat_ignore_enoent (self->cache_dir_fd, summary_cache_sig_file, &prev_fd, error))
     goto out;
 
   if (prev_fd < 0)
@@ -1803,17 +1806,17 @@ _ostree_repo_load_cache_summary_if_same_sig (OstreeRepo        *self,
 
   if (g_bytes_compare (old_sig_contents, summary_sig) == 0)
     {
-      const char *summary_cache_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_PATH, "/", remote);
+      const char *summary_cache_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote);
       glnx_fd_close int summary_fd = -1;
       GBytes *summary_data;
 
 
-      summary_fd = openat (self->repo_dir_fd, summary_cache_file, O_CLOEXEC | O_RDONLY);
+      summary_fd = openat (self->cache_dir_fd, summary_cache_file, O_CLOEXEC | O_RDONLY);
       if (summary_fd < 0)
         {
           if (errno == ENOENT)
             {
-              (void) unlinkat (self->repo_dir_fd, summary_cache_sig_file, 0);
+              (void) unlinkat (self->cache_dir_fd, summary_cache_sig_file, 0);
               ret = TRUE;
               goto out;
             }
@@ -1842,13 +1845,16 @@ _ostree_repo_cache_summary (OstreeRepo        *self,
                             GError           **error)
 {
   gboolean ret = FALSE;
-  const char *summary_cache_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_PATH, "/", remote);
-  const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_PATH, "/", remote, ".sig");
+  const char *summary_cache_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote);
+  const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote, ".sig");
+
+  if (self->cache_dir_fd == -1)
+    return TRUE;
 
-  if (!glnx_shutil_mkdir_p_at (self->repo_dir_fd, _OSTREE_SUMMARY_CACHE_PATH, 0775, cancellable, error))
+  if (!glnx_shutil_mkdir_p_at (self->cache_dir_fd, _OSTREE_SUMMARY_CACHE_DIR, 0775, cancellable, error))
     goto out;
 
-  if (!glnx_file_replace_contents_at (self->repo_dir_fd,
+  if (!glnx_file_replace_contents_at (self->cache_dir_fd,
                                       summary_cache_file,
                                       g_bytes_get_data (summary, NULL),
                                       g_bytes_get_size (summary),
@@ -1856,7 +1862,7 @@ _ostree_repo_cache_summary (OstreeRepo        *self,
                                       cancellable, error))
     goto out;
 
-  if (!glnx_file_replace_contents_at (self->repo_dir_fd,
+  if (!glnx_file_replace_contents_at (self->cache_dir_fd,
                                       summary_cache_sig_file,
                                       g_bytes_get_data (summary_sig, NULL),
                                       g_bytes_get_size (summary_sig),
diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c
index d59c8e7..b8cb242 100644
--- a/src/libostree/ostree-repo.c
+++ b/src/libostree/ostree-repo.c
@@ -613,6 +613,8 @@ ostree_repo_finalize (GObject *object)
   g_clear_object (&self->tmp_dir);
   if (self->tmp_dir_fd)
     (void) close (self->tmp_dir_fd);
+  if (self->cache_dir_fd)
+    (void) close (self->cache_dir_fd);
   g_clear_object (&self->objects_dir);
   if (self->objects_dir_fd != -1)
     (void) close (self->objects_dir_fd);
@@ -784,6 +786,7 @@ ostree_repo_init (OstreeRepo *self)
   g_mutex_init (&self->remotes_lock);
 
   self->repo_dir_fd = -1;
+  self->cache_dir_fd = -1;
   self->commit_stagedir_fd = -1;
   self->objects_dir_fd = -1;
   self->uncompressed_objects_dir_fd = -1;
@@ -2371,6 +2374,7 @@ ostree_repo_open (OstreeRepo    *self,
   g_autofree char *version = NULL;
   g_autofree char *mode = NULL;
   g_autofree char *parent_repo_path = NULL;
+  g_autoptr(GError) temp_error = NULL;
 
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
@@ -2507,6 +2511,34 @@ ostree_repo_open (OstreeRepo    *self,
   if (!glnx_opendirat (self->repo_dir_fd, "tmp", TRUE, &self->tmp_dir_fd, error))
     goto out;
 
+  if (!glnx_shutil_mkdir_p_at (self->tmp_dir_fd, _OSTREE_CACHE_DIR, 0775, cancellable, &temp_error))
+    {
+      if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED))
+        {
+          g_clear_error (&temp_error);
+          g_debug ("No permissions to create cache dir");
+        }
+      else
+        {
+          g_propagate_error (error, g_steal_pointer (&temp_error));
+          goto out;
+        }
+    }
+
+  if (!glnx_opendirat (self->tmp_dir_fd, _OSTREE_CACHE_DIR, TRUE, &self->cache_dir_fd, &temp_error))
+    {
+      if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+        {
+          g_clear_error (&temp_error);
+          g_debug ("No cache dir");
+        }
+      else
+        {
+          g_propagate_error (error, g_steal_pointer (&temp_error));
+          goto out;
+        }
+    }
+
   if (self->mode == OSTREE_REPO_MODE_ARCHIVE_Z2 && self->enable_uncompressed_cache)
     {
       if (!gs_file_ensure_directory (self->uncompressed_objects_dir, TRUE, cancellable, error))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]