CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
sync_union.cc
Go to the documentation of this file.
1 
5 #define __STDC_FORMAT_MACROS
6 
7 #include "sync_union.h"
8 
9 #include "sync_mediator.h"
10 #include "util/shared_ptr.h"
11 
12 namespace publish {
13 
15  const std::string &rdonly_path,
16  const std::string &union_path,
17  const std::string &scratch_path)
18  : rdonly_path_(rdonly_path)
19  , scratch_path_(scratch_path)
20  , union_path_(union_path)
21  , mediator_(mediator)
22  , initialized_(false) { }
23 
26  initialized_ = true;
27  return true;
28 }
29 
31  const std::string &relative_parent_path, const std::string &filename,
32  const SyncItemType entry_type) const {
34  new SyncItemNative(relative_parent_path, filename, this, entry_type));
35 
36  PreprocessSyncItem(entry);
37  if (entry_type == kItemFile) {
38  entry->SetExternalData(mediator_->IsExternalData());
39  entry->SetDirectIo(mediator_->IsDirectIo());
40  if (!(entry->IsValidGraft() && entry->HasCompressionAlgorithm())) {
41  entry->SetCompressionAlgorithm(mediator_->GetCompressionAlgorithm());
42  }
43  }
44  return entry;
45 }
46 
48  if (IsWhiteoutEntry(entry)) {
49  entry->MarkAsWhiteout(UnwindWhiteoutFilename(entry));
50  }
51 
52  if (entry->IsDirectory() && IsOpaqueDirectory(entry)) {
53  entry->MarkAsOpaqueDirectory();
54  }
55 }
56 
57 bool SyncUnion::IgnoreFilePredicate(const std::string &parent_dir,
58  const std::string &filename) {
59  return false;
60 }
61 
62 bool SyncUnion::ProcessDirectory(const string &parent_dir,
63  const string &dir_name) {
64  LogCvmfs(kLogUnionFs, kLogDebug, "SyncUnion::ProcessDirectory(%s, %s)",
65  parent_dir.c_str(), dir_name.c_str());
66  const SharedPtr<SyncItem> entry =
67  CreateSyncItem(parent_dir, dir_name, kItemDir);
68  return ProcessDirectory(entry);
69 }
70 
72  if (entry->IsNew()) {
73  mediator_->Add(entry);
74  // Recursion stops here. All content of new directory
75  // is added later by the SyncMediator
76  return false;
77  } else { // directory already existed...
78  if (entry->IsOpaqueDirectory()) { // was directory completely overwritten?
79  mediator_->Replace(entry);
80  return false; // <-- replace does not need any further recursion
81  } else { // directory was just changed internally... only touch needed
82  mediator_->Touch(entry);
83  return true;
84  }
85  }
86 }
87 
88 // We don't have the directory that we are processing in the fs, we
89 // cannot recurse inside the directory.
90 // If the directory already exists, we simply remove it and we put it back the
91 // new one (some attributes may change)
92 // If it does not exists we simply add it.
94  if (entry->IsNew()) {
96  }
97  return true;
98 }
99 
100 void SyncUnion::ProcessRegularFile(const string &parent_dir,
101  const string &filename) {
102  LogCvmfs(kLogUnionFs, kLogDebug, "SyncUnion::ProcessRegularFile(%s, %s)",
103  parent_dir.c_str(), filename.c_str());
104  const SharedPtr<SyncItem> entry =
105  CreateSyncItem(parent_dir, filename, kItemFile);
106  ProcessFile(entry);
107 }
108 
109 void SyncUnion::ProcessSymlink(const string &parent_dir,
110  const string &link_name) {
111  LogCvmfs(kLogUnionFs, kLogDebug, "SyncUnion::ProcessSymlink(%s, %s)",
112  parent_dir.c_str(), link_name.c_str());
113  const SharedPtr<SyncItem> entry =
114  CreateSyncItem(parent_dir, link_name, kItemSymlink);
115  ProcessFile(entry);
116 }
117 
119  LogCvmfs(kLogUnionFs, kLogDebug, "SyncUnion::ProcessFile(%s)",
120  entry->filename().c_str());
121  if (entry->IsWhiteout()) {
122  mediator_->Remove(entry);
123  } else {
124  if (entry->IsNew()) {
125  LogCvmfs(kLogUnionFs, kLogVerboseMsg, "processing file [%s] as new (add)",
126  entry->filename().c_str());
127  mediator_->Add(entry);
128  } else {
130  "processing file [%s] as existing (touch)",
131  entry->filename().c_str());
132  mediator_->Touch(entry);
133  }
134  }
135 }
136 
137 void SyncUnion::EnterDirectory(const string &parent_dir,
138  const string &dir_name) {
139  const SharedPtr<SyncItem> entry =
140  CreateSyncItem(parent_dir, dir_name, kItemDir);
141  mediator_->EnterDirectory(entry);
142 }
143 
144 void SyncUnion::LeaveDirectory(const string &parent_dir,
145  const string &dir_name) {
146  const SharedPtr<SyncItem> entry =
147  CreateSyncItem(parent_dir, dir_name, kItemDir);
148  mediator_->LeaveDirectory(entry);
149 }
150 
151 void SyncUnion::ProcessCharacterDevice(const std::string &parent_dir,
152  const std::string &filename) {
154  "SyncUnionOverlayfs::ProcessCharacterDevice(%s, %s)",
155  parent_dir.c_str(), filename.c_str());
156  const SharedPtr<SyncItem> entry =
157  CreateSyncItem(parent_dir, filename, kItemCharacterDevice);
158  ProcessFile(entry);
159 }
160 
161 void SyncUnion::ProcessBlockDevice(const std::string &parent_dir,
162  const std::string &filename) {
164  "SyncUnionOverlayfs::ProcessBlockDevice(%s, %s)", parent_dir.c_str(),
165  filename.c_str());
166  const SharedPtr<SyncItem> entry =
167  CreateSyncItem(parent_dir, filename, kItemBlockDevice);
168  ProcessFile(entry);
169 }
170 
171 void SyncUnion::ProcessFifo(const std::string &parent_dir,
172  const std::string &filename) {
173  LogCvmfs(kLogUnionFs, kLogDebug, "SyncUnionOverlayfs::ProcessFifo(%s, %s)",
174  parent_dir.c_str(), filename.c_str());
175  const SharedPtr<SyncItem> entry =
176  CreateSyncItem(parent_dir, filename, kItemFifo);
177  ProcessFile(entry);
178 }
179 
180 void SyncUnion::ProcessSocket(const std::string &parent_dir,
181  const std::string &filename) {
182  LogCvmfs(kLogUnionFs, kLogDebug, "SyncUnionOverlayfs::ProcessSocket(%s, %s)",
183  parent_dir.c_str(), filename.c_str());
184  const SharedPtr<SyncItem> entry =
185  CreateSyncItem(parent_dir, filename, kItemSocket);
186  ProcessFile(entry);
187 }
188 
189 } // namespace publish
virtual void LeaveDirectory(const std::string &parent_dir, const std::string &dir_name)
Definition: sync_union.cc:144
virtual bool ProcessUnmaterializedDirectory(SharedPtr< SyncItem > entry)
Definition: sync_union.cc:93
virtual void LeaveDirectory(SharedPtr< SyncItem > entry)=0
virtual void AddUnmaterializedDirectory(SharedPtr< SyncItem > entry)=0
virtual void Replace(SharedPtr< SyncItem > entry)=0
virtual zlib::Algorithms GetCompressionAlgorithm() const =0
virtual bool Initialize()
Definition: sync_union.cc:24
virtual void PreprocessSyncItem(SharedPtr< SyncItem > entry) const
Definition: sync_union.cc:47
virtual void Touch(SharedPtr< SyncItem > entry)=0
virtual bool IsOpaqueDirectory(SharedPtr< SyncItem > directory) const =0
virtual void RegisterUnionEngine(SyncUnion *engine)=0
virtual bool IsExternalData() const =0
virtual std::string UnwindWhiteoutFilename(SharedPtr< SyncItem > entry) const =0
SharedPtr< SyncItem > CreateSyncItem(const std::string &relative_parent_path, const std::string &filename, const SyncItemType entry_type) const
Definition: sync_union.cc:30
virtual void ProcessSymlink(const std::string &parent_dir, const std::string &link_name)
Definition: sync_union.cc:109
AbstractSyncMediator * mediator_
Definition: sync_union.h:147
void ProcessBlockDevice(const std::string &parent_dir, const std::string &filename)
Definition: sync_union.cc:161
virtual bool IgnoreFilePredicate(const std::string &parent_dir, const std::string &filename)
Definition: sync_union.cc:57
void ProcessSocket(const std::string &parent_dir, const std::string &filename)
Definition: sync_union.cc:180
virtual void ProcessRegularFile(const std::string &parent_dir, const std::string &filename)
Definition: sync_union.cc:100
virtual bool IsDirectIo() const =0
SyncUnion(AbstractSyncMediator *mediator, const std::string &rdonly_path, const std::string &union_path, const std::string &scratch_path)
Definition: sync_union.cc:14
virtual void Add(SharedPtr< SyncItem > entry)=0
void ProcessFile(SharedPtr< SyncItem > entry)
Definition: sync_union.cc:118
virtual bool IsWhiteoutEntry(SharedPtr< SyncItem > entry) const =0
SyncItemType
Definition: sync_item.h:29
virtual void Remove(SharedPtr< SyncItem > entry)=0
virtual bool ProcessDirectory(const std::string &parent_dir, const std::string &dir_name)
const int kLogVerboseMsg
virtual void EnterDirectory(SharedPtr< SyncItem > entry)=0
virtual void EnterDirectory(const std::string &parent_dir, const std::string &dir_name)
Definition: sync_union.cc:137
void ProcessFifo(const std::string &parent_dir, const std::string &filename)
Definition: sync_union.cc:171
void ProcessCharacterDevice(const std::string &parent_dir, const std::string &filename)
Definition: sync_union.cc:151
CVMFS_EXPORT void LogCvmfs(const LogSource source, const int mask, const char *format,...)
Definition: logging.cc:545