Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/XrdChecksum.cc
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,24 @@ int ChecksumManager::Set(const char *lfn, const char *cksname, const char *chksv
return XrdCksManager::Set(pfn.c_str(), cks);
}

int ChecksumManager::Del(const char *lfn, unsigned digests)
{
std::string pfn = this->LFN2PFN(lfn);
auto del_digest = [&](const char *digest_name) {
std::string checksum_name = ATTR_PREFIX;
checksum_name += digest_name;
XrdSysXAttrActive->Del(checksum_name.c_str(), pfn.c_str());
};

if (digests & ChecksumManager::CKSUM) del_digest("CKSUM");
if (digests & ChecksumManager::ADLER32) del_digest("ADLER32");
if (digests & ChecksumManager::CRC32) del_digest("CRC32");
if (digests & ChecksumManager::MD5) del_digest("MD5");
if (digests & ChecksumManager::CVMFS) del_digest("CVMFS");

return 0;
}

int ChecksumManager::Ver( const char *lfn, XrdCksData &Cks)
{
return XrdCksManager::Ver(lfn, Cks);
Expand Down Expand Up @@ -243,4 +261,3 @@ std::string ChecksumManager::LFN2PFN(const char* lfn) {
pfn = pfn_cstr;
return pfn;
}

3 changes: 2 additions & 1 deletion src/XrdChecksum.hh
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ public:

int Set(const char *pfn, const ChecksumState &state);
int Set(const char *pfn, const char *cksname, const char *chksvalue);
int Del(const char *pfn, unsigned digests);


virtual ~ChecksumManager() {}
Expand Down Expand Up @@ -140,4 +141,4 @@ private:



#endif
#endif
23 changes: 18 additions & 5 deletions src/multiuser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,20 +173,33 @@ int MultiuserFile::Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv

ssize_t MultiuserFile::Write(const void *buffer, off_t offset, size_t size)
{
bool checksum_abandoned = false;

if ((offset != m_nextoff) && m_state)
{
std::stringstream ss;
ss << "Out-of-order writes not supported while running checksum. " << m_fname;
ss << "Non-sequential write detected; disabling checksum calculation for " << m_fname;
m_log.Emsg("Write", ss.str().c_str());
return -ENOTSUP;
delete m_state;
m_state = NULL;
Comment on lines +183 to +184
checksum_abandoned = true;
}

auto result = m_wrapped->Write(buffer, offset, size);
if (result >= 0) {m_nextoff += result;}
if (m_state)
if (result >= 0)
{
m_nextoff = offset + result;
}
if (checksum_abandoned && result > 0 && g_checksum_manager)
{
UserSentry sentry(m_client, m_log);
if (sentry.IsValid()) {
g_checksum_manager->Del(m_fname.c_str(), m_digests);
}
}
if (m_state && result > 0)
{
m_state->Update(static_cast<const unsigned char*>(buffer), size);
m_state->Update(static_cast<const unsigned char*>(buffer), static_cast<size_t>(result));
}
return result;
}
Expand Down