CernVM-FS  2.12.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
sync_mediator.h
Go to the documentation of this file.
1 
24 #ifndef CVMFS_SYNC_MEDIATOR_H_
25 #define CVMFS_SYNC_MEDIATOR_H_
26 
27 #include <pthread.h>
28 
29 #include <map>
30 #include <set>
31 #include <stack>
32 #include <string>
33 #include <vector>
34 
35 #include "catalog_mgr_rw.h"
36 #include "compression.h"
37 #include "file_chunk.h"
38 #include "publish/repository.h"
39 #include "statistics.h"
40 #include "swissknife_sync.h"
41 #include "sync_item.h"
42 #include "util/platform.h"
43 #include "util/pointer.h"
44 #include "util/shared_ptr.h"
45 #include "xattr.h"
46 
47 namespace manifest {
48 class Manifest;
49 }
50 
51 namespace publish {
52 
53 class SyncDiffReporter : public DiffListener {
54  public:
55  enum PrintAction {
58  };
59 
60  explicit SyncDiffReporter(PrintAction print_action = kPrintChanges,
61  unsigned int processing_dot_interval = 100)
62  : print_action_(print_action),
63  processing_dot_interval_(processing_dot_interval),
64  changed_items_(0) {}
65 
66  virtual void OnInit(const history::History::Tag &from_tag,
67  const history::History::Tag &to_tag);
68  virtual void OnStats(const catalog::DeltaCounters &delta);
69 
70  virtual void OnAdd(const std::string &path,
71  const catalog::DirectoryEntry &entry);
72  virtual void OnRemove(const std::string &path,
73  const catalog::DirectoryEntry &entry);
74  virtual void OnModify(const std::string &path,
75  const catalog::DirectoryEntry &entry_from,
76  const catalog::DirectoryEntry &entry_to);
77  void CommitReport();
78 
79  private:
80  void PrintDots();
81  void AddImpl(const std::string &path);
82  void RemoveImpl(const std::string &path);
83  void ModifyImpl(const std::string &path);
84 
87  unsigned int changed_items_;
88 };
89 
96 struct HardlinkGroup {
97  explicit HardlinkGroup(const SharedPtr<SyncItem> &item) : master(item) {
98  hardlinks[master->GetRelativePath()] = item;
99  }
100 
101  void AddHardlink(const SharedPtr<SyncItem> &entry) {
102  hardlinks[entry->GetRelativePath()] = entry;
103  }
104 
108 };
109 
111  public:
112  virtual ~AbstractSyncMediator() = 0;
113 
114  virtual void RegisterUnionEngine(SyncUnion *engine) = 0;
115 
116  virtual void Add(SharedPtr<SyncItem> entry) = 0;
117  virtual void Touch(SharedPtr<SyncItem> entry) = 0;
118  virtual void Remove(SharedPtr<SyncItem> entry) = 0;
119  virtual void Replace(SharedPtr<SyncItem> entry) = 0;
120  virtual void Clone(const std::string from, const std::string to) = 0;
121 
122  virtual void AddUnmaterializedDirectory(SharedPtr<SyncItem> entry) = 0;
123 
124  virtual void EnterDirectory(SharedPtr<SyncItem> entry) = 0;
125  virtual void LeaveDirectory(SharedPtr<SyncItem> entry) = 0;
126 
127  virtual bool Commit(manifest::Manifest *manifest) = 0;
128 
129  virtual bool IsExternalData() const = 0;
130  virtual bool IsDirectIo() const = 0;
131  virtual zlib::Algorithms GetCompressionAlgorithm() const = 0;
132 };
133 
137 typedef std::map<uint64_t, HardlinkGroup> HardlinkGroupMap;
138 
148 class SyncMediator : public virtual AbstractSyncMediator {
149  public:
150  static const unsigned int processing_dot_interval = 100;
151 
153  const SyncParameters *params,
154  perf::StatisticsTemplate statistics);
155  void RegisterUnionEngine(SyncUnion *engine);
156  // Final class, it is not meant to be derived any further
157  ~SyncMediator();
158 
159  void Add(SharedPtr<SyncItem> entry);
160  void Touch(SharedPtr<SyncItem> entry);
161  void Remove(SharedPtr<SyncItem> entry);
162  void Replace(SharedPtr<SyncItem> entry);
163  void Clone(const std::string from, const std::string to);
164 
166 
169 
171 
172  // The sync union engine uses this information to create properly initialized
173  // sync items
174  bool IsExternalData() const { return params_->external_data; }
175  bool IsDirectIo() const { return params_->direct_io; }
177  return params_->compression_alg;
178  }
179 
180  private:
181  typedef std::stack<HardlinkGroupMap> HardlinkGroupMapStack;
182  typedef std::vector<HardlinkGroup> HardlinkGroupList;
183 
185 
186  // Called after figuring out the type of a path (file, symlink, dir)
187  void AddFile(SharedPtr<SyncItem> entry);
188  void RemoveFile(SharedPtr<SyncItem> entry);
189 
190  void AddDirectory(SharedPtr<SyncItem> entry);
193 
196 
198  void TouchingFileCallback(const std::string &parent_dir,
199  const std::string &file_name);
200  void TouchingSymlinkCallback(const std::string &parent_dir,
201  const std::string &link_name);
202  void TouchDirectoryCallback(const std::string &parent_dir,
203  const std::string &dir_name);
205  void RemoveFileCallback(const std::string &parent_dir,
206  const std::string &file_name);
207  void RemoveSymlinkCallback(const std::string &parent_dir,
208  const std::string &link_name);
209  void RemoveCharacterDeviceCallback(const std::string &parent_dir,
210  const std::string &link_name);
211  void RemoveBlockDeviceCallback(const std::string &parent_dir,
212  const std::string &link_name);
213  void RemoveFifoCallback(const std::string &parent_dir,
214  const std::string &link_name);
215  void RemoveSocketCallback(const std::string &parent_dir,
216  const std::string &link_name);
217  void RemoveDirectoryCallback(const std::string &parent_dir,
218  const std::string &dir_name);
219  bool IgnoreFileCallback(const std::string &parent_dir,
220  const std::string &file_name);
221  // Called by file system traversal
222  void EnterAddedDirectoryCallback(const std::string &parent_dir,
223  const std::string &dir_name);
224  void LeaveAddedDirectoryCallback(const std::string &parent_dir,
225  const std::string &dir_name);
227  bool AddDirectoryCallback(const std::string &parent_dir,
228  const std::string &dir_name);
229  void AddFileCallback(const std::string &parent_dir,
230  const std::string &file_name);
231  void AddCharacterDeviceCallback(const std::string &parent_dir,
232  const std::string &file_name);
233  void AddBlockDeviceCallback(const std::string &parent_dir,
234  const std::string &file_name);
235  void AddFifoCallback(const std::string &parent_dir,
236  const std::string &file_name);
237  void AddSocketCallback(const std::string &parent_dir,
238  const std::string &file_name);
239  void AddSymlinkCallback(const std::string &parent_dir,
240  const std::string &link_name);
241  SharedPtr<SyncItem> CreateSyncItem(const std::string &relative_parent_path,
242  const std::string &filename,
243  const SyncItemType entry_type) const;
244 
245  // Called by Upload Spooler
246  void PublishFilesCallback(const upload::SpoolerResult &result);
248 
249  // Hardlink handling
252  void LegacyRegularHardlinkCallback(const std::string &parent_dir,
253  const std::string &file_name);
254  void LegacySymlinkHardlinkCallback(const std::string &parent_dir,
255  const std::string &file_name);
256  void LegacyCharacterDeviceHardlinkCallback(const std::string &parent_dir,
257  const std::string &file_name);
258  void LegacyBlockDeviceHardlinkCallback(const std::string &parent_dir,
259  const std::string &file_name);
260  void LegacyFifoHardlinkCallback(const std::string &parent_dir,
261  const std::string &file_name);
262  void LegacySocketHardlinkCallback(const std::string &parent_dir,
263  const std::string &file_name);
267 
268  void AddLocalHardlinkGroups(const HardlinkGroupMap &hardlinks);
269  void AddHardlinkGroup(const HardlinkGroup &group);
270 
273 
275 
284 
289  pthread_mutex_t lock_file_queue_;
291 
293 
295  mutable unsigned int changed_items_;
296 
302 
304 }; // class SyncMediator
305 
306 } // namespace publish
307 
308 #endif // CVMFS_SYNC_MEDIATOR_H_
bool Commit(manifest::Manifest *manifest)
void RemoveSocketCallback(const std::string &parent_dir, const std::string &link_name)
void ModifyImpl(const std::string &path)
const manifest::Manifest * manifest() const
Definition: repository.h:125
virtual void LeaveDirectory(SharedPtr< SyncItem > entry)=0
void AddDirectoryRecursively(SharedPtr< SyncItem > entry)
virtual void AddUnmaterializedDirectory(SharedPtr< SyncItem > entry)=0
void TouchingFileCallback(const std::string &parent_dir, const std::string &file_name)
virtual void Replace(SharedPtr< SyncItem > entry)=0
HardlinkGroupMapStack hardlink_stack_
void AddBlockDeviceCallback(const std::string &parent_dir, const std::string &file_name)
void RemoveFile(SharedPtr< SyncItem > entry)
void CompleteHardlinks(SharedPtr< SyncItem > entry)
virtual zlib::Algorithms GetCompressionAlgorithm() const =0
void RemoveNestedCatalog(SharedPtr< SyncItem > directory)
void TouchingSymlinkCallback(const std::string &parent_dir, const std::string &link_name)
bool IsDirectIo() const
void CreateNestedCatalog(SharedPtr< SyncItem > directory)
UniquePtr< SyncDiffReporter > reporter_
virtual void OnInit(const history::History::Tag &from_tag, const history::History::Tag &to_tag)
virtual void OnModify(const std::string &path, const catalog::DirectoryEntry &entry_from, const catalog::DirectoryEntry &entry_to)
void RemoveDirectoryRecursively(SharedPtr< SyncItem > entry)
HardlinkGroupMap & GetHardlinkMap()
void LegacyCharacterDeviceHardlinkCallback(const std::string &parent_dir, const std::string &file_name)
virtual void Touch(SharedPtr< SyncItem > entry)=0
void Replace(SharedPtr< SyncItem > entry)
unsigned int changed_items_
void PublishHardlinksCallback(const upload::SpoolerResult &result)
void EnterDirectory(SharedPtr< SyncItem > entry)
zlib::Algorithms compression_alg
virtual void RegisterUnionEngine(SyncUnion *engine)=0
SharedPtr< SyncItem > CreateSyncItem(const std::string &relative_parent_path, const std::string &filename, const SyncItemType entry_type) const
UniquePtr< perf::FsCounters > counters_
void LegacySymlinkHardlinkCallback(const std::string &parent_dir, const std::string &file_name)
void AddDirectory(SharedPtr< SyncItem > entry)
void RemoveImpl(const std::string &path)
HardlinkGroupList hardlink_queue_
void RemoveCharacterDeviceCallback(const std::string &parent_dir, const std::string &link_name)
void AddFileCallback(const std::string &parent_dir, const std::string &file_name)
virtual bool IsExternalData() const =0
void LegacySocketHardlinkCallback(const std::string &parent_dir, const std::string &file_name)
std::map< std::string, SharedPtr< SyncItem > > SyncItemList
Definition: sync_item.h:322
void RemoveFileCallback(const std::string &parent_dir, const std::string &file_name)
void TouchDirectoryCallback(const std::string &parent_dir, const std::string &dir_name)
void PublishFilesCallback(const upload::SpoolerResult &result)
void Clone(const std::string from, const std::string to)
void AddFile(SharedPtr< SyncItem > entry)
void InsertLegacyHardlink(SharedPtr< SyncItem > entry)
Algorithms
Definition: compression.h:44
void AddUnmaterializedDirectory(SharedPtr< SyncItem > entry)
unsigned int processing_dot_interval_
Definition: sync_mediator.h:86
SyncUnion * union_engine_
SyncItemList file_queue_
const SyncParameters * params_
void RemoveFifoCallback(const std::string &parent_dir, const std::string &link_name)
virtual bool IsDirectIo() const =0
virtual void OnStats(const catalog::DeltaCounters &delta)
SyncMediator(catalog::WritableCatalogManager *catalog_manager, const SyncParameters *params, perf::StatisticsTemplate statistics)
void AddImpl(const std::string &path)
void AddSocketCallback(const std::string &parent_dir, const std::string &file_name)
static const unsigned int processing_dot_interval
void Touch(SharedPtr< SyncItem > entry)
void AddFifoCallback(const std::string &parent_dir, const std::string &file_name)
void AddSymlinkCallback(const std::string &parent_dir, const std::string &link_name)
void EnterAddedDirectoryCallback(const std::string &parent_dir, const std::string &dir_name)
SyncDiffReporter(PrintAction print_action=kPrintChanges, unsigned int processing_dot_interval=100)
Definition: sync_mediator.h:60
uint64_t GetTemporaryHardlinkGroupNumber(SharedPtr< SyncItem > entry) const
void Add(SharedPtr< SyncItem > entry)
bool AddDirectoryCallback(const std::string &parent_dir, const std::string &dir_name)
bool IgnoreFileCallback(const std::string &parent_dir, const std::string &file_name)
virtual void Add(SharedPtr< SyncItem > entry)=0
void LegacyFifoHardlinkCallback(const std::string &parent_dir, const std::string &file_name)
void AddCharacterDeviceCallback(const std::string &parent_dir, const std::string &file_name)
void AddLocalHardlinkGroups(const HardlinkGroupMap &hardlinks)
pthread_mutex_t lock_file_queue_
void InsertHardlink(SharedPtr< SyncItem > entry)
catalog::WritableCatalogManager * catalog_manager_
void LeaveDirectory(SharedPtr< SyncItem > entry)
virtual void OnRemove(const std::string &path, const catalog::DirectoryEntry &entry)
std::vector< HardlinkGroup > HardlinkGroupList
SyncItemType
Definition: sync_item.h:29
virtual void Clone(const std::string from, const std::string to)=0
virtual void Remove(SharedPtr< SyncItem > entry)=0
virtual bool Commit(manifest::Manifest *manifest)=0
void RemoveSymlinkCallback(const std::string &parent_dir, const std::string &link_name)
void RemoveBlockDeviceCallback(const std::string &parent_dir, const std::string &link_name)
bool IsExternalData() const
std::stack< HardlinkGroupMap > HardlinkGroupMapStack
zlib::Algorithms GetCompressionAlgorithm() const
virtual void EnterDirectory(SharedPtr< SyncItem > entry)=0
void LegacyBlockDeviceHardlinkCallback(const std::string &parent_dir, const std::string &file_name)
void RemoveDirectoryCallback(const std::string &parent_dir, const std::string &dir_name)
void TouchDirectory(SharedPtr< SyncItem > entry)
void EnsureAllowed(SharedPtr< SyncItem > entry)
void LegacyRegularHardlinkCallback(const std::string &parent_dir, const std::string &file_name)
void RegisterUnionEngine(SyncUnion *engine)
void AddHardlinkGroup(const HardlinkGroup &group)
void TouchDirectoryRecursively(SharedPtr< SyncItem > entry)
void RemoveDirectory(SharedPtr< SyncItem > entry)
std::map< uint64_t, HardlinkGroup > HardlinkGroupMap
virtual void OnAdd(const std::string &path, const catalog::DirectoryEntry &entry)
void Remove(SharedPtr< SyncItem > entry)
void LeaveAddedDirectoryCallback(const std::string &parent_dir, const std::string &dir_name)