From 75484ed717be10a7600dc41a839ada5a20b0d40d Mon Sep 17 00:00:00 2001 From: Eric Cano <Eric.Cano@cern.ch> Date: Fri, 17 Nov 2017 21:55:58 +0100 Subject: [PATCH] Fixed several bugs in creation/fetching of DriveState. They prevented propoer statistics update. --- objectstore/Helpers.cpp | 16 ++++++++++++++-- scheduler/OStoreDB/OStoreDB.cpp | 13 ++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp index d037106d13..eebcd25da4 100644 --- a/objectstore/Helpers.cpp +++ b/objectstore/Helpers.cpp @@ -396,11 +396,12 @@ void Helpers::getLockedAndFetchedDriveState(DriveState& driveState, ScopedExclus RootEntry re(be); re.fetchNoLock(); DriveRegister dr(re.getDriveRegisterAddress(), be); - dr.fetch(); + dr.fetchNoLock(); driveState.setAddress(dr.getDriveAddress(driveName)); driveStateLock.lock(driveState); driveState.fetch(); if (driveState.getOwner() != dr.getAddressIfSet()) { + std::string previouslySeenOwner=driveState.getOwner(); // We have a special case: the drive state is not owned by the // drive register. // As we are lock free, we will re-lock in proper order. @@ -408,12 +409,20 @@ void Helpers::getLockedAndFetchedDriveState(DriveState& driveState, ScopedExclus ScopedExclusiveLock drl(dr); dr.fetch(); // Re-get the state (could have changed). + driveState.resetAddress(); driveState.setAddress(dr.getDriveAddress(driveName)); driveStateLock.lock(driveState); + driveState.fetch(); // We have an exclusive lock on everything. We can now // safely switch the owner of the drive status to the drive register // (there is no other steady state ownership). // return all as we are done. + log::ScopedParamContainer params (lc); + params.add("driveRegisterObject", dr.getAddressIfSet()) + .add("driveStateObject", driveState.getAddressIfSet()) + .add("driveStateCurrentOwner", driveState.getOwner()) + .add("driveStatePreviouslySeenOwner", previouslySeenOwner); + lc.log(log::WARNING, "In Helpers::getLockedAndFetchedDriveState(): unexpected owner for driveState (should be register, will fix it)."); if (driveState.getOwner() != dr.getAddressIfSet()) { driveState.setOwner(dr.getAddressIfSet()); driveState.commit(); @@ -457,12 +466,15 @@ void Helpers::getLockedAndFetchedDriveState(DriveState& driveState, ScopedExclus driveState.setAddress(agentReference.nextId(std::string ("DriveStatus-")+driveName)); driveState.initialize(driveName); agentReference.addToOwnership(driveState.getAddressIfSet(), be); + driveState.setOwner(agentReference.getAgentAddress()); driveState.insert(); dr.setDriveAddress(driveName, driveState.getAddressIfSet()); dr.commit(); - agentReference.removeFromOwnership(driveState.getAddressIfSet(), be); driveStateLock.lock(driveState); driveState.fetch(); + driveState.setOwner(dr.getAddressIfSet()); + driveState.commit(); + agentReference.removeFromOwnership(driveState.getAddressIfSet(), be); return; } } diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp index f820989558..34b385bb29 100644 --- a/scheduler/OStoreDB/OStoreDB.cpp +++ b/scheduler/OStoreDB/OStoreDB.cpp @@ -1183,26 +1183,26 @@ void OStoreDB::updateDriveStatistics(const common::dataStructures::DriveInfo& dr lc, Helpers::CreateIfNeeded::doNotCreate); } catch (cta::exception::Exception & ex) { // The drive is missing in the registry. Nothing to update - return; + return; } driveState = ds.getState(); // Set the parameters that we always set driveState.host = driveInfo.host; driveState.logicalLibrary = driveInfo.logicalLibrary; - + switch (driveState.driveStatus) { case DriveStatus::Transferring: - { + { const time_t timeDifference = inputs.reportTime - driveState.lastUpdateTime; const uint64_t bytesDifference = inputs.bytesTransferred - driveState.bytesTransferredInSession; driveState.lastUpdateTime=inputs.reportTime; driveState.bytesTransferredInSession=inputs.bytesTransferred; driveState.filesTransferredInSession=inputs.filesTransferred; driveState.latestBandwidth = timeDifference?1.0*bytesDifference/timeDifference:0.0; - } - break; + break; + } default: - return ; + return; } ds.setState(driveState); ds.commit(); @@ -2823,4 +2823,3 @@ void OStoreDB::RetrieveJob::checkSucceed() { } // namespace cta - -- GitLab