CernVM-FS  2.12.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
catalog_mgr_rw.h
Go to the documentation of this file.
1 
29 #ifndef CVMFS_CATALOG_MGR_RW_H_
30 #define CVMFS_CATALOG_MGR_RW_H_
31 
32 #include <pthread.h>
33 #include <stdint.h>
34 
35 #include <map>
36 #include <set>
37 #include <string>
38 
39 #include "catalog_mgr_ro.h"
40 #include "catalog_rw.h"
41 #include "file_chunk.h"
42 #include "upload_spooler_result.h"
43 #include "util/future.h"
44 #include "xattr.h"
45 
46 class XattrList;
47 namespace upload {
48 class Spooler;
49 }
50 
51 namespace download {
52 class DownloadManager;
53 }
54 
55 namespace manifest {
56 class Manifest;
57 }
58 
59 namespace perf {
60 class Statistics;
61 }
62 
63 namespace catalog {
64 template <class CatalogMgrT>
65 class CatalogBalancer;
66 }
67 
68 namespace catalog {
69 
72  // TODO(jblomer): only needed to get Spooler's hash algorithm. Remove me
73  // after refactoring of the swissknife utility.
74  friend class VirtualCatalog;
75 
76  public:
78  const std::string &stratum0,
79  const std::string &dir_temp,
80  upload::Spooler *spooler,
81  download::DownloadManager *download_manager,
82  bool enforce_limits,
83  const unsigned nested_kcatalog_limit,
84  const unsigned root_kcatalog_limit,
85  const unsigned file_mbyte_limit,
87  bool is_balanceable,
88  unsigned max_weight,
89  unsigned min_weight,
90  const std::string &dir_cache = "");
92  static manifest::Manifest *CreateRepository(const std::string &dir_temp,
93  const bool volatile_content,
94  const std::string &voms_authz,
95  upload::Spooler *spooler);
96 
97  // DirectoryEntry handling
98  void AddFile(const DirectoryEntryBase &entry,
99  const XattrList &xattrs,
100  const std::string &parent_directory)
101  {
102  AddFile(DirectoryEntry(entry), xattrs, parent_directory);
103  }
104  void AddChunkedFile(const DirectoryEntryBase &entry,
105  const XattrList &xattrs,
106  const std::string &parent_directory,
107  const FileChunkList &file_chunks);
108  void RemoveFile(const std::string &file_path);
109 
110  void AddDirectory(const DirectoryEntryBase &entry,
111  const XattrList &xattrs,
112  const std::string &parent_directory);
113  void TouchDirectory(const DirectoryEntryBase &entry,
114  const XattrList &xattrs,
115  const std::string &directory_path);
116  void RemoveDirectory(const std::string &directory_path);
117 
118  void Clone(const std::string from, const std::string to);
119  void CloneTree(const std::string &from_dir, const std::string &to_dir);
120 
121  // Hardlink group handling
122  void AddHardlinkGroup(const DirectoryEntryBaseList &entries,
123  const XattrList &xattrs,
124  const std::string &parent_directory,
125  const FileChunkList &file_chunks);
126  void ShrinkHardlinkGroup(const std::string &remove_path);
127 
128  // Nested catalog handling
129  void CreateNestedCatalog(const std::string &mountpoint);
130  void RemoveNestedCatalog(const std::string &mountpoint,
131  const bool merge = true);
132  void SwapNestedCatalog(const string &mountpoint, const shash::Any &new_hash,
133  const uint64_t new_size);
134  bool IsTransitionPoint(const std::string &mountpoint);
135  WritableCatalog *GetHostingCatalog(const std::string &path);
136 
137  inline bool IsBalanceable() const { return is_balanceable_; }
141  void PrecalculateListings();
142 
143  void SetTTL(const uint64_t new_ttl);
144  bool SetVOMSAuthz(const std::string &voms_authz);
145  bool Commit(const bool stop_for_tweaks,
146  const uint64_t manual_revision,
148 
149  void Balance() {
150  if (IsBalanceable()) {
151  DoBalance();
152  } else {
153  LogCvmfs(kLogCatalog, kLogVerboseMsg, "Not balancing the catalog "
154  "manager because it is not balanceable");
155  }
156  }
157 
158  protected:
160 
161  Catalog *CreateCatalog(const PathString &mountpoint,
162  const shash::Any &catalog_hash,
163  Catalog *parent_catalog);
164  void ActivateCatalog(Catalog *catalog);
165 
166  void AddFile(const DirectoryEntry &entry,
167  const XattrList &xattrs,
168  const std::string &parent_directory);
169 
170  private:
171  bool FindCatalog(const std::string &path,
172  WritableCatalog **result,
173  DirectoryEntry *dirent = NULL);
174  void DoBalance();
175  void FixWeight(WritableCatalog *catalog);
176 
177  void CloneTreeImpl(const PathString &source_dir,
178  const std::string &dest_parent_dir,
179  const NameString &dest_name);
180 
181  struct CatalogInfo {
182  uint64_t ttl;
183  size_t size;
185  uint64_t revision;
186  };
187 
191  };
192 
193  CatalogInfo SnapshotCatalogs(const bool stop_for_tweaks);
194  void FinalizeCatalog(WritableCatalog *catalog,
195  const bool stop_for_tweaks);
197 
200  result);
201  assert(dirty);
202  }
204  WritableCatalogList *result) const;
205 
206  void CatalogUploadCallback(const upload::SpoolerResult &result,
207  const CatalogUploadContext clg_upload_context);
208 
210 
211  private:
212  inline void SyncLock() { pthread_mutex_lock(sync_lock_); }
213  inline void SyncUnlock() { pthread_mutex_unlock(sync_lock_); }
214 
215  //****************************************************************************
216  // Workaround -- Serialized Catalog Committing
218  const unsigned int number_of_dirty_catalogs =
220  assert(number_of_dirty_catalogs <= result->size());
221  }
222  int GetModifiedCatalogsRecursively(const Catalog *catalog,
223  WritableCatalogList *result) const;
225  const upload::SpoolerResult &result,
226  const CatalogUploadContext unused);
227  CatalogInfo SnapshotCatalogsSerialized(const bool stop_for_tweaks);
228  //****************************************************************************
229 
230  // defined in catalog_mgr_rw.cc
231  static const std::string kCatalogFilename;
232 
233  // private lock of WritableCatalogManager
234  pthread_mutex_t *sync_lock_;
235  upload::Spooler *spooler_;
236 
237  pthread_mutex_t *catalog_processing_lock_;
238  std::map<std::string, WritableCatalog*> catalog_processing_map_;
239 
240  // TODO(jblomer): catalog limits should become its own struct
245 
250 
254  const bool is_balanceable_;
255 
262  const unsigned max_weight_;
263 
271  const unsigned min_weight_;
272 
278  const unsigned balance_weight_;
279 }; // class WritableCatalogManager
280 
281 } // namespace catalog
282 
283 #endif // CVMFS_CATALOG_MGR_RW_H_
void AddChunkedFile(const DirectoryEntryBase &entry, const XattrList &xattrs, const std::string &parent_directory, const FileChunkList &file_chunks)
const manifest::Manifest * manifest() const
Definition: repository.h:125
void CloneTree(const std::string &from_dir, const std::string &to_dir)
void AddHardlinkGroup(const DirectoryEntryBaseList &entries, const XattrList &xattrs, const std::string &parent_directory, const FileChunkList &file_chunks)
void AddDirectory(const DirectoryEntryBase &entry, const XattrList &xattrs, const std::string &parent_directory)
void RemoveDirectory(const std::string &directory_path)
Definition: future.h:32
WritableCatalog * GetHostingCatalog(const std::string &path)
void FixWeight(WritableCatalog *catalog)
void ScheduleCatalogProcessing(WritableCatalog *catalog)
std::map< std::string, WritableCatalog * > catalog_processing_map_
void SetTTL(const uint64_t new_ttl)
int GetModifiedCatalogsRecursively(const Catalog *catalog, WritableCatalogList *result) const
assert((mem||(size==0))&&"Out Of Memory")
bool FindCatalog(const std::string &path, WritableCatalog **result, DirectoryEntry *dirent=NULL)
bool Commit(const bool stop_for_tweaks, const uint64_t manual_revision, manifest::Manifest *manifest)
pthread_mutex_t * catalog_processing_lock_
std::vector< WritableCatalog * > WritableCatalogList
Definition: catalog_rw.h:203
void CloneTreeImpl(const PathString &source_dir, const std::string &dest_parent_dir, const NameString &dest_name)
bool IsTransitionPoint(const std::string &mountpoint)
void CatalogUploadCallback(const upload::SpoolerResult &result, const CatalogUploadContext clg_upload_context)
void TouchDirectory(const DirectoryEntryBase &entry, const XattrList &xattrs, const std::string &directory_path)
static manifest::Manifest * CreateRepository(const std::string &dir_temp, const bool volatile_content, const std::string &voms_authz, upload::Spooler *spooler)
void ActivateCatalog(Catalog *catalog)
WritableCatalogManager(const shash::Any &base_hash, const std::string &stratum0, const std::string &dir_temp, upload::Spooler *spooler, download::DownloadManager *download_manager, bool enforce_limits, const unsigned nested_kcatalog_limit, const unsigned root_kcatalog_limit, const unsigned file_mbyte_limit, perf::Statistics *statistics, bool is_balanceable, unsigned max_weight, unsigned min_weight, const std::string &dir_cache="")
void ShrinkHardlinkGroup(const std::string &remove_path)
bool CopyCatalogToLocalCache(const upload::SpoolerResult &result)
bool GetModifiedCatalogLeafsRecursively(Catalog *catalog, WritableCatalogList *result) const
const std::string & dir_temp() const
CatalogInfo SnapshotCatalogsSerialized(const bool stop_for_tweaks)
CatalogInfo SnapshotCatalogs(const bool stop_for_tweaks)
bool SetVOMSAuthz(const std::string &voms_authz)
void Clone(const std::string from, const std::string to)
void RemoveFile(const std::string &file_path)
void CatalogUploadSerializedCallback(const upload::SpoolerResult &result, const CatalogUploadContext unused)
void RemoveNestedCatalog(const std::string &mountpoint, const bool merge=true)
static const std::string kCatalogFilename
std::vector< DirectoryEntryBase > DirectoryEntryBaseList
const int kLogVerboseMsg
void AddFile(const DirectoryEntryBase &entry, const XattrList &xattrs, const std::string &parent_directory)
void SwapNestedCatalog(const string &mountpoint, const shash::Any &new_hash, const uint64_t new_size)
static void size_t size
Definition: smalloc.h:54
void GetModifiedCatalogLeafs(WritableCatalogList *result) const
Catalog * CreateCatalog(const PathString &mountpoint, const shash::Any &catalog_hash, Catalog *parent_catalog)
void FinalizeCatalog(WritableCatalog *catalog, const bool stop_for_tweaks)
void CreateNestedCatalog(const std::string &mountpoint)
void GetModifiedCatalogs(WritableCatalogList *result) const
CVMFS_EXPORT void LogCvmfs(const LogSource source, const int mask, const char *format,...)
Definition: logging.cc:528
const shash::Any & base_hash() const