From b5edf41e068a77a9e056b0db4543508ca6216ec6 Mon Sep 17 00:00:00 2001 From: MJ Harvey Date: Mon, 25 Apr 2022 10:52:47 -0500 Subject: [PATCH 1/3] Add user.external_url xattr --- cvmfs/magic_xattr.cc | 20 ++++++++++++++++++++ cvmfs/magic_xattr.h | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/cvmfs/magic_xattr.cc b/cvmfs/magic_xattr.cc index f8d3786a69..a3f98e66ba 100644 --- a/cvmfs/magic_xattr.cc +++ b/cvmfs/magic_xattr.cc @@ -64,6 +64,7 @@ MagicXattrManager::MagicXattrManager(MountPoint *mountpoint, Register("xfsroot.rawlink", new RawlinkMagicXattr()); Register("user.authz", new AuthzMagicXattr()); + Register("user.external_url", new ExternalURLMagicXattr()); } std::string MagicXattrManager::GetListString(catalog::DirectoryEntry *dirent) { @@ -547,3 +548,22 @@ std::string UsedDirPMagicXattr::GetValue() { std::string VersionMagicXattr::GetValue() { return std::string(VERSION) + "." + std::string(CVMFS_PATCH_LEVEL); } + +std::string ExternalURLMagicXattr::GetValue() { + std::vector host_chain; + std::vector rtt; + unsigned current_host; + mount_point_->external_download_mgr()->GetHostInfo( + &host_chain, &rtt, ¤t_host); + if (host_chain.size()) { + return std::string(host_chain[current_host]) + std::string(path_.c_str()); + } else { + return std::string(""); + } +} + +bool ExternalURLMagicXattr::PrepareValueFenced() { + return dirent_->IsRegular() && dirent_->IsExternalFile(); +} + + diff --git a/cvmfs/magic_xattr.h b/cvmfs/magic_xattr.h index 8502ec6662..86fc5f51f9 100644 --- a/cvmfs/magic_xattr.h +++ b/cvmfs/magic_xattr.h @@ -363,4 +363,9 @@ class VersionMagicXattr : public BaseMagicXattr { virtual std::string GetValue(); }; +class ExternalURLMagicXattr : public BaseMagicXattr { + virtual bool PrepareValueFenced(); + virtual std::string GetValue(); +}; + #endif // CVMFS_MAGIC_XATTR_H_ From 84b590a6298b4c232260012e9d1e1ac8f9ca7b87 Mon Sep 17 00:00:00 2001 From: HereThereBeDragons Date: Fri, 11 Nov 2022 18:02:16 +0100 Subject: [PATCH 2/3] NULL check and extending test 615 --- cvmfs/magic_xattr.cc | 10 ++++++---- test/src/615-externaldata/main | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/cvmfs/magic_xattr.cc b/cvmfs/magic_xattr.cc index a3f98e66ba..5584e35cb6 100644 --- a/cvmfs/magic_xattr.cc +++ b/cvmfs/magic_xattr.cc @@ -553,10 +553,12 @@ std::string ExternalURLMagicXattr::GetValue() { std::vector host_chain; std::vector rtt; unsigned current_host; - mount_point_->external_download_mgr()->GetHostInfo( - &host_chain, &rtt, ¤t_host); - if (host_chain.size()) { - return std::string(host_chain[current_host]) + std::string(path_.c_str()); + if (mount_point_->external_download_mgr() != NULL) { + mount_point_->external_download_mgr()->GetHostInfo( + &host_chain, &rtt, ¤t_host); + if (host_chain.size()) { + return std::string(host_chain[current_host]) + std::string(path_.c_str()); + } } else { return std::string(""); } diff --git a/test/src/615-externaldata/main b/test/src/615-externaldata/main index 7e0f5d89ba..7ccb42f3b7 100644 --- a/test/src/615-externaldata/main +++ b/test/src/615-externaldata/main @@ -7,6 +7,17 @@ is_external_file() { [ x"$(attr -qg external_file "$full_file_path")" = x"1" ] } +has_correct_external_url() { + cvmfs_mntpnt=${1} + external_base=${2} + filename=${3} + + local cvmfs_fullpath=$cvmfs_mntpnt/$filename + local external_fullpath=$external_base/$filename + + [ x"$(attr -qg external_url "$cvmfs_fullpath")" = x"$external_fullpath" ] +} + get_content_hash() { local full_file_path="$1" attr -qg hash "$full_file_path" @@ -159,6 +170,10 @@ cvmfs_run_test() { echo "Chunk count is $chunk_count" return 28 fi + if ! has_correct_external_url ${cvmfs_mnt} $external_http_base chunked_file ; then + echo "External URL of chunked file points to the wrong place." + return 29 + fi # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # @@ -221,7 +236,8 @@ cvmfs_run_test() { ############################################################################## # This part has to be second last - + + echo "*** Cleanup: Remove files" start_transaction $CVMFS_TEST_REPO || return $? is_external_file ${cvmfs_mnt}/external/file || return 90 is_external_file ${cvmfs_mnt}/chunked_file || return 90 From f15edf38fd211904f85ee2acef8877351811a852 Mon Sep 17 00:00:00 2001 From: HereThereBeDragons Date: Thu, 24 Nov 2022 14:05:59 +0100 Subject: [PATCH 3/3] add test 615 to quick suite --- test/src/615-externaldata/main | 1 + 1 file changed, 1 insertion(+) diff --git a/test/src/615-externaldata/main b/test/src/615-externaldata/main index 7ccb42f3b7..a0a9313395 100644 --- a/test/src/615-externaldata/main +++ b/test/src/615-externaldata/main @@ -1,6 +1,7 @@ cvmfs_test_name="External data" cvmfs_test_autofs_on_startup=false +cvmfs_test_suites="quick" is_external_file() { local full_file_path="$1"