5 #ifndef CVMFS_RECEIVER_CATALOG_MERGE_TOOL_IMPL_H_
6 #define CVMFS_RECEIVER_CATALOG_MERGE_TOOL_IMPL_H_
23 std::string abs_path = path.
ToString();
24 if (abs_path[0] ==
'/') {
25 rel_path = abs_path.substr(1);
35 "CatalogMergeTool - Hardlink found: %s. Hardlinks are not "
36 "supported when publishing through repository gateway and "
46 "CatalogMergeTool - Removal of file %s with linkcount > 1 is "
47 "not supported. Aborting",
54 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
56 const Params ¶ms, std::string *new_manifest_path,
57 shash::Any *new_manifest_hash, uint64_t *final_rev) {
68 "dummy_token",
"dummy_key");
69 spooler = upload::Spooler::Construct(definition, &stats_tmpl);
70 const std::string
temp_dir = raii_temp_dir->dir();
71 output_catalog_mgr_ =
new RwCatalogMgr(
77 output_catalog_mgr_->Init();
82 ret &= CreateNewManifest(new_manifest_path);
86 output_catalog_mgr_.Destroy();
91 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
102 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
112 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
118 const std::string parent_path = std::strchr(rel_path.
c_str(),
'/')
129 uint64_t nested_size;
130 const bool found = new_catalog_mgr->LookupNested(
131 path, &mountpoint, &nested_hash, &nested_size);
132 if (!found || !nested_size) {
134 "CatalogMergeTool - nested catalog %s not found. Aborting",
137 output_catalog_mgr_->GraftNestedCatalog(rel_path.
ToString(), nested_hash,
141 output_catalog_mgr_->AddDirectory(entry, xattrs, parent_path);
143 perf::Inc(counters_->n_directories_added);
152 output_catalog_mgr_->AddChunkedFile(*base_entry, xattrs, parent_path,
155 output_catalog_mgr_->AddFile(*base_entry, xattrs, parent_path);
162 perf::Xadd(counters_->sz_added_bytes, static_cast<int64_t>(entry.
size()));
167 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
174 output_catalog_mgr_->RemoveNestedCatalog(std::string(rel_path.
c_str()),
178 output_catalog_mgr_->RemoveDirectory(rel_path.
c_str());
179 perf::Inc(counters_->n_directories_removed);
182 output_catalog_mgr_->RemoveFile(rel_path.
c_str());
185 perf::Inc(counters_->n_symlinks_removed);
190 perf::Xadd(counters_->sz_removed_bytes, static_cast<int64_t>(entry.
size()));
194 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
201 const std::string parent_path = std::strchr(rel_path.
c_str(),
'/')
213 const bool found = new_catalog_mgr->LookupNested(path, &mountpoint,
214 &new_hash, &new_size);
215 if (!found || !new_size) {
217 "CatalogMergeTool - nested catalog %s not found. Aborting",
220 output_catalog_mgr_->SwapNestedCatalog(rel_path.
ToString(), new_hash,
227 output_catalog_mgr_->TouchDirectory(*base_entry, xattrs, rel_path.
c_str());
230 output_catalog_mgr_->CreateNestedCatalog(std::string(rel_path.
c_str()));
233 output_catalog_mgr_->RemoveNestedCatalog(std::string(rel_path.
c_str()));
235 perf::Inc(counters_->n_directories_changed);
239 output_catalog_mgr_->RemoveFile(rel_path.
c_str());
240 output_catalog_mgr_->AddDirectory(entry2, xattrs, parent_path);
242 output_catalog_mgr_->CreateNestedCatalog(std::string(rel_path.
c_str()));
245 perf::Inc(counters_->n_symlinks_removed);
250 static_cast<int64_t>(entry1.
size()));
251 perf::Inc(counters_->n_directories_added);
258 output_catalog_mgr_->RemoveNestedCatalog(std::string(rel_path.
c_str()),
268 output_catalog_mgr_->RemoveDirectory(rel_path.
c_str());
272 output_catalog_mgr_->AddChunkedFile(*base_entry, xattrs, parent_path,
275 output_catalog_mgr_->AddFile(*base_entry, xattrs, parent_path);
278 perf::Inc(counters_->n_directories_removed);
284 perf::Xadd(counters_->sz_added_bytes, static_cast<int64_t>(entry2.
size()));
295 output_catalog_mgr_->RemoveFile(rel_path.
c_str());
298 output_catalog_mgr_->AddChunkedFile(*base_entry, xattrs, parent_path,
301 output_catalog_mgr_->AddFile(*base_entry, xattrs, parent_path);
310 perf::Inc(counters_->n_symlinks_removed);
313 perf::Inc(counters_->n_symlinks_changed);
316 static_cast<int64_t>(entry1.
size()));
317 perf::Xadd(counters_->sz_added_bytes, static_cast<int64_t>(entry2.
size()));
322 template<
typename RwCatalogMgr,
typename RoCatalogMgr>
324 std::string *new_manifest_path) {
325 if (!output_catalog_mgr_->Commit(
false, 0,
manifest_)) {
327 "CatalogMergeTool - Could not commit output catalog");
331 const std::string new_path =
CreateTempPath(temp_dir_prefix_, 0600);
335 "CatalogMergeTool - Could not export new manifest");
338 *new_manifest_path = new_path;
345 #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,...)