Skip to content

Commit 432e2ff

Browse files
committed
MGM,FST: Users can specify a checksum type alongside with the checksum of the file to be transferred
This can be done by appending eos.checksumtype=<ckstype> to the opaque query of the destination file (eos.checksum=<cksum> must be provided as well). If the ckstype passed in the opaque does not match any supported checksum algorithm, the transfer will fail with EINVAL Fixes EOS-6447
1 parent 46012c5 commit 432e2ff

3 files changed

Lines changed: 23 additions & 2 deletions

File tree

fst/XrdFstOfsFile.cc

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2720,6 +2720,7 @@ XrdFstOfsFile::ProcessMixedOpaque()
27202720
using eos::common::FileId;
27212721
// Handle checksum request
27222722
std::string opaqueCheckSum;
2723+
std::string opaqueCheckSumTypeReq;
27232724
char* val = nullptr;
27242725

27252726
if (mOpenOpaque == nullptr || mCapOpaque == nullptr) {
@@ -2734,8 +2735,18 @@ XrdFstOfsFile::ProcessMixedOpaque()
27342735
// Call the checksum factory function with the selected layout
27352736
if (opaqueCheckSum != "ignore") {
27362737
mCheckSum = eos::fst::ChecksumPlugins::GetChecksumObject(mLid);
2737-
eos_debug("msg=\"checksum requested\" xs_ptr=%p lid=%u mgm.checksum=\"%s\"",
2738-
mCheckSum.get(), mLid, opaqueCheckSum.c_str());
2738+
if(!opaqueCheckSum.empty() && (val = mOpenOpaque->Get("mgm.checksumtypereq"))) {
2739+
// the mgm.checksum has been set and the user requested a checksum type
2740+
opaqueCheckSumTypeReq = val;
2741+
mCheckSum = eos::fst::ChecksumPlugins::GetXsObj(opaqueCheckSumTypeReq);
2742+
if(!mCheckSum) {
2743+
// The checksum type was requested but does not exist, return an error to the client instead of copying the file without the checksum check
2744+
return gOFS.Emsg(epname, error, EINVAL,
2745+
"open - the checksum type requested does not exist", opaqueCheckSumTypeReq.c_str());
2746+
}
2747+
}
2748+
eos_debug("msg=\"checksum requested\" xs_ptr=%p lid=%u mgm.checksum=\"%s\" mgm.checksumtypereq=\"%s\"",
2749+
mCheckSum.get(), mLid, opaqueCheckSum.c_str(), opaqueCheckSumTypeReq.c_str());
27392750
}
27402751

27412752
// Handle file system id and local prefix - If we open a replica we have to

mgm/XrdMgmOfsFile.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3361,6 +3361,12 @@ XrdMgmOfsFile::open(eos::common::VirtualIdentity* invid,
33613361
if (openOpaque->Get("eos.checksum") || openOpaque->Get("eos.cloneid")) {
33623362
redirectionhost += "&mgm.checksum=";
33633363
redirectionhost += openOpaque->Get("eos.checksum");
3364+
3365+
if(openOpaque->Get("eos.checksumtype")) {
3366+
// User sets the checksum type corresponding to the eos.checksum specified
3367+
redirectionhost += "&mgm.checksumtypereq=";
3368+
redirectionhost += openOpaque->Get("eos.checksumtype");
3369+
}
33643370
}
33653371

33663372
if (openOpaque->Get("eos.mtime")) {

test/eos-instance-test

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,10 @@ runtest "### downrnd " unix 0 "" downloadrandom /eos/$EOS_TEST_INSTANCE/test/
778778
runtest "### Rem " unix 2 "" eos rm "/eos/$EOS_TEST_INSTANCE/test/instancetest/holes"
779779
# --------------------------
780780
runtest "### Attr " unix 0 "" eos attr set sys.forced.checksum=adler /eos/$EOS_TEST_INSTANCE/test/instancetest/
781+
runtest "### UploadCks " unix 0 "" upload "$TESTSYSFILE1K" "/eos/$EOS_TEST_INSTANCE/test/instancetest/faulty-checksum1k" "-ODeos.checksum="
782+
runtest "### UploadCks " unix 0 "" upload "$TESTSYSFILE1K" "/eos/$EOS_TEST_INSTANCE/test/instancetest/faulty-checksum1k" "-ODeos.checksum=$CKS1K\&eos.checksumtype=adler"
783+
runtest "### UploadCks " unix 1 "" upload "$TESTSYSFILE1K" "/eos/$EOS_TEST_INSTANCE/test/instancetest/faulty-checksum1k" "-ODeos.checksum=bliblablo\&eos.checksumtype=adler"
784+
runtest "### UploadCks " unix 1 "" upload "$TESTSYSFILE1K" "/eos/$EOS_TEST_INSTANCE/test/instancetest/faulty-checksum1k" "-ODeos.checksum=$CKS1K\&eos.checksumtype=does_not_exist"
781785
runtest "### UploadCks " unix 0 "" upload "$TESTSYSFILE1K" "/eos/$EOS_TEST_INSTANCE/test/instancetest/faulty-checksum1k" "-ODeos.checksum=$CKS1K"
782786
runtest "### FileInfo " unix 0 "" eos fileinfo "/eos/$EOS_TEST_INSTANCE/test/instancetest/faulty-checksum1k -m | grep nrep=1"
783787
runtest "### UploadCks " unix 0 "" upload "$TESTSYSFILE0K" "/eos/$EOS_TEST_INSTANCE/test/instancetest/good-checksum0k" "-ODeos.checksum=00000001"

0 commit comments

Comments
 (0)