5 #ifndef CVMFS_RECEIVER_CATALOG_MERGE_TOOL_IMPL_H_
6 #define CVMFS_RECEIVER_CATALOG_MERGE_TOOL_IMPL_H_
24 std::string abs_path = path.
ToString();
25 if (abs_path[0] ==
'/') {
26 rel_path = abs_path.substr(1);
36 "CatalogMergeTool - Hardlink found: %s. Hardlinks are not "
37 "supported when publishing through repository gateway and "
47 "CatalogMergeTool - Removal of file %s with linkcount > 1 is "
48 "not supported. Aborting",
55 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
57 const Params ¶ms, std::string *new_manifest_path,
58 shash::Any *new_manifest_hash, uint64_t *final_rev) {
69 "dummy_token",
"dummy_key");
70 spooler = upload::Spooler::Construct(definition, &stats_tmpl);
71 const std::string
temp_dir = raii_temp_dir->dir();
72 output_catalog_mgr_ =
new RwCatalogMgr(
78 output_catalog_mgr_->Init();
83 ret &= CreateNewManifest(new_manifest_path);
87 output_catalog_mgr_.Destroy();
92 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
103 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
113 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
119 const std::string parent_path = std::strchr(rel_path.
c_str(),
'/')
130 uint64_t nested_size;
131 const bool found = new_catalog_mgr->LookupNested(
132 path, &mountpoint, &nested_hash, &nested_size);
133 if (!found || !nested_size) {
135 "CatalogMergeTool - nested catalog %s not found. Aborting",
138 output_catalog_mgr_->GraftNestedCatalog(rel_path.
ToString(), nested_hash,
142 output_catalog_mgr_->AddDirectory(entry, xattrs, parent_path);
144 perf::Inc(counters_->n_directories_added);
153 output_catalog_mgr_->AddChunkedFile(*base_entry, xattrs, parent_path,
156 output_catalog_mgr_->AddFile(*base_entry, xattrs, parent_path);
163 perf::Xadd(counters_->sz_added_bytes, static_cast<int64_t>(entry.
size()));
168 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
175 output_catalog_mgr_->RemoveNestedCatalog(std::string(rel_path.
c_str()),
179 output_catalog_mgr_->RemoveDirectory(rel_path.
c_str());
180 perf::Inc(counters_->n_directories_removed);
183 output_catalog_mgr_->RemoveFile(rel_path.
c_str());
186 perf::Inc(counters_->n_symlinks_removed);
191 perf::Xadd(counters_->sz_removed_bytes, static_cast<int64_t>(entry.
size()));
195 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
202 const std::string parent_path = std::strchr(rel_path.
c_str(),
'/')
214 const bool found = new_catalog_mgr->LookupNested(path, &mountpoint,
215 &new_hash, &new_size);
216 if (!found || !new_size) {
218 "CatalogMergeTool - nested catalog %s not found. Aborting",
221 output_catalog_mgr_->SwapNestedCatalog(rel_path.
ToString(), new_hash,
228 output_catalog_mgr_->TouchDirectory(*base_entry, xattrs, rel_path.
c_str());
231 output_catalog_mgr_->CreateNestedCatalog(std::string(rel_path.
c_str()));
234 output_catalog_mgr_->RemoveNestedCatalog(std::string(rel_path.
c_str()));
236 perf::Inc(counters_->n_directories_changed);
240 output_catalog_mgr_->RemoveFile(rel_path.
c_str());
241 output_catalog_mgr_->AddDirectory(entry2, xattrs, parent_path);
243 output_catalog_mgr_->CreateNestedCatalog(std::string(rel_path.
c_str()));
246 perf::Inc(counters_->n_symlinks_removed);
251 static_cast<int64_t>(entry1.
size()));
252 perf::Inc(counters_->n_directories_added);
259 output_catalog_mgr_->RemoveNestedCatalog(std::string(rel_path.
c_str()),
269 output_catalog_mgr_->RemoveDirectory(rel_path.
c_str());
273 output_catalog_mgr_->AddChunkedFile(*base_entry, xattrs, parent_path,
276 output_catalog_mgr_->AddFile(*base_entry, xattrs, parent_path);
279 perf::Inc(counters_->n_directories_removed);
285 perf::Xadd(counters_->sz_added_bytes, static_cast<int64_t>(entry2.
size()));
296 output_catalog_mgr_->RemoveFile(rel_path.
c_str());
299 output_catalog_mgr_->AddChunkedFile(*base_entry, xattrs, parent_path,
302 output_catalog_mgr_->AddFile(*base_entry, xattrs, parent_path);
311 perf::Inc(counters_->n_symlinks_removed);
314 perf::Inc(counters_->n_symlinks_changed);
317 static_cast<int64_t>(entry1.
size()));
318 perf::Xadd(counters_->sz_added_bytes, static_cast<int64_t>(entry2.
size()));
323 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
325 std::string *new_manifest_path) {
326 if (!output_catalog_mgr_->Commit(
false, 0,
manifest_)) {
328 "CatalogMergeTool - Could not commit output catalog");
332 const std::string new_path =
CreateTempPath(temp_dir_prefix_, 0600);
336 "CatalogMergeTool - Could not export new manifest");
339 *new_manifest_path = new_path;
346 #endif // CVMFS_RECEIVER_CATALOG_MERGE_TOOL_IMPL_H_
uint32_t linkcount() const
bool IsSubPath(const PathString &parent, const PathString &path)
bool Export(const std::string &path) const
int64_t Xadd(class Counter *counter, const int64_t delta)
SharedPtr< string > temp_dir
std::string spooler_configuration
bool IsChunkedFile() const
void set_linkcount(const uint32_t linkcount)
zlib::Algorithms compression_alg
size_t nested_kcatalog_limit
perf::Statistics * statistics_
std::string CreateTempPath(const std::string &path_prefix, const int mode)
assert((mem||(size==0))&&"Out Of Memory")
upload::Spooler * spooler
bool IsNestedCatalogMountpoint() const
uint64_t revision() const
static RaiiTempDir * Create(const std::string &prefix)
shash::Any catalog_hash() const
void Inc(class Counter *counter)
manifest::Manifest * manifest_
std::string ToString() const
ShortString< kDefaultMaxPath, 0 > PathString
PathString GetParentPath(const PathString &path)
size_t root_kcatalog_limit
bool generate_legacy_bulk_chunks
const char * c_str() const
shash::Algorithms hash_alg
CVMFS_EXPORT void LogCvmfs(const LogSource source, const int mask, const char *format,...)