CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
sync_item.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_SYNC_ITEM_H_
6 #define CVMFS_SYNC_ITEM_H_
7 
8 #include <sys/types.h>
9 
10 #if !defined(__APPLE__)
11 #include <sys/sysmacros.h>
12 #endif // __APPLE__
13 
14 #include <cstring>
15 #include <map>
16 #include <string>
17 
18 #include "crypto/hash.h"
19 #include "directory_entry.h"
20 #include "duplex_libarchive.h"
21 #include "file_chunk.h"
22 #include "util/platform.h"
23 #include "util/shared_ptr.h"
24 
25 class IngestionSource;
26 
27 namespace publish {
28 
40 };
41 
42 class SyncUnion;
56 class SyncItem {
57  // only SyncUnion can create SyncItems (see SyncUnion::CreateSyncItem).
58  // SyncUnionTarball can create SyncItemTar and SyncItemDummyDir.
59 
60  public:
61  SyncItem();
62  virtual ~SyncItem();
63 
64  inline bool IsDirectory() const { return IsType(kItemDir); }
65  inline bool WasDirectory() const { return WasType(kItemDir); }
66  inline bool IsRegularFile() const { return IsType(kItemFile); }
67  inline bool WasRegularFile() const { return WasType(kItemFile); }
68  inline bool IsSymlink() const { return IsType(kItemSymlink); }
69  inline bool WasSymlink() const { return WasType(kItemSymlink); }
70  inline bool IsNew() const { return WasType(kItemNew); }
71  inline bool IsTouched() const {
72  return (GetRdOnlyFiletype() == GetUnionFiletype())
75  }
76  inline bool IsCharacterDevice() const { return IsType(kItemCharacterDevice); }
77  inline bool IsBlockDevice() const { return IsType(kItemBlockDevice); }
78  inline bool IsFifo() const { return IsType(kItemFifo); }
79  inline bool IsSocket() const { return IsType(kItemSocket); }
80  inline bool IsGraftMarker() const { return IsType(kItemMarker); }
81  inline bool IsExternalData() const { return external_data_; }
82  inline bool IsDirectIo() const { return direct_io_; }
83 
84  inline bool IsWhiteout() const { return whiteout_; }
85  inline bool IsCatalogMarker() const { return filename_ == ".cvmfscatalog"; }
86  inline bool IsOpaqueDirectory() const { return IsDirectory() && opaque_; }
87 
88  inline bool IsSpecialFile() const {
89  return IsCharacterDevice() || IsBlockDevice() || IsFifo() || IsSocket();
90  }
91  inline bool WasSpecialFile() const {
94  }
95  inline bool IsBundleSpec() const { return filename_ == ".cvmfsbundles"; }
96  inline bool WasBundleSpec() const { return filename_ == ".cvmfsbundles"; }
97 
98  inline unsigned int GetRdevMajor() const {
100  StatUnion(true);
101  return major(union_stat_.stat.st_rdev);
102  }
103 
104  inline unsigned int GetRdevMinor() const {
106  StatUnion(true);
107  return minor(union_stat_.stat.st_rdev);
108  }
109 
110  bool HasCatalogMarker() const { return has_catalog_marker_; }
111  bool HasGraftMarker() const { return graft_marker_present_; }
113  bool IsValidGraft() const { return valid_graft_; }
114  bool IsChunkedGraft() const { return graft_chunklist_; }
115 
116  inline const FileChunkList *GetGraftChunks() const {
117  return graft_chunklist_;
118  }
119  inline shash::Any GetContentHash() const { return content_hash_; }
120  inline void SetContentHash(const shash::Any &hash) { content_hash_ = hash; }
121  inline bool HasContentHash() const { return !content_hash_.IsNull(); }
122  void SetExternalData(bool val) { external_data_ = val; }
123  void SetDirectIo(bool val) { direct_io_ = val; }
124 
126  return compression_algorithm_;
127  }
128  inline void SetCompressionAlgorithm(const zlib::Algorithms &alg) {
131  }
132 
145  bool enable_mtime_ns) const = 0;
146 
147  inline std::string GetRelativePath() const {
148  return (relative_parent_path_.empty())
149  ? filename_
151  + (filename_.empty() ? "" : ("/" + filename_));
152  }
153 
154  std::string GetRdOnlyPath() const;
155  std::string GetUnionPath() const;
156  std::string GetScratchPath() const;
157 
158  void MarkAsWhiteout(const std::string &actual_filename);
159  void MarkAsOpaqueDirectory();
160 
167  inline void MaskHardlink() { masked_hardlink_ = true; }
168  inline bool HasHardlinks() const {
169  return !masked_hardlink_ && GetUnionLinkcount() > 1;
170  }
171 
172  unsigned int GetRdOnlyLinkcount() const;
173  uint64_t GetRdOnlyInode() const;
174  unsigned int GetUnionLinkcount() const;
175  uint64_t GetUnionInode() const;
176  uint64_t GetScratchSize() const;
177  uint64_t GetRdOnlySize() const;
178 
179  inline std::string filename() const { return filename_; }
180  inline std::string relative_parent_path() const {
181  return relative_parent_path_;
182  }
183 
184  virtual IngestionSource *CreateIngestionSource() const = 0;
185  virtual void MakePlaceholderDirectory() const = 0;
187 
188  bool operator==(const SyncItem &other) const {
190  && (filename_ == other.filename_));
191  }
192 
193  protected:
204  SyncItem(const std::string &relative_parent_path,
205  const std::string &filename,
206  const SyncUnion *union_engine,
207  const SyncItemType entry_type);
208 
209  inline platform_stat64 GetUnionStat() const {
210  StatUnion();
211  return union_stat_.stat;
212  }
213 
216 
217  virtual SyncItemType GetScratchFiletype() const = 0;
218 
226  virtual bool IsType(const SyncItemType expected_type) const = 0;
227 
235  inline bool WasType(const SyncItemType expected_type) const {
236  if (rdonly_type_ == kItemUnknown) {
238  }
239  return rdonly_type_ == expected_type;
240  }
241 
245  struct EntryStat {
246  EntryStat() : obtained(false), error_code(0) {
247  memset(&stat, 0, sizeof(stat));
248  }
249 
250  inline SyncItemType GetSyncItemType() const {
251  assert(obtained);
252  if (S_ISREG(stat.st_mode))
253  return kItemFile;
254  if (S_ISLNK(stat.st_mode))
255  return kItemSymlink;
256  if (S_ISDIR(stat.st_mode))
257  return kItemDir;
258  if (S_ISFIFO(stat.st_mode))
259  return kItemFifo;
260  if (S_ISSOCK(stat.st_mode))
261  return kItemSocket;
262  if (S_ISCHR(stat.st_mode))
263  return kItemCharacterDevice;
264  if (S_ISBLK(stat.st_mode))
265  return kItemBlockDevice;
266  return kItemUnknown;
267  }
268 
269  bool obtained;
272  };
273 
274  static void StatGeneric(const std::string &path,
275  EntryStat *info,
276  const bool refresh);
277  SyncItemType GetGenericFiletype(const EntryStat &stat) const;
278  void CheckMarkerFiles();
279 
282 
283  ssize_t graft_size_;
284 
285  // The hash of regular file's content
287 
289 
290  private:
291  void CheckCatalogMarker();
292 
293  std::string filename_;
294 
295  std::string GetGraftMarkerPath() const;
296  void CheckGraft();
297 
302 
303  bool whiteout_;
304  bool opaque_;
313 
318 
319  // The compression algorithm for the file
321  // The compression algorithm has been set explicitly
323 
324  // Lazy evaluation and caching of results of file stats
325  inline void StatRdOnly(const bool refresh = false) const {
326  StatGeneric(GetRdOnlyPath(), &rdonly_stat_, refresh);
327  }
328  inline void StatUnion(const bool refresh = false) const {
329  StatGeneric(GetUnionPath(), &union_stat_, refresh);
330  }
331  virtual void StatScratch(const bool refresh) const = 0;
332 };
333 
334 typedef std::map<std::string, SharedPtr<SyncItem> > SyncItemList;
335 
336 class SyncItemNative : public SyncItem {
337  friend class SyncUnion;
339  bool enable_mtime_ns) const;
340  virtual IngestionSource *CreateIngestionSource() const;
341  virtual void MakePlaceholderDirectory() const { assert(false); }
342  virtual SyncItemType GetScratchFiletype() const;
343  virtual bool IsType(const SyncItemType expected_type) const;
344  virtual void StatScratch(const bool refresh) const {
346  }
347 
348  protected:
350  const std::string &filename, const SyncUnion *union_engine,
351  const SyncItemType entry_type)
352  : SyncItem(relative_parent_path, filename, union_engine, entry_type) {
354  }
355 };
356 
357 } // namespace publish
358 
359 #endif // CVMFS_SYNC_ITEM_H_
EntryStat union_stat_
Definition: sync_item.h:301
bool WasType(const SyncItemType expected_type) const
Definition: sync_item.h:235
SyncItemType GetGenericFiletype(const EntryStat &stat) const
Definition: sync_item.cc:69
bool operator==(const SyncItem &other) const
Definition: sync_item.h:188
bool IsNull() const
Definition: hash.h:371
unsigned int GetRdevMinor() const
Definition: sync_item.h:104
struct stat64 platform_stat64
shash::Any GetContentHash() const
Definition: sync_item.h:119
SyncItemType rdonly_type_
Definition: sync_item.h:280
ssize_t graft_size_
Definition: sync_item.h:283
bool HasCatalogMarker() const
Definition: sync_item.h:110
unsigned int GetRdevMajor() const
Definition: sync_item.h:98
virtual catalog::DirectoryEntryBase CreateBasicCatalogDirent(bool enable_mtime_ns) const
Definition: sync_item.cc:203
const SyncUnion * union_engine_
Definition: sync_item.h:298
std::string relative_parent_path_
Definition: sync_item.h:312
bool IsSocket() const
Definition: sync_item.h:79
SyncItemNative(const std::string &relative_parent_path, const std::string &filename, const SyncUnion *union_engine, const SyncItemType entry_type)
Definition: sync_item.h:349
bool IsBlockDevice() const
Definition: sync_item.h:77
bool IsDirectory() const
Definition: sync_item.h:64
bool IsCharacterDevice() const
Definition: sync_item.h:76
EntryStat()
Definition: sync_item.h:246
assert((mem||(size==0))&&"Out Of Memory")
void SetExternalData(bool val)
Definition: sync_item.h:122
void SetDirectIo(bool val)
Definition: sync_item.h:123
bool IsTouched() const
Definition: sync_item.h:71
bool IsGraftMarker() const
Definition: sync_item.h:80
void MaskHardlink()
Definition: sync_item.h:167
SyncItemType GetUnionFiletype() const
Definition: sync_item.cc:106
bool IsWhiteout() const
Definition: sync_item.h:84
bool IsValidGraft() const
Definition: sync_item.h:113
bool IsOpaqueDirectory() const
Definition: sync_item.h:86
uint64_t GetUnionInode() const
Definition: sync_item.cc:173
std::map< std::string, SharedPtr< SyncItem > > SyncItemList
Definition: sync_item.h:334
void CheckCatalogMarker()
Definition: sync_item.cc:282
SyncItemType scratch_type_
Definition: sync_item.h:288
void CheckMarkerFiles()
Definition: sync_item.cc:274
uint64_t GetRdOnlyInode() const
Definition: sync_item.cc:161
bool IsFifo() const
Definition: sync_item.h:78
virtual bool IsType(const SyncItemType expected_type) const
Definition: sync_item.cc:113
platform_stat64 stat
Definition: sync_item.h:271
virtual catalog::DirectoryEntryBase CreateBasicCatalogDirent(bool enable_mtime_ns) const =0
Algorithms
Definition: compression.h:44
bool WasBundleSpec() const
Definition: sync_item.h:96
bool HasGraftMarker() const
Definition: sync_item.h:111
EntryStat rdonly_stat_
Definition: sync_item.h:300
bool HasContentHash() const
Definition: sync_item.h:121
virtual void MakePlaceholderDirectory() const =0
bool IsNew() const
Definition: sync_item.h:70
uint64_t GetScratchSize() const
Definition: sync_item.cc:178
bool IsRegularFile() const
Definition: sync_item.h:66
virtual bool IsType(const SyncItemType expected_type) const =0
platform_stat64 GetUnionStat() const
Definition: sync_item.h:209
std::string GetUnionPath() const
Definition: sync_item.cc:259
bool WasSymlink() const
Definition: sync_item.h:69
std::string GetRdOnlyPath() const
Definition: sync_item.cc:252
void StatRdOnly(const bool refresh=false) const
Definition: sync_item.h:325
zlib::Algorithms GetCompressionAlgorithm() const
Definition: sync_item.h:125
bool HasCompressionAlgorithm() const
Definition: sync_item.h:112
std::string GetScratchPath() const
Definition: sync_item.cc:266
std::string relative_parent_path() const
Definition: sync_item.h:180
void SetCompressionAlgorithm(const zlib::Algorithms &alg)
Definition: sync_item.h:128
virtual SyncItemType GetScratchFiletype() const =0
const FileChunkList * GetGraftChunks() const
Definition: sync_item.h:116
FileChunkList * graft_chunklist_
Definition: sync_item.h:317
bool WasSpecialFile() const
Definition: sync_item.h:91
EntryStat scratch_stat_
Definition: sync_item.h:281
virtual ~SyncItem()
Definition: sync_item.cc:66
unsigned int GetRdOnlyLinkcount() const
Definition: sync_item.cc:155
Definition: sync_item.h:245
shash::Any content_hash_
Definition: sync_item.h:286
void SetCatalogMarker()
Definition: sync_item.h:186
std::string filename_
Definition: sync_item.h:293
virtual SyncItemType GetScratchFiletype() const
Definition: sync_item.cc:96
bool IsDirectIo() const
Definition: sync_item.h:82
void MarkAsOpaqueDirectory()
Definition: sync_item.cc:149
bool IsBundleSpec() const
Definition: sync_item.h:95
bool has_compression_algorithm_
Definition: sync_item.h:322
SyncItemType
Definition: sync_item.h:29
virtual void StatScratch(const bool refresh) const =0
void SetContentHash(const shash::Any &hash)
Definition: sync_item.h:120
static void StatGeneric(const std::string &path, EntryStat *info, const bool refresh)
Definition: sync_item.cc:192
virtual void MakePlaceholderDirectory() const
Definition: sync_item.h:341
std::string GetGraftMarkerPath() const
Definition: sync_item.cc:298
virtual void StatScratch(const bool refresh) const
Definition: sync_item.h:344
bool has_catalog_marker_
Definition: sync_item.h:306
virtual IngestionSource * CreateIngestionSource() const =0
virtual IngestionSource * CreateIngestionSource() const
Definition: sync_item.cc:188
void MarkAsWhiteout(const std::string &actual_filename)
Definition: sync_item.cc:122
unsigned int GetUnionLinkcount() const
Definition: sync_item.cc:167
bool graft_marker_present_
Definition: sync_item.h:308
bool IsSymlink() const
Definition: sync_item.h:68
std::string filename() const
Definition: sync_item.h:179
bool IsExternalData() const
Definition: sync_item.h:81
bool WasRegularFile() const
Definition: sync_item.h:67
bool obtained
Definition: sync_item.h:269
bool IsCatalogMarker() const
Definition: sync_item.h:85
SyncItemType GetSyncItemType() const
Definition: sync_item.h:250
void StatUnion(const bool refresh=false) const
Definition: sync_item.h:328
bool IsSpecialFile() const
Definition: sync_item.h:88
bool IsChunkedGraft() const
Definition: sync_item.h:114
bool WasDirectory() const
Definition: sync_item.h:65
std::string GetRelativePath() const
Definition: sync_item.h:147
int error_code
Definition: sync_item.h:270
zlib::Algorithms compression_algorithm_
Definition: sync_item.h:320
uint64_t GetRdOnlySize() const
Definition: sync_item.cc:183
bool HasHardlinks() const
Definition: sync_item.h:168
SyncItemType GetRdOnlyFiletype() const
Definition: sync_item.cc:81